Определение адреса ранее выделенной ячейки с помощью кода VBA Excel. Использование статической переменной для сохранения адреса предыдущей активной ячейки.
Сохранение адреса ранее выделенной ячейки
При работе в Excel иногда возникает необходимость отслеживать не только текущую выбранную ячейку, но и ту, которая была выделена ранее. Это может быть полезно при создании интерактивных таблиц, логировании действий пользователя, разработке пользовательских инструментов на VBA.
В Excel есть событие Worksheet_SelectionChange, которое запускается каждый раз, когда пользователь меняет выделение на листе. Используя это событие, можно сохранить адрес предыдущей активной ячейки, чтобы использовать её для текущих вычислений и операций с её свойствами.
Базовый вариант кода
Самый простой способ — использовать статическую переменную типа Range, которая будет хранить ссылку на ранее выделенную ячейку.
|
1 2 3 4 5 6 7 8 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Static PriorCell As Range If Not PriorCell Is Nothing Then Debug.Print "Предыдущая ячейка - " & PriorCell.Address Debug.Print "Текущая ячейка - " & Target.Cells(1).Address & vbNewLine End If Set PriorCell = Target.Cells(1) End Sub |
Комментарии к работе кода:
- Событие
Worksheet_SelectionChangeзапускается при изменении выделения. - Переменная
PriorCellобъявлена какStatic(статическая переменная), поэтому её значение сохраняется между вызовами процедуры. - При каждом изменении выделения:
- в окно Immediate (
Debug.Print) выводится адрес предыдущей ячейки; - выводится адрес текущей ячейки и символ новой строки, чтобы визуально разделить пары адресов.
- в окно Immediate (
- Затем текущая ячейка сохраняется как предыдущая для следующего события.
Метод Target.Cells(1) используется для того, чтобы корректно обработать ситуацию, когда пользователь выделяет диапазон из нескольких ячеек — в этом случае берётся первая ячейка диапазона.
Использование строковой переменной
Иногда достаточно хранить только адрес ячейки, а не ссылку на объект Range. В этом случае можно использовать строковую переменную.
|
1 2 3 4 5 6 7 8 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Static PriorAddress As String If PriorAddress <> "" Then Debug.Print "Предыдущая ячейка - " & PriorAddress Debug.Print "Текущая ячейка - " & Target.Cells(1).Address & vbNewLine End If PriorAddress = Target.Cells(1).Address End Sub |
Примечание и рекомендации
- При первой смене выделения процедура не отображает адреса, она только сохраняет предыдущую активную ячейку (диапазон) или её (его) адрес, используя статическую переменную.
- Если вам необходимо работать не только с отдельными ячейками, но и с диапазонами, удалите из процедуры
.Cells(1). Теперь будут корректно учитываться выделения диапазонов, в том числе и расширения предыдущих диапазонов. - Вы можете использовать глобальную переменную* для сохранения предыдущего выделения, тогда она (переменная) будет доступна для процедур из других стандартных модулей и модулей листов.
* В VBA оператор Static используется только внутри процедур (Sub/Function) для сохранения значения переменной между вызовами. Чтобы создать переменную уровня модуля, которая сохраняет значение, используйте Private или Dim в секции объявлений (вверху кода). Чтобы создать переменную уровня проекта, которая сохраняет значение, объявите ее в стандартном модуле с оператором Public.
Определение адреса при первой смене выделения
Чтобы узнать адрес ранее выделенной ячейки при первой смене выделения, необходимо в любом стандартном модуле (сверху, в разделе объявлений) объявить глобальную переменную:
|
1 |
Public PriorCell As Range |
В модуль книги вставьте следующий код:
|
1 2 3 4 5 6 |
Private Sub Workbook_Open() 'Указываем лист, на котором определяется предыдущее выделение Worksheets("Лист3").Select 'Сохраняем исходное выделение Set PriorCell = Selection.Cells(1) End Sub |
В модуль листа, на котором определяется адрес ранее выделенной ячейки, вставьте обработку события Worksheet_SelectionChange из примеров выше без объявления переменной (например, базовый):
|
1 2 3 4 5 6 7 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not PriorCell Is Nothing Then Debug.Print "Предыдущая ячейка - " & PriorCell.Address Debug.Print "Текущая ячейка - " & Target.Cells(1).Address & vbNewLine End If Set PriorCell = Target.Cells(1) End Sub |
Теперь адреса предыдущей и текущей ячеек будут отображаться, в том числе, и при первой смене выделения.
С помощью события Worksheet_SelectionChange и статической или глобальной переменной, сохраняющей предыдущее значение, можно легко определить адрес ранее выделенной ячейки на листе Excel. Самый удобный способ — использовать статическую переменную VBA типа Range. А также, в зависимости от задачи, можно применить и другие варианты: хранение адреса в строке или использование глобальной переменной.