Имитация нажатия клавиш на клавиатуре в VBA Excel с помощью оператора SendKeys, в том числе эмуляция нажатия сочетаний клавиш. Синтаксис, коды, примеры.
Синтаксис оператора SendKeys
1 |
SendKeys string, [wait] |
Параметры оператора 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Primer1() 'Выбираем первую ячейку Range("A1").Select 'Нажимаем клавиши «а», «б» и «в» SendKeys "абв" 'Нажимаем «ENTER» SendKeys "~" 'Нажимаем клавиши «1», «2», «3» и «ENTER» SendKeys "123 ~" 'Нажимаем клавишу «7» пять раз и «ENTER» SendKeys "{7 5} ~" 'Активируем правый цифровой блок 'SendKeys "{NUMLOCK}" End Sub |
Пример 2
Раскрываем с помощью кода VBA Excel автофильтр или выпадающий список (имитация нажатия сочетания клавиш ALT+↓
):
1 2 3 4 5 6 7 8 |
Sub Primer2() 'Выбираем ячейку с автофильтром или раскрывающимся списком Range("D1").Select 'Раскрываем список SendKeys "%{DOWN}" 'Активируем правый цифровой блок 'SendKeys "{NUMLOCK}" End Sub |
Пример 3
Еще три варианта эмуляции нажатия сочетаний клавиш:
1 2 3 4 5 6 7 8 |
'Создание новой книги SendKeys "^n" 'Открытие Диспетчера имен SendKeys "^{F3}" 'Открытие Диспетчера задач SendKeys "^+{ESC}" |
Огромное спасибо! Разобрался)
К сожалению, вариант исправления нажатия NUMLOCK не работает на win10 х64.
P.S.: в Примере 1 и 2 ошибки — нет введения оператора SendKeys «{NUMLOCK}», идет только его описание через ‘.
Добрый день!
Я специально оставил строку
SendKeys "{NUMLOCK}"
закомментированной, чтобы пользователь посмотрел, отключится у него Num Lock или нет.Протестировал код Примера 1 в Excel 2016 x64:
с закомментированным
SendKeys "{NUMLOCK}"
: первый прогон кода отключает Num Lock, второй — включает;с раскомментированным
SendKeys "{NUMLOCK}"
: устанавливается следующее состояние: два прогона кода с отключенным Num Lock, два прогона — с включенным.именно.
Т.к. в моей ситуации кнопки с подобными макросами привязаны к панели навигации, то в итоге получается рандомайзер — полистал, поискал нужное и приходится смотреть в каком состоянии NumLock. Кнопки навигации могут быть нажаты по нескольку раз.
Жаль, так бы это решение было очень простым для понимания (в VBA я не силен). Вообще странно, почему так происходит? Я так понимаю, что SendKeys это внутренняя команда Excel, но какая-то забагованная(
Я целый год для Access пытался найти решение с Numlock — бесполезно, через раз нажимается
Подскажите пожалуйста.
Как нужно написать код чтобы из ячеек
"D6:D7"
нажав Ctrl+C перейти на"A1"
нажать F2 и нажать Ctrl + V?Спасибо.
Денис, после нажатия F2, в ячейку, находящуюся в режиме редактирования, вставить скопированные ячейки невозможно.
Доброго времени суток, Евгений.
Нигде не могу найти способ имитации работы «мышкой».
Спасибо за внимание.
Здравствуйте, Таер!
В VBA нет такого средства, но можно прибегнуть к функциям Windows API — SetCursorPos и mouse_event:
Обсуждение закрыто.