Перехват нажатия клавиш в excel

Обновлено: 05.07.2024

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

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

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

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

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

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

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

Спецсимволы, которые следует заключать в фигурные скобки: плюс + , возведение в степень ^ , знак процента % , тильда

, круглые скобки () , квадратные скобки [] и сами фигурные скобки <> . Символы фигурных скобок указываются так: "" и "<>>" .

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

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

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

Клавиша Код
BACKSPACE или
BREAK
CAPS LOCK
DEL или DELETE или
СТРЕЛКА ВНИЗ
END
ENTER или

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

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

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

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

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

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

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

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

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

Событие KeyDown происходит, когда пользователь нажимает клавишу, а форма или элемент управления в центре внимания. Это событие также происходит, если вы отправляете нажатие клавиши в форму или управление с помощью действия SendKeys в макрос или в заявлении SendKeys в Visual Basic.

Синтаксис

выражения. KeyDown (KeyCode, Shift)

выражение Переменная, представляюная объект CommandButton.

Параметры

acShiftMask Битовая маска для клавиши Shift.

acCtrlMask Битовая маска для ключа Ctrl.

acAltMask Битовая маска для клавиши Alt.

Примечания

Событие KeyDown применяется только к формам и средствам управления в форме, а не к средствам управления отчетом.

Чтобы запустить процедуру макроса или события, когда происходят эти события, установите свойство OnKeyDown имя макроса или [Event Procedure].

В обоих событиях объект с фокусом получает все клавиши. Форма может быть в фокусе, только если на ней нет элементов управления или все ее видимые элементы управления недоступны.

Форма также будет получать все события клавиатуры, даже те, которые происходят для элементов управления, если вы установите свойство KeyPreview формы да. С помощью этого параметра свойств все события клавиатуры происходят сначала для формы, а затем для управления, на который направлен фокус. Вы можете отвечать на определенные клавиши, нажатые в форме, независимо от того, какой контроль имеет фокус. Например, может потребоваться, чтобы клавишная комбинация Ctrl+X всегда выполняла одно и то же действие на форме.

При нажатии и удержании ключа события KeyDown и KeyPress чередуются несколько раз (KeyDown, KeyPress, KeyDown, KeyPress и так далее), пока вы не отпустите ключ, а затем произойдет событие KeyUp.

Хотя событие KeyDown происходит при нажатии большинства клавиш, оно обычно используется для распознавания или различия между:

Расширенные клавиши знаков, такие как функциональные клавиши.

Клавиши навигации, такие как Home, End, PgUp, PgDn, Up arrow, Down arrow, Right arrow, Left arrow и Tab.

Сочетание клавиш и стандартных модификаторов клавиатуры (Shift, Ctrl или Alt).

Клавиши цифр числовой панели и клавиатуры.

Событие KeyDown не происходит при нажатии:

Клавиша Ввод, если в форме есть кнопка команды, для которой свойство по умолчанию назначено да.

Ключ Esc, если в форме есть кнопка команды, для которой свойство Cancel за установлено значение Да.

Событие KeyDown происходит при нажатии или отправке ключа ANSI. Событие KeyUp происходит после любого события для управления, вызванного нажатием или отправкой ключа. Если нажатие клавиш вызывает перемещение фокуса с одного управления на другой, для первого управления происходит событие KeyDown, а для второго - события KeyPress и KeyUp.

Чтобы узнать символ ANSI, соответствующий нажатию клавиши, используйте событие KeyPress.

Если диалоговое окно modal отображается в результате нажатия или отправки ключа, происходят события KeyDown и KeyPress, но событие KeyUp не происходит.

Пример

В следующем примере определяется, нажали ли вы клавишу Shift, Ctrl или Alt.

Чтобы попробовать пример, добавьте следующую процедуру события в форму, содержащую текстовое поле с именем KeyHandler.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Все здорово, но как в песне одной ="..но есть одно но..":
1)Процедура отрабатывает, только если на листе Activate/или Select какая либо ячейка.
2) Процедура отрабатывает ,если есть форма , и также если у данной формы/контрола установлен фокус.

Вопрос в следующем, как без формы (на которую установлен фокус, либо фокус на контрол формы) и без активной ячейки (которая activate/select) организовать перехват клавиш на открытом листе excel.

Вопрос не такой простой, как кажется поначалу)

Объясните разницу между Excel.Application.xxx и Application.xxx
Всем привет. Начинаю изучать VBA, планирую пока использовать для эксель. Учусь по книге.


Выключить OnKey
Здравствуйте, подскажите, пожалуйста, как отключить действие Application.OnKey , чтобы клавиши.

Application.PrintOut в Excel 2007
Приветствую. Лет цать назад писал макрос. И в нем были такие строчки: adoc = Dir(&quot;*.doc&quot;) Do.

Позднее связывание с Excel.Application
был первый вариант программы - даю отрывок Dim Obj Dim oCell Set Obj =.

Сергей1980, событие относится к приложению, а не к листу или форме. Если есть конкретный пример, где не работате, то в студию. А вот у меня ответный вопрос:
и без активной ячейки (которая activate/select) организовать перехват клавиш на открытом листе excel.

Уже разобрался и нашел решение.

событие относится к приложению, а не к листу или форме. Спасибо кэп) Само выражение Application.onKey об этом как бы намекает) Сергей1980, Если пишете что да может, то очень хочу посмотреть как. Если знаете что намекает, то почему привязываетесь к листу или форме. Нашли решение, так поделитесь со всеми. Или просто книгу с кодом где нужная процедура лежит указали?

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

Вот решение, комбо, наиболее шустро отрабатывает. (из пяти просмотренных вариантов) С библиотеками от самой винды.
Я привязывал реализацию процедуры в класс модуле, поэтому добавил модификатор доступа при подключении к библиотеки.
При использовании в обычном модуле модификатор можно убрать.

Очень мягко отрабатывает , по сравнению с остальными вариантами. Экран практически не скачет, и не надо чтобы ячейка или форма,или элемент формы в фокусе был.

Sleep 16 это имитация FPS на экране, примерно 60 кадров в секунду. В данном случае прерываний процедуры. Картинка для игры успевает прорисовываться и на работу не влияют случайные нажатия в ячейки, ввод каких то значений, итд, итп.

Вкладка с инструментами, связанными с VBA Excel, называется «Разработчик». Если этой вкладки нет на вашей ленте, добавьте ее через окно «Параметры»:

Окно «Параметры Excel»

  • Откройте окно «Параметры» через меню «Файл».
  • Выберите вкладку «Настроить ленту».
  • В правой колонке установите галочку у пункта «Разработчик» и нажмите «OK».

Кнопка – элемент управления формы

Вставка кнопки на лист

  1. Выберите вкладку «Разработчик» и нажмите на кнопку «Вставить».
  2. Нажмите на значок кнопки в коллекции «Элементы управления формы».

Добавление кнопки на рабочий лист (элемент управления формы)

  1. Кликните в любом месте на рабочем листе Excel.
  2. Откроется окно «Назначить макрос объекту». Нажмите «Отмена», так как макрос для этой кнопки еще не готов.
  3. После нажатия кнопки «Отмена», на рабочем листе появится новая кнопка из коллекции «Элементы управления формы» в режиме редактирования.

Кнопка (элемент управления формы)

Ухватив мышкой за один из кружочков, можно изменить размер кнопки. Ухватив кнопку за границу, можно перетащить ее в другое место. Также, в режиме редактирования, можно изменить название кнопки прямо на ее поверхности.

Чтобы выйти из режима редактирования кнопки из коллекции «Элементы управления формы», кликните в любом месте на рабочем листе.

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

Создание процедуры для кнопки

Кнопке из коллекции «Элементы управления формы» можно назначить макрос (процедуру), размещенную в стандартном программном модуле.

Создайте или откройте файл Excel с расширением .xlsm (Книга Excel с поддержкой макросов) и перейдите в редактор VBA, нажав сочетание клавиш «Левая_клавиша_Alt+F11».

Если вы не создавали ранее в этом проекте VBA стандартный программный модуль, нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку (после значка Excel) на панели инструментов.

Вставка модуля в редакторе VBA Excel

Ссылка на модуль появится в проводнике слева. Если модуль создан ранее, дважды кликните по его ссылке в проводнике, и он откроется справа для редактирования.

Вставка процедуры в редакторе VBA Excel

В открывшемся окне добавления шаблона процедуры оставьте выбранным переключатель «Sub», вставьте в поле «Name» название процедуры «NovayaProtsedura» и нажмите «OK».

Окно добавления процедуры в редакторе VBA Excel

В стандартный программный модуль будет вставлен шаблон процедуры «NovayaProtsedura».

Читайте также: