Событие Change в Microsoft Excel срабатывает при внесении изменений в ячейки рабочего листа. Однако в ряде случаев необходимо фокусироваться на конкретных ячейках или диапазонах. Для этой задачи используется процедура обработки события Worksheet_Change, которая принимает объект Range в качестве параметра.
Предположим, у нас есть именованный диапазон "МойДиапазон" (например, "A1:B10"), и мы хотим отслеживать изменения именно в этом диапазоне. Давайте средствами VBA создадим диапазон.
В данном случае, при каждом переключении на этот лист, диапазон "A1:B10" присваивается имя "МойДиапазон". Это удобно для именования диапазонов один раз при активации листа вместо повторения операции при каждом изменении (естественно диапазоны можно регулировать по вашему усмотрению).
Так как события Change для отдельных объектов Range не предусмотрено, необходимую проверку можно выполнить в начале процедуры Worksheet_Change.
📌 Скачать файл пример, можно в конце статьи.
А теперь давайте разберем код по шагам:
1. Объявление процедуры:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
- Это объявление процедуры Worksheet_Change, которая автоматически выполняется при изменении данных на листе. Параметр Target представляет объект Range, который содержит ячейки, в которых произошли изменения.
2. Определение объекта Range:
Dim МойДиапазон As Excel.Range
Set МойДиапазон = Range("МойДиапазон")
- Создается переменная МойДиапазон типа Excel.Range, которая представляет именованный диапазон с именем "МойДиапазон" на листе (а он у нас уже создан при активации листа). Этот диапазон будет использован для проверки, произошли ли изменения именно в нем.
3. Проверка изменений в диапазоне:
If Not Intersect(Target, МойДиапазон) Is Nothing Then
Используется функция Intersect, чтобы определить, есть ли пересечение между измененными ячейками (Target) и диапазоном МойДиапазон. Если пересечение есть, это означает, что произошли изменения внутри именованного диапазона.
Функция Intersect в VBA используется для определения пересечения между двумя или более диапазонами ячеек. Эта функция возвращает объект Range, представляющий общие ячейки в переданных диапазонах.
4. Вывод сообщения:
MsgBox "Вы внесли изменения в ячейке именованного диапазона."
Если изменения произошли в именованном диапазоне, выводится сообщение с помощью MsgBox, уведомляя пользователя о внесенных изменениях.
5. Дополнительные действия (по желанию):
- ' Можно добавить дополнительные действия, если необходимо
- Закомментированная строка предоставляет место для добавления дополнительных действий, которые могут быть выполнены в случае изменений в именованном диапазоне. Например, вы можете добавить код для автоматического выполнения определенных действий или обновления других частей листа.
Итак подытожим: в данном примере в коде используется объект Range, обозначаемый как "МойДиапазон". Этот объект представляет собой диапазон ячеек на активном листе, подлежащий проверке на наличие внесенных изменений. Процедура использует функцию Intersect из VBA для определения взаимного положения диапазона Target (полученного в качестве атрибута) относительно "МойДиапазон". Функция Intersect возвращает объект, содержащий все ячейки, которые одновременно присутствуют в обоих указанных диапазонах.
Если функция Intersect возвращает значение Nothing, это означает отсутствие общих ячеек между диапазонами. Оператор отрицания Not используется для того, чтобы выражение стало истинным (True) в том случае, когда указанный диапазон имеет хотя бы одну общую ячейку с "МойДиапазон". В таком случае отображается окно сообщения. В противном случае никаких действий не выполняется, и процедура завершает свое выполнение.