Метод Application.OnKey используется в VBA Excel для назначения клавиши или сочетания клавиш, при нажатии которых запускается указанная процедура.
Application.OnKey — это метод VBA Excel, который назначает горячие клавиши или сочетания клавиш процедурам (макросам), которые начинают выполняются при нажатии этих клавиш.
Синтаксис
Синтаксис метода Application.OnKey:
Application.OnKey (Key, Procedure) |
Параметры
Параметры метода Application.OnKey:
Параметр | Описание |
---|---|
Key | Строка, указывающая клавишу или сочетание клавиш. Обязательный параметр. |
Procedure | Строка, указывающая имя выполняемой процедуры. Необязательный параметр. |
Параметры метода Application.OnKey указываются в коде VBA Excel без круглых скобок.
Параметр Key
Параметр Key может состоять из клавиш, представляющих буквы, которые записываются в фигурных скобках, например {a} или {b}. Функциональные клавиши, не представляющие буквы, используются в виде следующих кодов:
Клавиша | Код |
---|---|
Backspace | {BACKSPACE} или {BS} |
Break | {BREAK} |
Caps Lock | {CAPSLOCK} |
Clear | {CLEAR} |
Delete или Del | {DELETE} или {DEL} |
Стрелка вниз | {DOWN} |
End | {END} |
Enter на цифровой клавиатуре | {ENTER} |
Enter | ~ (тильда) |
Esc | {ESCAPE} или {ESC} |
Help | {HELP} |
Home | {HOME} |
Insert | {INSERT} |
Стрелка влево | {LEFT} |
Num Lock | {NUMLOCK} |
Page Down | {PGDN} |
Page Up | {PGUP} |
Return | {RETURN} |
Стрелка вправо | {RIGHT} |
Scroll Lock | {SCROLLLOCK} |
Tab | {TAB} |
Стрелка вверх | {UP} |
F1–F15 | {F1}–{F15} |
Для создания сочетаний клавиш используются коды клавиш Shift, Ctrl и Alt, которые указываются перед функциональными и буквенными клавишами без фигурных скобок:
Клавиша | Код |
---|---|
Shift | + (плюс) |
Ctrl | ^ (крышка) |
Alt (левая) | % (процент) |
Примеры:
- Код
"^{w}"
соответствует сочетанию клавишCtrl+w
. - Код
"^+{t}"
соответствует сочетанию клавишCtrl+Shift+t
. - Код
"%{UP}"
соответствует сочетанию клавишAlt+↑
.
Параметр Procedure
Имя процедуры записывается также, как отображается в окне «Макрос», которое открывается нажатием кнопки «Макросы» на вкладке «Разработчик»:
Если имя процедуры (макроса) уникальное, тогда имя модуля можно не указывать.
Пример назначения сочетания клавиш Ctrl+w
процедуре Module10.Primer1
:
Sub Primer() Application.OnKey «^{w}», «Module10.Primer1» End Sub |
После выполнения процедуры Primer
, процедура Module10.Primer1
начнет вызываться нажатием сочетания клавиш Ctrl+w
.
Если вместо имени процедуры указать пустую строку, метод Application.OnKey отменит любые действия, ранее назначенные указанному сочетанию клавиш:
Application.OnKey «^{w}», «» |
Если у заданного сочетания клавиш было действие по умолчанию, оно также выполняться не будет.
После запуска процедуры с методом Application.OnKey без указания параметра Procedure, отменяются все предыдущие действия метода Application.OnKey:
Если у заданного сочетания клавиш было действие по умолчанию, оно снова начнет выполняться.
Как добавить сочетания клавиш для быстрого доступа к элементам управления пользовательской формы смотрите в статье VBA Excel. Сочетания клавиш для кнопок.
ttt480 Пользователь Сообщений: 395 |
#1 11.03.2017 09:53:23 Доброе утро, форумчане. У меня есть макрос — клавиатурный хук. Выполняет он следующую функцию: перехватывает нажатия клавиш на клавиатуре — и запускает более мелкие макросы в соответствии с той клавишей — которая нажата (стрелки влево-вправо-вверх-вниз). Как заставить макрос — перехватывать нажатия клавиш в любом случае, когда нажата одна из этих клавиш ?
Прикрепленные файлы
Изменено: ttt480 — 14.03.2017 02:27:06 |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#2 11.03.2017 10:03:55 GetCurrentThreadId — насколько помню, получает ID текущего процесса(из которого вызвана), т.е. Excel. И хук будет работать только в том процессе, для которого создан, т.е. в Excel. Делайте выводы. По логике, если в этой строке:
вместо GetCurrentThreadId поставить 0, хук должен работать глобально, на все приложения. Правда, могут возникнуть свои нюансы. А вообще все эти хуки ни разу не для Excel работа, глюков потом не оберетесь. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
ttt480 Пользователь Сообщений: 395 |
#3 11.03.2017 10:11:54
Вместо GetCurrentThreadId поставил 0, как вы сказали — и сообщения перестали запускаться. Изменено: ttt480 — 11.03.2017 10:16:13 |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Откройте поисковик, забейте название своей функций и добавьте «глобальный хук». Забыл я, что третий аргумент не должен равняться нулю, если четвертый 0. Там должна идти ссылка на библиотеку, осуществляющую хук. В этом есть проблема использования в VBA. Есть, конечно, обходные пути, но как писал выше — глюков не оберетесь. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
ttt480 Пользователь Сообщений: 395 |
#5 11.03.2017 10:47:49
А RegisterHotKey — он глобально умеет работать? Изменено: ttt480 — 11.03.2017 11:58:46 |
||
Я не привязываюсь к листу или форме, я наоборот хочу отвязаться от них ,чтобы перехват клавиш проходил как можно асинхронней и отвлеченней от экселя, смотри выделенное черным цветом в вопросе.
Вот решение, комбо, наиболее шустро отрабатывает. (из пяти просмотренных вариантов) С библиотеками от самой винды.
Я привязывал реализацию процедуры в класс модуле, поэтому добавил модификатор доступа при подключении к библиотеки.
При использовании в обычном модуле модификатор можно убрать.
Visual Basic | ||
|
Очень мягко отрабатывает , по сравнению с остальными вариантами. Экран практически не скачет, и не надо чтобы ячейка или форма,или элемент формы в фокусе был.
Sleep 16 это имитация FPS на экране, примерно 60 кадров в секунду. В данном случае прерываний процедуры. Картинка для игры успевает прорисовываться и на работу не влияют случайные нажатия в ячейки, ввод каких то значений, итд, итп.
Перехват сочетаний клавиш в Форме. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Application.OnKey method (Excel) |
vbaxl10.chm133180 |
vbaxl10.chm133180 |
excel |
Excel.Application.OnKey |
43662d8b-19e2-2b4a-4c3a-c64be4007643 |
04/30/2019 |
medium |
Application.OnKey method (Excel)
Runs a specified procedure when a particular key or key combination is pressed.
Syntax
expression.OnKey (Key, Procedure)
expression A variable that represents an Application object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
Key | Required | String | A string indicating the key to be pressed. |
Procedure | Optional | Variant | A string indicating the name of the procedure to be run. If Procedure is «» (empty text), nothing happens when Key is pressed. This form of OnKey changes the normal result of keystrokes in Microsoft Excel.
If Procedure is omitted, Key reverts to its normal result in Microsoft Excel, and any special key assignments made with previous OnKey methods are cleared. |
Remarks
The Key argument can specify any single key combined with Alt, Ctrl, or Shift, or any combination of these keys. Each key is represented by one or more characters, such as a
for the character a, or {ENTER}
for the Enter key.
To specify characters that aren’t displayed when you press the corresponding key (for example: Enter or Tab), use the codes listed in the following table. Each code in the table represents one key on the keyboard.
Key | Code |
---|---|
BACKSPACE | {BACKSPACE} or {BS} |
BREAK | {BREAK} |
CAPS LOCK | {CAPSLOCK} |
CLEAR | {CLEAR} |
DELETE or DEL | {DELETE} or {DEL} |
DOWN ARROW | {DOWN} |
END | {END} |
ENTER (numeric keypad) | {ENTER} |
ENTER | ~ (tilde) |
ESC | { ESCAPE} or {ESC} |
HELP | {HELP} |
HOME | {HOME} |
INS | {INSERT} |
LEFT ARROW | {LEFT} |
NUM LOCK | {NUMLOCK} |
PAGE DOWN | {PGDN} |
PAGE UP | {PGUP} |
RETURN | {RETURN} |
RIGHT ARROW | {RIGHT} |
SCROLL LOCK | {SCROLLLOCK} |
TAB | {TAB} |
UP ARROW | {UP} |
F1 through F15 | {F1} through {F15} |
You can also specify keys combined with Shift and/or Ctrl and/or Alt and/or Command. To specify a key combined with another key or keys, use the following table.
To combine keys with | Precede the key code by |
---|---|
Shift | + (plus sign) |
Ctrl | ^ (caret) |
Alt | % (percent sign) |
Command | * (asterisk) Only applies to Mac; may only work on Excel 2011 for Mac and not later versions. |
To assign a procedure to one of the special characters (+, ^, %, and so on), enclose the character in braces. For details, see the example.
[!NOTE]
There is no way to currently detect the Command key in recent versions of Office VBA. Microsoft is aware of this and is looking into it.
Example
This example assigns InsertProc to the key sequence Ctrl+Plus Sign, and assigns SpecialPrintProc to the key sequence Shift+Ctrl+Right Arrow.
Application.OnKey "^{+}", "InsertProc" Application.OnKey "+^{RIGHT}", "SpecialPrintProc"
This example returns Shift+Ctrl+Right Arrow to its normal meaning.
Application.OnKey "+^{RIGHT}"
This example disables the Shift+Ctrl+Right Arrow key sequence.
Application.OnKey "+^{RIGHT}", ""
[!includeSupport and feedback]