Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Очистка ячейки при изменении значения в другой. - Мир MS Excel

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Очистка ячейки при изменении значения в другой.
votangi59 Дата: Четверг, 06.03.2025, 19:11 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Условие: два диапазона на одном листе, Range(A1:A20) и Range(B1:B20)
Задача: очистка ячейки во втором диапазоне (B1:B20) при изменении значения в соответствующей ячейке (в той же строке) первого диапазона (A1:A20).
Помогите пожалуйста. В поиске ответа не нашёл.


Сообщение отредактировал votangi59 - Четверг, 06.03.2025, 19:18
 
Ответить
СообщениеУсловие: два диапазона на одном листе, Range(A1:A20) и Range(B1:B20)
Задача: очистка ячейки во втором диапазоне (B1:B20) при изменении значения в соответствующей ячейке (в той же строке) первого диапазона (A1:A20).
Помогите пожалуйста. В поиске ответа не нашёл.

Автор - votangi59
Дата добавления - 06.03.2025 в 19:11
i691198 Дата: Четверг, 06.03.2025, 22:23 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

Добрый вечер. Вставьте в модуль этого листа (именно в модуль листа, а не в общий модуль) такой код.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("A1:A20"), Target) Is Nothing Then
   Target.Offset(, 1).ClearContents
End If
End Sub
[/vba]
 
Ответить
СообщениеДобрый вечер. Вставьте в модуль этого листа (именно в модуль листа, а не в общий модуль) такой код.
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("A1:A20"), Target) Is Nothing Then
   Target.Offset(, 1).ClearContents
End If
End Sub
[/vba]

Автор - i691198
Дата добавления - 06.03.2025 в 22:23
votangi59 Дата: Пятница, 07.03.2025, 09:07 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Приветствую, i691198.
Благодарю, ваш код работает, НО, извините, я, по незнанию и неопытности, не корректно описал задачу.
Дело в том, что в диапазон A1:A20 данные не вводятся, а подтягиваются путём копирования из диапазона находящегося на другом листе.
В диапазоне на другом листе и происходят изменения. Т.е в диапазоне A1:A20, при изменении данных не происходит нажатие кнопки ввода (Enter).
К сожалению, по объективным причинам, не имею возможности приложить файл.
Попробую по-другому изложить суть вопроса.
На Лист1 имеется куча комбобоксов (в одном столбце), при выборе значения в списке любого комбобокса, меняется значение в привязанной к нему ячейке.
Из этих ячеек, привязанных к комбобоксам, т.е. диапазона, по формуле, автоматом, данные копируются в столбец на другом листе (Лист2). Во втором столбце на Лист2 имеются вводимые в ручную данные, вот эти данные и следует обнулять, при изменении значения в первом столбце листа2, в который скопированы значения из Лист1, в котором комбобоксы.
То есть по сути, требуется, что бы при изменении значения в любом комбобоксе на одном листе, очищалась соответствующая ячейка на другом листе.
Надеюсь, теперь правильно сформулировал вопрос.
 
Ответить
СообщениеПриветствую, i691198.
Благодарю, ваш код работает, НО, извините, я, по незнанию и неопытности, не корректно описал задачу.
Дело в том, что в диапазон A1:A20 данные не вводятся, а подтягиваются путём копирования из диапазона находящегося на другом листе.
В диапазоне на другом листе и происходят изменения. Т.е в диапазоне A1:A20, при изменении данных не происходит нажатие кнопки ввода (Enter).
К сожалению, по объективным причинам, не имею возможности приложить файл.
Попробую по-другому изложить суть вопроса.
На Лист1 имеется куча комбобоксов (в одном столбце), при выборе значения в списке любого комбобокса, меняется значение в привязанной к нему ячейке.
Из этих ячеек, привязанных к комбобоксам, т.е. диапазона, по формуле, автоматом, данные копируются в столбец на другом листе (Лист2). Во втором столбце на Лист2 имеются вводимые в ручную данные, вот эти данные и следует обнулять, при изменении значения в первом столбце листа2, в который скопированы значения из Лист1, в котором комбобоксы.
То есть по сути, требуется, что бы при изменении значения в любом комбобоксе на одном листе, очищалась соответствующая ячейка на другом листе.
Надеюсь, теперь правильно сформулировал вопрос.

Автор - votangi59
Дата добавления - 07.03.2025 в 09:07
i691198 Дата: Пятница, 07.03.2025, 20:09 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

Добрый вечер. Если нужно отследить изменение данных формулами, то это немного сложнее. Например так.
1. Создаем общий модуль и в нем объявляем глобальную переменную [vba]
Код
Public Carr()
[/vba] - это контрольный массив.
2. В модуль книги вставляем код [vba]
Код
Private Sub Workbook_Open()
  Carr = Sheets("Лист2").Range("A1:A20").Value
End Sub
[/vba] - при открытии книги копируем в контрольный массив значения из первого столбца листа 2.
3. В модуль листа 2 вставляем код [vba]
Код
Private Sub Worksheet_Calculate()
  Dim Ar1, i%, Flag As Boolean
  Ar1 = Range("A1:A20")
  Flag = False
  For i = 1 To 20
    If Ar1(i, 1) <> Carr(i, 1) Then
      Flag = True
      Cells(i, 2).ClearContents
    End If
  Next
  If Flag Then Carr = Range("A1:A20")
End Sub
[/vba] - если на листе произошел пересчет каких то формул, то сравниваем значения первого столбца со значениями контрольного массива.
Если в каких то строках есть несовпадения, то удаляем значения во втором столбце. При наличии изменений в первом столбце, опять копируем его в контрольный массив. И так далее.


Сообщение отредактировал i691198 - Пятница, 07.03.2025, 20:11
 
Ответить
СообщениеДобрый вечер. Если нужно отследить изменение данных формулами, то это немного сложнее. Например так.
1. Создаем общий модуль и в нем объявляем глобальную переменную [vba]
Код
Public Carr()
[/vba] - это контрольный массив.
2. В модуль книги вставляем код [vba]
Код
Private Sub Workbook_Open()
  Carr = Sheets("Лист2").Range("A1:A20").Value
End Sub
[/vba] - при открытии книги копируем в контрольный массив значения из первого столбца листа 2.
3. В модуль листа 2 вставляем код [vba]
Код
Private Sub Worksheet_Calculate()
  Dim Ar1, i%, Flag As Boolean
  Ar1 = Range("A1:A20")
  Flag = False
  For i = 1 To 20
    If Ar1(i, 1) <> Carr(i, 1) Then
      Flag = True
      Cells(i, 2).ClearContents
    End If
  Next
  If Flag Then Carr = Range("A1:A20")
End Sub
[/vba] - если на листе произошел пересчет каких то формул, то сравниваем значения первого столбца со значениями контрольного массива.
Если в каких то строках есть несовпадения, то удаляем значения во втором столбце. При наличии изменений в первом столбце, опять копируем его в контрольный массив. И так далее.

Автор - i691198
Дата добавления - 07.03.2025 в 20:09
votangi59 Дата: Пятница, 07.03.2025, 22:10 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Благодарю, i691198. Извините, неважный из меня повествователь.
Изменю предыдущий текст: "...Из этих ячеек, привязанных к комбобоксам, т.е. диапазона, по формуле, автоматом, данные копируются в столбец на другом листе (Лист2)."
Формул нету, копирование элементарное, в ячейку А1 листа 2 прописывается: " =Лист1!$А1 ", т.е. из ячейки привязанной к комбобоксу на листе 1, копируются данные в столбец "А" на листе2. На листе2 второй столбец, допустим " В " - в нём, в ручную, задаётся значение, это значение должно обнуляться (ячейка очищается) при изменении в столбце "А" этого же листа.
Скрин схему сделал, может так понятнее будет что требуется.
К сообщению приложен файл: 1631454.jpg (26.6 Kb)
 
Ответить
СообщениеБлагодарю, i691198. Извините, неважный из меня повествователь.
Изменю предыдущий текст: "...Из этих ячеек, привязанных к комбобоксам, т.е. диапазона, по формуле, автоматом, данные копируются в столбец на другом листе (Лист2)."
Формул нету, копирование элементарное, в ячейку А1 листа 2 прописывается: " =Лист1!$А1 ", т.е. из ячейки привязанной к комбобоксу на листе 1, копируются данные в столбец "А" на листе2. На листе2 второй столбец, допустим " В " - в нём, в ручную, задаётся значение, это значение должно обнуляться (ячейка очищается) при изменении в столбце "А" этого же листа.
Скрин схему сделал, может так понятнее будет что требуется.

Автор - votangi59
Дата добавления - 07.03.2025 в 22:10
i691198 Дата: Суббота, 08.03.2025, 10:36 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

Формул нету
Я вас наверное удивлю, но выражение =Лист1!$А1 это именно формула.
Так что можете пробовать способ, который я предложил выше. Немного еще поясню. В моем примере сделана жесткая привязка к диапазону A1:A20, а значения удаляются в диапазоне B1:B20. Коды простые, при необходимости можете сами подправить адреса диапазонов.
И еще один важный момент - после того как вставите эти коды сразу же сохраните, закройте и снова откройте этот файл, иначе будет работать неправильно.
 
Ответить
Сообщение
Формул нету
Я вас наверное удивлю, но выражение =Лист1!$А1 это именно формула.
Так что можете пробовать способ, который я предложил выше. Немного еще поясню. В моем примере сделана жесткая привязка к диапазону A1:A20, а значения удаляются в диапазоне B1:B20. Коды простые, при необходимости можете сами подправить адреса диапазонов.
И еще один важный момент - после того как вставите эти коды сразу же сохраните, закройте и снова откройте этот файл, иначе будет работать неправильно.

Автор - i691198
Дата добавления - 08.03.2025 в 10:36
votangi59 Дата: Суббота, 08.03.2025, 11:14 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Приветствую, i691198.
Спасибо, что уделяете мне внимание. Я совсем недавно в VBA.
Если б я знал как это сделать: "1. Создаем общий модуль и в нем объявляем глобальную переменную". ))
1. Правильно ли будет так:
VBAProject... - Modules - пкм - Insert - Module
Открыть окно с созданным модулем, вставить единственную строку:
[vba]
Код
Public Carr()
[/vba]
2. В модуле книги у меня уже есть код:
[vba]
Код
Option Explicit
---------------------------
Private Sub Workbook_Open()
    InitComboHandlers
End Sub
[/vba]
возможно ли в него добавить ваш код? Или необходимо создать ещё модуль?
С остальным мне понятно, конечно диапазоны поменяю.


Сообщение отредактировал votangi59 - Суббота, 08.03.2025, 11:17
 
Ответить
СообщениеПриветствую, i691198.
Спасибо, что уделяете мне внимание. Я совсем недавно в VBA.
Если б я знал как это сделать: "1. Создаем общий модуль и в нем объявляем глобальную переменную". ))
1. Правильно ли будет так:
VBAProject... - Modules - пкм - Insert - Module
Открыть окно с созданным модулем, вставить единственную строку:
[vba]
Код
Public Carr()
[/vba]
2. В модуле книги у меня уже есть код:
[vba]
Код
Option Explicit
---------------------------
Private Sub Workbook_Open()
    InitComboHandlers
End Sub
[/vba]
возможно ли в него добавить ваш код? Или необходимо создать ещё модуль?
С остальным мне понятно, конечно диапазоны поменяю.

Автор - votangi59
Дата добавления - 08.03.2025 в 11:14
i691198 Дата: Суббота, 08.03.2025, 12:01 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

вставить единственную строку
Все правильно.
Или необходимо создать ещё модуль?
Это не получится, такой модуль может быть только один и он уже имеется для каждого листа. И процедура по событию Workbook_Open может быть только одна для каждого листа, так что просто добавьте в нее строку Carr = Sheets("Лист2").Range("A1:A20").Value.
 
Ответить
Сообщение
вставить единственную строку
Все правильно.
Или необходимо создать ещё модуль?
Это не получится, такой модуль может быть только один и он уже имеется для каждого листа. И процедура по событию Workbook_Open может быть только одна для каждого листа, так что просто добавьте в нее строку Carr = Sheets("Лист2").Range("A1:A20").Value.

Автор - i691198
Дата добавления - 08.03.2025 в 12:01
votangi59 Дата: Суббота, 08.03.2025, 12:09 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Благодарю. Буду пробовать.
 
Ответить
СообщениеБлагодарю. Буду пробовать.

Автор - votangi59
Дата добавления - 08.03.2025 в 12:09
votangi59 Дата: Суббота, 08.03.2025, 16:47 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Уважаемый i691198, что-то у меня не получается.
По разному пробовал, вываливается ошибка - Subscript out of range.
Привожу код после адаптации к моим условиям:
[vba]
Код
Option Explicit
-----------------------------
Private Sub Workbook_Open()
    InitComboHandlers
    Carr = Sheets("Бл_кол-ва").Range("F7:F38").Value    ' запомнили что было, имя листа и диапазон
End Sub
[/vba]
[vba]
Код
' Лист "Бл_кол-ва", где требуется проверка на изменение данных и их удаление при изменении
Private Sub Worksheet_Calculate()
    Dim Ar1, i%, Flag As Boolean       ' что означает символ "%" ?
        Ar1 = Range("F7:F38")          ' диапазон отслеживания изменений
        Flag = False
For i = 1 To 31                        ' пробовал ставить строки For i = 7 To 38
    If Ar1(i, 1) <> Carr(i, 1) Then    ' сравниваем, ОШИБКА: "Subscript out of range". Пробовал вместо "1" ставить столбец- "F" т.е. "6"
        Flag = True
        Cells(i, 10).ClearContents     ' 10-й столбец, где обнуляем при изменениях
    End If
Next
    If Flag Then Carr = Range("F7:F38")  ' здесь не понятно, какое условие? Если Flag ? То запомнили что стало
End Sub
[/vba]
Подскажите, пожалуйста, в чём ошибка?


Сообщение отредактировал votangi59 - Воскресенье, 09.03.2025, 05:00
 
Ответить
СообщениеУважаемый i691198, что-то у меня не получается.
По разному пробовал, вываливается ошибка - Subscript out of range.
Привожу код после адаптации к моим условиям:
[vba]
Код
Option Explicit
-----------------------------
Private Sub Workbook_Open()
    InitComboHandlers
    Carr = Sheets("Бл_кол-ва").Range("F7:F38").Value    ' запомнили что было, имя листа и диапазон
End Sub
[/vba]
[vba]
Код
' Лист "Бл_кол-ва", где требуется проверка на изменение данных и их удаление при изменении
Private Sub Worksheet_Calculate()
    Dim Ar1, i%, Flag As Boolean       ' что означает символ "%" ?
        Ar1 = Range("F7:F38")          ' диапазон отслеживания изменений
        Flag = False
For i = 1 To 31                        ' пробовал ставить строки For i = 7 To 38
    If Ar1(i, 1) <> Carr(i, 1) Then    ' сравниваем, ОШИБКА: "Subscript out of range". Пробовал вместо "1" ставить столбец- "F" т.е. "6"
        Flag = True
        Cells(i, 10).ClearContents     ' 10-й столбец, где обнуляем при изменениях
    End If
Next
    If Flag Then Carr = Range("F7:F38")  ' здесь не понятно, какое условие? Если Flag ? То запомнили что стало
End Sub
[/vba]
Подскажите, пожалуйста, в чём ошибка?

Автор - votangi59
Дата добавления - 08.03.2025 в 16:47
i691198 Дата: Воскресенье, 09.03.2025, 10:53 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

Добрый день. Есть две ошибки -
1. В массивах по 32 элемента, значит и цикл должен быть For i = 1 To 32.
2. Переменная цикла i начинается с 1, а значения в 10 столбце нужно стирать начиная с 7 строки, соответствующая строка должна быть такая Cells(i+6, 10).ClearContents
Если не забывать сохранять, закрывать и снова открывать файл, то все должно работать.
Пояснения:
- i% это сокращенный вариант объявления переменной i as Integer
- переменная Flag логическая, если изменились значения в диапазоне F7:F38 то она меняет значение с False на True, значит нужно переписать контрольный массив на текущие значения. (у вас на листе могут быть и другие формулы и при их пересчете обновлять контрольный массив не требуется). Для наглядности можно условие в операторе If записать так If Flag = True Then . . . , хотя смысла в этом нет.


Сообщение отредактировал i691198 - Воскресенье, 09.03.2025, 10:53
 
Ответить
СообщениеДобрый день. Есть две ошибки -
1. В массивах по 32 элемента, значит и цикл должен быть For i = 1 To 32.
2. Переменная цикла i начинается с 1, а значения в 10 столбце нужно стирать начиная с 7 строки, соответствующая строка должна быть такая Cells(i+6, 10).ClearContents
Если не забывать сохранять, закрывать и снова открывать файл, то все должно работать.
Пояснения:
- i% это сокращенный вариант объявления переменной i as Integer
- переменная Flag логическая, если изменились значения в диапазоне F7:F38 то она меняет значение с False на True, значит нужно переписать контрольный массив на текущие значения. (у вас на листе могут быть и другие формулы и при их пересчете обновлять контрольный массив не требуется). Для наглядности можно условие в операторе If записать так If Flag = True Then . . . , хотя смысла в этом нет.

Автор - i691198
Дата добавления - 09.03.2025 в 10:53
votangi59 Дата: Воскресенье, 09.03.2025, 13:34 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

i691198, огромное спасибо!
Благодарю за разъяснение. Буду пробовать.
О результатах отпишусь.


Сообщение отредактировал votangi59 - Воскресенье, 09.03.2025, 13:35
 
Ответить
Сообщениеi691198, огромное спасибо!
Благодарю за разъяснение. Буду пробовать.
О результатах отпишусь.

Автор - votangi59
Дата добавления - 09.03.2025 в 13:34
votangi59 Дата: Понедельник, 10.03.2025, 07:16 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Приветствую,i691198, а так же всех, кто посетил эту тему!
i691198, всё прекрасно работает, получилось, и именно так, как требовалось.
i691198, премного благодарен за неоценимую помощь! А то я уже начал выдумывать другие пути реализации задуманного.
Огромное спасибо за науку! Удачи во всех делах!

Вопрос решён положительно. Тема закрыта.
 
Ответить
СообщениеПриветствую,i691198, а так же всех, кто посетил эту тему!
i691198, всё прекрасно работает, получилось, и именно так, как требовалось.
i691198, премного благодарен за неоценимую помощь! А то я уже начал выдумывать другие пути реализации задуманного.
Огромное спасибо за науку! Удачи во всех делах!

Вопрос решён положительно. Тема закрыта.

Автор - votangi59
Дата добавления - 10.03.2025 в 07:16
votangi59 Дата: Вторник, 18.03.2025, 09:54 | Сообщение № 14
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Здравствуйте, форумчане.
Пришлось вновь вернуться к этой теме.
Может кто-нибудь подсказать, нельзя ли обойтись, в выше приведённом коде, без кода в модуле книги?
[vba]
Код
Option Explicit
    ----------------------    
    Private Sub Workbook_Open()
         Carr = Sheets("Бл_кол-ва").Range("F7:F38").Value
    End Sub
[/vba]
Нельзя ли объявить переменную "Carr" другим способом?


Сообщение отредактировал votangi59 - Вторник, 18.03.2025, 09:55
 
Ответить
СообщениеЗдравствуйте, форумчане.
Пришлось вновь вернуться к этой теме.
Может кто-нибудь подсказать, нельзя ли обойтись, в выше приведённом коде, без кода в модуле книги?
[vba]
Код
Option Explicit
    ----------------------    
    Private Sub Workbook_Open()
         Carr = Sheets("Бл_кол-ва").Range("F7:F38").Value
    End Sub
[/vba]
Нельзя ли объявить переменную "Carr" другим способом?

Автор - votangi59
Дата добавления - 18.03.2025 в 09:54
i691198 Дата: Вторник, 18.03.2025, 10:30 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 384
Репутация: 118 ±
Замечаний: 0% ±

votangi59, Здравствуйте. Вы бы пояснили почему вас не устраивает такой вариант.
 
Ответить
Сообщениеvotangi59, Здравствуйте. Вы бы пояснили почему вас не устраивает такой вариант.

Автор - i691198
Дата добавления - 18.03.2025 в 10:30
votangi59 Дата: Вторник, 18.03.2025, 16:20 | Сообщение № 16
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Приветствую, i691198!
Меня всё устраивает, ваш код прекрасно работает! Но есть одно "но".
Файл работает в "чистом" Экселе. Дело в том, что я, для защиты экселевских файлов от несанкционированного доступа, использую некоторый софт. Возможно знакомы, или слышали о программе "LockXLS" - прога защищает файлы экселя с кучей возможностей. Так вот, после защиты файла, эксель тупо крашется при старте. Версии файлов, без кодов отслеживания изменений, функционируют нормально. Пробовал защищать в двух версиях "LockXLS" - результат один. Этим софтом защитил не один файл - опыт имею.
Методом научного тыка, путём неоднократного изменения (блокирования) в оригинальном файле кодов, связанных с сравнением данных, выяснил, что именно запись в модуле книги вешает эксель при открытии файла.
Ознакомившись с материалами по объявлению переменных, попробовал сам исправить ситуацию, не получилось. Маловато знаний.
И спасибо вам за наводку на "учебник".


Сообщение отредактировал votangi59 - Вторник, 18.03.2025, 16:26
 
Ответить
СообщениеПриветствую, i691198!
Меня всё устраивает, ваш код прекрасно работает! Но есть одно "но".
Файл работает в "чистом" Экселе. Дело в том, что я, для защиты экселевских файлов от несанкционированного доступа, использую некоторый софт. Возможно знакомы, или слышали о программе "LockXLS" - прога защищает файлы экселя с кучей возможностей. Так вот, после защиты файла, эксель тупо крашется при старте. Версии файлов, без кодов отслеживания изменений, функционируют нормально. Пробовал защищать в двух версиях "LockXLS" - результат один. Этим софтом защитил не один файл - опыт имею.
Методом научного тыка, путём неоднократного изменения (блокирования) в оригинальном файле кодов, связанных с сравнением данных, выяснил, что именно запись в модуле книги вешает эксель при открытии файла.
Ознакомившись с материалами по объявлению переменных, попробовал сам исправить ситуацию, не получилось. Маловато знаний.
И спасибо вам за наводку на "учебник".

Автор - votangi59
Дата добавления - 18.03.2025 в 16:20
votangi59 Дата: Среда, 19.03.2025, 06:43 | Сообщение № 17
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Добавлю уточнение. Переходы с листа на лист осуществляются посредством кнопок ActiveX. Кнопки привязаны к макросам.
Полагаю, к этим событиям, перехода, можно как-то и привязать сравнение, изменение диапазонов (что было, что стало) и как следствие очистка ячеек в третьем диапазоне при несовпадении строк в двух первых.
Пытаюсь сам реализовать идею, но плохо знаком с необходимыми операциями.
 
Ответить
СообщениеДобавлю уточнение. Переходы с листа на лист осуществляются посредством кнопок ActiveX. Кнопки привязаны к макросам.
Полагаю, к этим событиям, перехода, можно как-то и привязать сравнение, изменение диапазонов (что было, что стало) и как следствие очистка ячеек в третьем диапазоне при несовпадении строк в двух первых.
Пытаюсь сам реализовать идею, но плохо знаком с необходимыми операциями.

Автор - votangi59
Дата добавления - 19.03.2025 в 06:43
_Boroda_ Дата: Среда, 19.03.2025, 09:36 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 16852
Репутация: 6570 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Попробуйте привязать на событие
Private Sub Worksheet_Activate()
в том листе, где комбобоксы
Если значения для листа "Бл_кол-ва" меняются еще из какого-нибудь листа, то привяжите и на него

А можно вообще без массива. Насколько я понял, у Вас каждой ячейке лист2 соответствует ячейка на лист1, которой соответствует свой комбобокс. Причем, ссылки между лист2 и лист1 прямые, типа =Лист1!$А1, без всякий сложных взаимосвязей.
Тогда можно просто к каждому комбобоксу прописать код, стирающий соответствующую ячейку на лист2 (можно один код на все комбы, чтобы он сам определял, что нажато, но это сложнее для понимания).
Или можно привязаться к изменениям на лист1. Что-то типа самого первого макроса в этой теме, но диапазоны на разных листах

А вообще - давно бы сделали пример файла и положили сюда. Все было бы гораздо проще и быстрее. В примере нужно просто несколько комбобоксов с РЕАЛЬНЫМ расположением на лист1 и реальные формулы на лист2. Все данные можно заменить на огурцы-помидоры-кабачки


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПопробуйте привязать на событие
Private Sub Worksheet_Activate()
в том листе, где комбобоксы
Если значения для листа "Бл_кол-ва" меняются еще из какого-нибудь листа, то привяжите и на него

А можно вообще без массива. Насколько я понял, у Вас каждой ячейке лист2 соответствует ячейка на лист1, которой соответствует свой комбобокс. Причем, ссылки между лист2 и лист1 прямые, типа =Лист1!$А1, без всякий сложных взаимосвязей.
Тогда можно просто к каждому комбобоксу прописать код, стирающий соответствующую ячейку на лист2 (можно один код на все комбы, чтобы он сам определял, что нажато, но это сложнее для понимания).
Или можно привязаться к изменениям на лист1. Что-то типа самого первого макроса в этой теме, но диапазоны на разных листах

А вообще - давно бы сделали пример файла и положили сюда. Все было бы гораздо проще и быстрее. В примере нужно просто несколько комбобоксов с РЕАЛЬНЫМ расположением на лист1 и реальные формулы на лист2. Все данные можно заменить на огурцы-помидоры-кабачки

Автор - _Boroda_
Дата добавления - 19.03.2025 в 09:36
votangi59 Дата: Среда, 19.03.2025, 14:00 | Сообщение № 19
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Приветствую, _Boroda_!
Да, именноно так, вы всё правильно поняли:
Цитата
... у Вас каждой ячейке лист2 соответствует ячейка на лист1, которой соответствует свой комбобокс. Причем, ссылки между лист2 и лист1 прямые, типа =Лист1!$А1, без всякий сложных взаимосвязей ...

На Лист 1 ещё присутствует сортировка диапазона после выбора в комбобоксах, по двум разным критериям (либо так, либо эдак), это тоже влияет на изменения во втором листе.
Пожалуй вы правы, стоит, всё-таки попробовать выложить файл. Оставить в базе данных 5, 6 строк и вписаться в размер файла для форума. Конечно, можно в архив упаковать, но данные конфиденциальные - прислушаюсь к вашему совету:
Цитата
... заменить на огурцы-помидоры-кабачки ...

Тем более, что у меня сложный, "мудрёный" алгоритм расчёта и код очень далёк от совершенства )) - может и в этом деле форумчане не откажут в помощи, помогут оптимизировать код.
На текущий момент пробую другим способом решить проблему, кое-что получилось - самое главное софт защиты не ругается и не вешает Эксель! Остальное понемногу докручу. Время покажет.
Благодарю за внимание, отзыв и совет. Бум пробовать.
 
Ответить
СообщениеПриветствую, _Boroda_!
Да, именноно так, вы всё правильно поняли:
Цитата
... у Вас каждой ячейке лист2 соответствует ячейка на лист1, которой соответствует свой комбобокс. Причем, ссылки между лист2 и лист1 прямые, типа =Лист1!$А1, без всякий сложных взаимосвязей ...

На Лист 1 ещё присутствует сортировка диапазона после выбора в комбобоксах, по двум разным критериям (либо так, либо эдак), это тоже влияет на изменения во втором листе.
Пожалуй вы правы, стоит, всё-таки попробовать выложить файл. Оставить в базе данных 5, 6 строк и вписаться в размер файла для форума. Конечно, можно в архив упаковать, но данные конфиденциальные - прислушаюсь к вашему совету:
Цитата
... заменить на огурцы-помидоры-кабачки ...

Тем более, что у меня сложный, "мудрёный" алгоритм расчёта и код очень далёк от совершенства )) - может и в этом деле форумчане не откажут в помощи, помогут оптимизировать код.
На текущий момент пробую другим способом решить проблему, кое-что получилось - самое главное софт защиты не ругается и не вешает Эксель! Остальное понемногу докручу. Время покажет.
Благодарю за внимание, отзыв и совет. Бум пробовать.

Автор - votangi59
Дата добавления - 19.03.2025 в 14:00
votangi59 Дата: Среда, 19.03.2025, 19:04 | Сообщение № 20
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 0 ±
Замечаний: 0% ±

Совсем мозги заплёл.
Подскажите, пожалуйста, как надо сделать, чтобы объявить глобальную переменную, которая является диапазоном (или двумерным массивом? как правильно)
Что делаю:
1. В Modules создаю Module1: (объявляю переменную типа String)
[vba]
Код
Option Explicit
Public stMem As String
[/vba]
2. В "Эта книга": (при открытии книги, присваиваю значение ячейки ранее объявленной переменной)
[vba]
Код
Option Explicit
------------------------------------
Private Sub Workbook_Open()
    stMem = Sheets("Бл_кол-ва").Range("F7").Value
    InitComboHandlers   ' Инициализация комбо боксов
End Sub
[/vba]
Работает, но нужно не одну ячейку присвоить, а диапазон "F7:F38". Пробовал так:
[vba]
Код
stMem = Sheets("Бл_кол-ва").Range("F7:F38").Value
[/vba]
- не работает. В чем ошибка?


Сообщение отредактировал votangi59 - Четверг, 20.03.2025, 00:27
 
Ответить
СообщениеСовсем мозги заплёл.
Подскажите, пожалуйста, как надо сделать, чтобы объявить глобальную переменную, которая является диапазоном (или двумерным массивом? как правильно)
Что делаю:
1. В Modules создаю Module1: (объявляю переменную типа String)
[vba]
Код
Option Explicit
Public stMem As String
[/vba]
2. В "Эта книга": (при открытии книги, присваиваю значение ячейки ранее объявленной переменной)
[vba]
Код
Option Explicit
------------------------------------
Private Sub Workbook_Open()
    stMem = Sheets("Бл_кол-ва").Range("F7").Value
    InitComboHandlers   ' Инициализация комбо боксов
End Sub
[/vba]
Работает, но нужно не одну ячейку присвоить, а диапазон "F7:F38". Пробовал так:
[vba]
Код
stMem = Sheets("Бл_кол-ва").Range("F7:F38").Value
[/vba]
- не работает. В чем ошибка?

Автор - votangi59
Дата добавления - 19.03.2025 в 19:04
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!