Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Определение адреса ранее выделенной ячейки

    Определение адреса ранее выделенной ячейки с помощью кода VBA Excel. Использование статической переменной для сохранения адреса предыдущей активной ячейки.

    Сохранение адреса ранее выделенной ячейки

    При работе в Excel иногда возникает необходимость отслеживать не только текущую выбранную ячейку, но и ту, которая была выделена ранее. Это может быть полезно при создании интерактивных таблиц, логировании действий пользователя, разработке пользовательских инструментов на VBA.

    В Excel есть событие Worksheet_SelectionChange, которое запускается каждый раз, когда пользователь меняет выделение на листе. Используя это событие, можно сохранить адрес предыдущей активной ячейки, чтобы использовать её для текущих вычислений и операций с её свойствами.

    Базовый вариант кода

    Самый простой способ — использовать статическую переменную типа Range, которая будет хранить ссылку на ранее выделенную ячейку.

    Комментарии к работе кода:

    1. Событие Worksheet_SelectionChange запускается при изменении выделения.
    2. Переменная PriorCell объявлена как Static (статическая переменная), поэтому её значение сохраняется между вызовами процедуры.
    3. При каждом изменении выделения:
      • в окно Immediate (Debug.Print) выводится адрес предыдущей ячейки;
      • выводится адрес текущей ячейки и символ новой строки, чтобы визуально разделить пары адресов.
    4. Затем текущая ячейка сохраняется как предыдущая для следующего события.

    Метод Target.Cells(1) используется для того, чтобы корректно обработать ситуацию, когда пользователь выделяет диапазон из нескольких ячеек — в этом случае берётся первая ячейка диапазона.

    Использование строковой переменной

    Иногда достаточно хранить только адрес ячейки, а не ссылку на объект Range. В этом случае можно использовать строковую переменную.

    Примечание и рекомендации

    • При первой смене выделения процедура не отображает адреса, она только сохраняет предыдущую активную ячейку (диапазон) или её (его) адрес, используя статическую переменную.
    • Если вам необходимо работать не только с отдельными ячейками, но и с диапазонами, удалите из процедуры .Cells(1). Теперь будут корректно учитываться выделения диапазонов, в том числе и расширения предыдущих диапазонов.
    • Вы можете использовать глобальную переменную* для сохранения предыдущего выделения, тогда она (переменная) будет доступна для процедур из других стандартных модулей и модулей листов.

    * В VBA оператор Static используется только внутри процедур (Sub/Function) для сохранения значения переменной между вызовами. Чтобы создать переменную уровня модуля, которая сохраняет значение, используйте Private или Dim в секции объявлений (вверху кода). Чтобы создать переменную уровня проекта, которая сохраняет значение, объявите ее в стандартном модуле с оператором Public.

    Определение адреса при первой смене выделения

    Чтобы узнать адрес ранее выделенной ячейки при первой смене выделения, необходимо в любом стандартном модуле (сверху, в разделе объявлений) объявить глобальную переменную:

    В модуль книги вставьте следующий код:

    В модуль листа, на котором определяется адрес ранее выделенной ячейки, вставьте обработку события Worksheet_SelectionChange из примеров выше без объявления переменной (например, базовый):

    Теперь адреса предыдущей и текущей ячеек будут отображаться, в том числе, и при первой смене выделения.


    С помощью события Worksheet_SelectionChange и статической или глобальной переменной, сохраняющей предыдущее значение, можно легко определить адрес ранее выделенной ячейки на листе Excel. Самый удобный способ — использовать статическую переменную VBA типа Range. А также, в зависимости от задачи, можно применить и другие варианты: хранение адреса в строке или использование глобальной переменной.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.