Нажатие клавиши VBA Excel

Обновлено: 06.07.2024

Но иногда вам нужно взаимодействовать с программами, отличными от MS Office, которые не являются веб-контентом. В этом случае вы можете использовать SendKeys. По общему признанию, SendKeys также несколько неуклюжий и не самый надежный, но он может выполнить свою работу в крайнем случае. VBA действительно разработан и оптимизирован для приложений MS Office, следовательно, Visual Basic для (Microsoft) приложений, но SendKeys полезен, когда вы хотите иметь дело с другими программами.

SendKeys и активное окно

Многие руководства начинаются с предупреждения об использовании ключей SendKey, и на это есть веская причина. SendKeys буквально отправляет указанные нажатия клавиш любому активному элементу. В идеале это место, на которое должны воздействовать нажатия клавиш, например ячейка на листе, открытый блокнот или строка URL-адреса браузера.

Однако это может вызвать некоторые проблемы. Если активно не то окно, вы будете посылать нажатия клавиш не тому окну. Более того, активный элемент точно в момент выполнения SendKeys получает нажатия клавиш. Таким образом, вы не можете пройтись по своему коду, чтобы проверить его правильность. На самом деле, вы даже не сможете запустить некоторые фрагменты кода из редактора VBA, так как VBE все равно будет активен!

Для иллюстрации: откройте VBE, введите этот код и запустите макрос, нажав клавишу F5. Что случилось?

Вы получите что-то вроде этого, что, вероятно, не то, что вы хотели:

Неверный результат


Ключи отправлены не туда!

Несмотря на то, что вы пытались активировать ячейку A1, VBE все еще был активен во время запуска, поэтому SendKeys помещал нажатия клавиш на курсор в VBE, а не в нужную ячейку.

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

Отправка сочетаний клавиш

Технически вы можете использовать SendKeys для отправки сочетаний клавиш в программы MS Office. Если вы хотите сохранить книгу после внесения изменений с помощью какой-либо подпрограммы, теоретически можно отправить сочетание клавиш Ctrl+s для сохранения.

Однако я настоятельно не рекомендую использовать для этого SendKeys. Гораздо надежнее использовать «чистый VBA» для сохранения книги с помощью Workbook.Save . Этот метод позволяет точно назвать конкретную книгу, тем самым гарантируя, что это именно та книга, которую вы хотите сохранить. Кроме того, .Save выполняется как «чистый VBA», без неудобных вводов-выводов (нажатий клавиш), разработанных для нас, людей.

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

Специальные символы

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

Три самых распространенных специальных символа, которые вы будете использовать, особенно для ярлыков, — это контроль, alt и Shift. Чтобы отправить их как составные нажатия клавиш (т. е. нажатия клавиш, отправленные одновременно), используйте следующие замены:

Поэтому, чтобы отправить сочетание клавиш для сохранения, мы использовали SendKeys "^s" .

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

Итак, чтобы отправить 10 % в ячейку, мы использовали бы SendKeys "10" . % «экранируется» фигурными скобками, и VBA знает, что вам нужен фактический символ вместо клавиши ALT.

Наконец, есть несколько клавиш с другими функциями (например, функциональные клавиши F1–F16), вкладки, стрелки и т. д. Они должны быть помещены в фигурные скобки и принимать следующие значения:

Таблица специальных символов


Таблица специальных символов SendKeys

Создавайте мощные макросы с помощью нашего бесплатного комплекта разработчика VBA

На самом деле это довольно аккуратно. Если у вас есть проблемы с пониманием или запоминанием, вам может помочь наш бесплатный комплект разработчика VBA. Он содержит сочетания клавиш VBA, которые помогут вам создавать собственные макросы, подобные этому. Мы отправим копию вместе с нашей Большой книгой макросов Excel VBA на указанный ниже адрес электронной почты.

Если вы предпочитаете копировать и вставлять правильные коды специальных символов VBA SendKeys, вот текстовая версия списка:

Открытие и активация других программ

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

Во-первых, вам нужно открыть еще одну программу. Мы написали несколько руководств, объясняющих, как открывать и активировать внешние программы с помощью VBA, используя различные методы, включая VBA Shell и AppActivate.

Мы потратим несколько минут, чтобы освежить вашу память по этим темам.

Открытие других приложений с помощью Shell

Вы можете использовать Shell для открытия других приложений. Он принимает только два аргумента: путь к файлу для приложения и атрибут для открытого окна. Для наших целей давайте откроем Блокнот, мое любимое приложение для хранения нескольких быстрых заметок:

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

Давайте скопируем и вставим диапазон от A1 до C10 из нашей электронной таблицы в новый файл блокнота:

Запустите этот макрос, и вы увидите окно блокнота, в которое вставлено содержимое вашей ячейки. Это чисто? Нет. Это быстро и выполняет ли это работу? да. Вы даже можете вызвать запрос на сохранение нового файла блокнота с помощью «^s». Конечно, есть гораздо лучшие способы записи в текстовый файл с помощью VBA.

Переключение на открытие окон с помощью AppActivate

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

AppActivate требует НАЗВАНИЕ приложения. Если у вас есть несколько программ с одинаковым названием, он переключится на последнюю активную.

Если название вашей программы изменилось (например, после сохранения блокнота), вы можете использовать точное имя, чтобы указать, какое окно открывать. Например, у меня есть текстовый файл с именем Snippets.txt , и я могу выделить его вот так, даже если открыто 5 других блокнотов:

Примечание о Shell и AppActivate

Технически Shell возвращает PID (идентификатор процесса) открытого приложения. К сожалению, AppActivate использует заголовок окна, а не PID. Вы можете найти заголовок окна с его PID, но вы должны сделать это через Windows API. Это выходит за рамки данного руководства, но я хотел, чтобы читатели знали, что можно использовать перекрестные ссылки.

Автоматизировать задачи

Зачем тратить время на изучение SendKeys? Ну и для экономии времени потом, конечно!

Я обнаружил, что ключи SendKey полезны для одновременного открытия нескольких URL-адресов в браузере. В этом примере SendKeys сочетается с Application.Wait, чтобы обеспечить плавное выполнение между передачами нажатий клавиш.

Инструкции .Wait гарантируют, что у Firefox есть время, чтобы фактически открыть новые вкладки, сфокусироваться на поле URL-адреса и выполнить команду Enter перед открытием следующей новой вкладки. Application.Wait позволяет делать паузу только с шагом в 1 секунду, но вы можете использовать спящий режим VBA для более точного управления.

SendKeys отправляет нажатия клавиш активному элементу в активном окне. Это неуклюже, ненадежно и рекомендуется только в крайнем случае. Тем не менее, это может быть полезно в крайнем случае. Если вы должны использовать SendKeys, я также рекомендую выполнить как можно больше обработки перед вызовом оператора. Объединяйте, вычисляйте и исправляйте ошибки перед отправкой ключей, чтобы уменьшить вероятность сбоев, связанных с процессом.

Надеюсь, этот урок был вам полезен. В этой статье мы сделали перекрестные ссылки на ряд связанных сообщений VBA. Если вам нравятся все эти руководства, подпишитесь, используя форму ниже.

Готовы делать больше с VBA?
Мы собрали гигантский PDF-файл с более чем 300 готовыми макросами и хотим, чтобы вы получили его бесплатно. Введите свой адрес электронной почты ниже, и мы вышлем вам копию вместе с нашим комплектом разработчика VBA, полным советов, приемов и ярлыков VBA.

Прежде чем мы начнем, я хочу сообщить вам, что мы разработали набор шпаргалок по VBA, чтобы вам было проще писать лучшие макросы. Мы включили более 200 советов и 140 примеров макросов, поэтому в них есть все, что вам нужно знать, чтобы стать лучшим программистом VBA.

Эта статья была написана Кори Сарвером, автором статей для блога VBA Tutorials. Посетите его в LinkedIn и на его личной странице.

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

Параметры

Имя Обязательный/Необязательный Тип данных Описание
Ключи Обязательно Вариант Ключ или комбинация клавиш, которую вы хотите отправить в приложение в виде текста.
Подождите Необязательно Вариант True, чтобы Microsoft Excel ждал обработки ключей перед возвратом управления к макросу. False (или опущено), чтобы продолжить выполнение макроса, не дожидаясь обработки ключей.

Примечания

Этот метод помещает нажатия клавиш в буфер клавиш. В некоторых случаях необходимо вызвать этот метод перед вызовом метода, который будет использовать нажатия клавиш. Например, чтобы отправить пароль в диалоговое окно, необходимо вызвать метод SendKeys перед отображением диалогового окна.

Аргумент Keys может указывать любую отдельную клавишу или любую клавишу в сочетании с Alt, Ctrl или Shift (или любую комбинацию этих клавиш). Каждая клавиша представлена ​​одним или несколькими символами, например "a" для символа a или "" для клавиши Enter.

Чтобы указать символы, которые не отображаются при нажатии соответствующей клавиши (например, Enter или Tab), используйте коды, перечисленные в следующей таблице. Каждый код в таблице соответствует одной клавише на клавиатуре.

< /th>
Ключ Код
BACKSPACE или
BREAK
CAPS LOCK
ОЧИСТИТЬ
УДАЛИТЬ или УДАЛИТЬ или
СТРЕЛКА ВНИЗ
END
ENTER (цифровая клавиатура)
ENTER ~ (тильда)
ESC или< /tr>
ПОМОЩЬ
ГЛАВНАЯ
INS
СТРЕЛКА ВЛЕВО
NUM LOCK
СТРАНИЦА ВНИЗ
СТРАНИЦА ВВЕРХ
RETURN
СТРЕЛКА ВПРАВО
БЛОКИРОВКА ПРОКРУТКИ
TAB
СТРЕЛКА ВВЕРХ
F1–F15
< бр />

Вы также можете указать клавиши в сочетании с Shift и/или Ctrl и/или Alt. Чтобы указать ключ в сочетании с другим ключом или ключами, используйте следующую таблицу.

Чтобы объединить ключ с Начните код ключа с< /th>
Shift + ( плюс)
Ctrl ^ (каретка)< /td>
Alt % (знак процента)

Пример

В следующем примере создается новая книга.

В следующем примере отображается Диспетчер имен.

В следующем примере в активную ячейку вводится значение 1234.

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

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

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

ПРЕДУПРЕЖДЕНИЕ. Метод SendKeys следует использовать только в том случае, если нет других доступных вариантов, поскольку это может вызвать проблемы, если при выполнении кода активно неправильное окно.

Подробнее о SendKeys можно прочитать на веб-сайте Microsoft: метод SendKeys.

Использование метода SendKeys

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

Метод SendKeys имеет два аргумента: SendKeys(Keys, Wait)

  • Аргумент Keys является обязательным и представляет собой ключ или ключи, которые вы хотите отправить приложению в виде текста.
  • Опция ожидания не является обязательной.
    • Используйте True, если Excel должен дождаться обработки ключей, прежде чем вернуть управление макросу.
    • Используйте False (или опустите этот аргумент), если Excel должен продолжить выполнение макроса, не дожидаясь обработки ключей.

    Аргумент ключей

    Для аргумента "Ключи" можно использовать ключи или комбинации клавиш, например:

    SendKeys "+" . для Shift + F2

    SendKeys "%ie~" . для Alt + I, E, Enter

    Полный список кодов приведен в конце этой страницы: Ключи и комбинации клавиш

    Примеры SendKeys

    На странице комментариев VBA есть макросы, использующие метод SendKeys для открытия комментария для редактирования. Например, следующий макрос вставляет комментарий без имени пользователя и открывает этот комментарий, чтобы он был готов для редактирования.

    В этом примере SendKeys "+" аналогичен нажатию Shift и клавиши F2 для редактирования комментария в активной ячейке.

    редактировать комментарий

    В Excel 2003 и более ранних версиях, где есть строка меню, клавиши SendKeys могут имитировать сочетание клавиш для запуска команды меню.

    В этом примере SendKeys "%ie~" подобен ручным ярлыкам для:

    • нажмите Alt и введите I (чтобы открыть меню «Вставка»)
    • затем введите E (чтобы выбрать команду "Редактировать"),
    • а затем нажмите клавишу Enter, чтобы выбрать эту команду.

    редактировать комментарий

    Запуск макроса, использующего SendKeys

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

    • На вкладке "Вид" ленты нажмите "Макрос".
    • Затем щелкните имя макроса и выберите "Выполнить".

    редактировать комментарий

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

    Проблема с запуском макроса SendKeys

    Если команда SendKeys работает неправильно, одно из этих решений может помочь устранить проблему

    SendKeys не работает из ярлыка

    Если вы попытаетесь запустить макрос с помощью сочетания клавиш, и этот макрос использует метод SendKeys, метод SendKeys может не работать. Эта проблема подтверждена на веб-сайте Microsoft: Ошибка использования SendKeys в VB с назначенным сочетанием клавиш

    В этом примере сочетание клавиш Ctrl + Shift + C назначено макросу CommentAddOrEdit.

    редактировать комментарий

    После создания ярлыка, если нажать Ctrl + Shift + C, в ячейку вставляется пустой комментарий, но комментарий не открывается для редактирования — метод SendKeys не работает.

    Проблема возникает из-за того, что это очень короткий макрос, и вы по-прежнему нажимаете клавиши Ctrl + Shift, когда макрос запускает оператор SendKeys. При этом в Excel отправляется комбинация клавиш Ctrl + Shift + F2 вместо Shift + F2.

    Чтобы решить эту проблему, вы можете добавить в макрос строку ожидания длительностью 1 секунду (или чуть дольше) перед ключами SendKey.

    Ключи и комбинации клавиш

    Для аргумента "Ключи" вы можете использовать ключи или комбинации клавиш. Вы можете ввести символ, например "a", или использовать коды из таблицы ниже:

    VBA SendKeys

    В этой статье мы увидим общие сведения о ключах SendKeys для Excel VBA. Вы когда-нибудь думали о создании программы, которая автоматически сохраняет ваш рабочий лист, и вам не нужно нажимать для этого кнопку Ctrl + S или кнопку Excel Save? Кажется, это фантастика, да? Однако это можно сделать. В VBA есть оператор команды под названием SendKeys, который позволяет вам отправлять нажатия клавиш в виде команды в приложение так же, как если бы вы использовали клавиатуру для выполнения задачи. (Например, сохранение файла. Вы нажимаете Ctrl + S на клавиатуре, чтобы сохранить файл). Рекомендуется использовать SendKeys в качестве последнего варианта при автоматизации любой задачи. Причина этого в том, что, как мы уже обсуждали, SendKeys отправляет нажатия клавиш активному в данный момент приложению. Что делать, если у вас есть окно приложения, активное во время выполнения кода, в котором вы не хотите, чтобы происходили изменения? Это даст неожиданные результаты, верно? Это единственная причина, мы должны использовать SendKeys как последний вариант при автоматизации вещей. Однако его можно использовать для небольшой автоматизации, когда никакая другая среда приложения не собирается мешать той, в которой вы хотели, чтобы произошли изменения.

    Синтаксис метода SendKeys

    Следующий синтаксис метода SendKeys:

    Оценка, Hadoop, Excel, мобильные приложения, веб-разработка и многое другое.

    SendKeys(String As String, [Подождите])

    Первый аргумент «Строка как строка» указывает комбинации клавиш, которые вы хотите использовать в программе (например, Ctrl + S будет комбинацией клавиш).

    Wait — необязательный параметр, принимающий логические значения TRUE и FALSE.Если ожидание имеет значение TRUE, это означает, что система будет ждать обработки ключей, а затем перейдет к следующей строке и скомпилирует/запустит то же самое. Если значение ожидания равно FALSE (можно оставить пустым), система не будет ждать обработки ключей и продолжит выполнение всего кода.

    Используются определенные методы, с помощью которых вы можете комбинировать нажатия клавиш с клавишами Ctrl, Shift или Alt. Давайте посмотрим, как мы можем это сделать. Ниже приведена таблица, в которой указаны комбинации клавиш для SendKeys с Ctrl, Shift и Alt:

    шириной
    Ключ для сочетания сОператор, который следует использовать перед клавишами для комбинации
    Shift + (Знак плюса на клавиатуре)
    Ctrl< /td> ^ (знак оператора каретки)
    Alt % (знак процента)

    Ну и что это значит? Это означает, что если вы хотите использовать комбинацию клавиш Ctrl + S под кодом, вы можете использовать метод SendKeys и сделать это с помощью SendKeys, затем оператора Caret (^) для Ctrl, а затем «s». Текущий рабочий лист будет сохранен в файле Excel.

    Как использовать метод SendKeys в Excel VBA?

    Мы узнаем, как использовать метод SendKeys в Excel, используя код VBA.

    Давайте рассмотрим несколько простых примеров, которые позволят нам глубже погрузиться в работу команды VBA SendKeys.

    В этом первом примере мы увидим очень простую автоматизацию, которая автоматически сохраняет текущий открытый файл Excel. Вам не нужно нажимать кнопку «Сохранить» или Ctrl + S, чтобы сохранить файл. Следуйте инструкциям ниже, чтобы добиться результата.

    Шаг 1. Откройте модуль на вкладке меню "Вставка", как показано ниже.

    Вставить модуль

    Шаг 2. Определите новую подпроцедуру, которая может содержать ваш макрос.

    Код:

    Шаг 3. Теперь, чтобы сохранить любой файл, у вас есть комбинация клавиш Ctrl + S. Чтобы преобразовать это в код, мы можем использовать оператор вставки (^), а затем ключевое слово «s» в качестве аргумента для Оператор SendKeys.

    Код:

     VBA SendKeys Example1-2

    Здесь ключевое слово Application указывает приложение, которому мы отправляем нажатия клавиш (в данном случае приложение Excel). «^s» в скобках указывает на аналогичную клавиатурную операцию Ctrl + S.

    Шаг 4. Запустите этот код, нажав кнопку "Выполнить" или нажав клавишу F5.

     Пример VBA SendKeys 1-3

    После успешного запуска этого кода ваш файл будет сохранен.

    Теперь мы увидим, как закрыть текущее приложение, отправив программные клавиши через код макроса с помощью метода SendKeys. Выполните следующие действия:

    Шаг 1. Напишите подпроцедуру, которая может содержать ваш макрос в модуле.

    Код:

    Шаг 2. Используйте метод Application.SendKeys, чтобы передать программные клавиши клавиатуры приложению. Поскольку текущую панель VBA можно закрыть с помощью сочетания клавиш Alt + Q, мы можем использовать «%q» под макросом.

    Код:

     Пример приложения 2-2

    Шаг 3. Нажмите кнопку "Выполнить" или клавишу F5, чтобы запустить этот код. Как только вы запустите этот код, текущий редактор Visual Basic закроется, и вы перейдете к файлу Excel.

     Пример VBA SendKeys 2-3

    Теперь мы собираемся написать код, который автоматически открывает Блокнот и автоматически записывает в него текст. Смотрите скриншот ниже:

    Шаг 1. Напишите подпроцедуру, которая может содержать ваш макрос в модуле.

    Код:

    Оболочка вызова позволяет системе открыть приложение. Путь — это место, где находится Notepad.exe. vbNormalFocus — необязательный аргумент, указывающий фокус на открытии и восстановлении исходного размера и положения приложения.

    Шаг 2. Используйте комбинацию клавиш вызова и отправки, чтобы система могла добавить текст в Блокнот.

    Код:

    Пример оболочки вызова 3-2

    Шаг 3. Здесь мы добавляем текст «Hello VBA!» используя SendKeys в Блокноте. True указывает время ожидания для команды SendKeys.

    Код:

     Пример VBA SendKeys 3-3

    Шаг 4. Запустите этот код, нажав клавишу F5 или кнопку "Выполнить".

     Пример блокнота 3-4

    Вот как мы можем использовать метод SendKeys для автоматизации приложений с помощью макроса VBA.

    Что нужно помнить

    • Будьте очень осторожны при использовании SendKeys, так как это может привести к неожиданным результатам, если у вас открыто несколько приложений.
    • Вы можете использовать SendKeys для автоматизации небольших задач, таких как сохранение файла Excel или закрытие файла Excel и т. д.
    • Используйте метод SendKeys в качестве последнего варианта, пока вы пытаетесь автоматизировать вещи.

    Рекомендуемая статья

    Это руководство по VBA SendKeys. Здесь мы обсуждаем, как использовать метод SendKeys в Excel VBA вместе с практическими примерами и загружаемым шаблоном Excel. Вы также можете ознакомиться с другими нашими рекомендуемыми статьями –

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