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

VBA Excel. Оператор SendKeys (имитация нажатия клавиш)

    Имитация нажатия клавиш на клавиатуре в VBA Excel с помощью оператора SendKeys, в том числе эмуляция нажатия сочетаний клавиш. Синтаксис, коды, примеры.

    Синтаксис оператора SendKeys

    Параметры оператора SendKeys:

    Параметр Описание
    string Обязательный параметр. Строковое выражение, возвращающее код клавиши (сочетания клавиш).
    wait Необязательный параметр. Логическое значение, определяющее режим ожидания.
    False (по умолчанию) – контроль процедуре возвращается сразу после отправки кода клавиш.
    True – перед возвратом контроля процедуре коды клавиш обрабатываются.

    Имитация нажатия клавиш

    Эмуляция нажатия алфавитно-цифровых клавиш из кода VBA Excel, не представляющих спецсимволы: параметру string задается значение символа в прямых кавычках, например, "А", "Абвгд", "356".

    Имитация нажатия клавиш, представляющих спецсимволы: параметру string задается значение символа в фигурных скобках, например, "{^}", "{)}".

    Спецсимволы, которые следует заключать в фигурные скобки: плюс +, возведение в степень ^, знак процента %, тильда ~, круглые скобки (), квадратные скобки [] и сами фигурные скобки {}. Символы фигурных скобок указываются так: "{{}" и "{}}".

    Для эмуляции нажатия специальных клавиш, включая функциональные и клавиши управления курсором, используются специальные коды, заключенные в фигурные скобки.

    Фигурные скобки используются и для имитации нескольких нажатий одной клавиши из кода VBA Excel. В этом случае параметр string записывается в виде {клавиша число}, где число – количество нажатий. Например: "{а 10}".

    Коды специальных клавиш

    Клавиша Код
    BACKSPACE {BACKSPACE} или {BS}
    BREAK {BREAK}
    CAPS LOCK {CAPSLOCK}
    DEL или DELETE {DELETE} или {DEL}
    СТРЕЛКА ВНИЗ {DOWN}
    END {END}
    ENTER {ENTER} или ~
    ESC {ESC}
    HELP {HELP}
    HOME {HOME}
    INS или INSERT {INSERT} или {INS}
    СТРЕЛКА ВЛЕВО {LEFT}
    NUM LOCK {NUMLOCK}
    PAGE DOWN {PGDN}
    PAGE UP {PGUP}
    PRINT SCREEN {PRTSC}
    СТРЕЛКА ВПРАВО {RIGHT}
    SCROLL LOCK {SCROLLLOCK}
    TAB {TAB}
    СТРЕЛКА ВВЕРХ {UP}
    F1 … F16 {F1}{F16}

    Эмуляция сочетаний клавиш

    Чтобы указать сочетание клавиш с SHIFT, CTRL, ALT или их комбинацией, необходимо добавить перед кодом клавиши один или несколько следующих кодов:

    Клавиша Код
    SHIFT +
    CTRL ^
    ALT %

    Чтобы указать, что клавиши SHIFT, CTRL и ALT в любом сочетании необходимо удерживать, нажимая несколько других клавиш, заключите код для последних клавиш в круглые скобки. Например, чтобы указать, что нужно удерживать клавишу SHIFT, нажимая клавиши а, б, в, г, д, введите "+(абвгд)".

    Важное примечание:
    Применение оператора SendKeys может приводить к автоматическому отключению* правого цифрового блока клавиатуры (переключает на стрелки и специальные клавиши). Чтобы вернуть исходную функциональность цифрового блока, необходимо в конце процедуры применить имитацию нажатия клавиши «NUM LOCK»: SendKeys "{NUMLOCK}". К сожалению, работает не всегда.

    * Обнаружено в Windows 8.1 (Excel 2016).

    Примеры с оператором SendKeys

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

    Пример 1
    Заполняем первые три ячейки столбца «A» различными значениями, имитируя нажатия клавиш из кода VBA Excel:

    Пример 2
    Раскрываем с помощью кода VBA Excel автофильтр или выпадающий список (имитация нажатия сочетания клавиш ALT+↓):

    Пример 3
    Еще три варианта эмуляции нажатия сочетаний клавиш:

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

    9 комментариев для “VBA Excel. Оператор SendKeys (имитация нажатия клавиш)”

    1. К сожалению, вариант исправления нажатия NUMLOCK не работает на win10 х64.

      P.S.: в Примере 1 и 2 ошибки — нет введения оператора SendKeys «{NUMLOCK}», идет только его описание через ‘.

      1. Евгений

        Добрый день!
        Я специально оставил строку SendKeys "{NUMLOCK}" закомментированной, чтобы пользователь посмотрел, отключится у него Num Lock или нет.
        Протестировал код Примера 1 в Excel 2016 x64:
        с закомментированным SendKeys "{NUMLOCK}": первый прогон кода отключает Num Lock, второй — включает;
        с раскомментированным SendKeys "{NUMLOCK}": устанавливается следующее состояние: два прогона кода с отключенным Num Lock, два прогона — с включенным.

        1. именно.
          Т.к. в моей ситуации кнопки с подобными макросами привязаны к панели навигации, то в итоге получается рандомайзер — полистал, поискал нужное и приходится смотреть в каком состоянии NumLock. Кнопки навигации могут быть нажаты по нескольку раз.

          Жаль, так бы это решение было очень простым для понимания (в VBA я не силен). Вообще странно, почему так происходит? Я так понимаю, что SendKeys это внутренняя команда Excel, но какая-то забагованная(

          1. Евгений

            Я целый год для Access пытался найти решение с Numlock — бесполезно, через раз нажимается

    2. Подскажите пожалуйста.
      Как нужно написать код чтобы из ячеек "D6:D7" нажав Ctrl+C перейти на "A1" нажать F2 и нажать Ctrl + V?
      Спасибо.

      1. Евгений

        Денис, после нажатия F2, в ячейку, находящуюся в режиме редактирования, вставить скопированные ячейки невозможно.

    3. Доброго времени суток, Евгений.
      Нигде не могу найти способ имитации работы «мышкой».
      Спасибо за внимание.

      1. Евгений

        Здравствуйте, Таер!
        В VBA нет такого средства, но можно прибегнуть к функциям Windows API — SetCursorPos и mouse_event:

    Обсуждение закрыто.