Имитация нажатия клавиш на клавиатуре в 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:
Обсуждение закрыто.