Если нажата клавиша vba excel

Функции для определения нажатых клавиш

Порой требуется определить, нажата ли на клавиатуре определённая клавиша.
К примеру, на одну кнопку на панели инструментов можно «повесить» 2 и более макросов, если есть возможность проверить, удерживались ли клавиши Ctrl и Shift в момент нажатия кнопки запуска макроса.

Для этого можно применить функцию KeyPressed:

'============= Функции для определения нажатой клавиши =================================
#If VBA7 Then
    Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal nVirtKey As VirtualKeys) As Integer
#Else
    Declare Function GetKeyState Lib "USER32" (ByVal nVirtKey As VirtualKeys) As Integer
#End If
 
Public Enum VirtualKeys    ' Virtual Keys, Standard Set
    VK_LBUTTON = &H1: VK_RBUTTON = &H2: VK_CANCEL = &H3: VK_MBUTTON = &H4
    'VK_MBUTTON = &H4 -  NOT contiguous with L RBUTTON
    VK_BACK = &H8: VK_TAB = &H9: VK_CLEAR = &HC: VK_RETURN = &HD
    VK_SHIFT = &H10: VK_CONTROL = &H11: VK_MENU = &H12: VK_PAUSE = &H13: VK_CAPITAL = &H14: VK_ESCAPE = &H1B
    VK_SPACE = &H20: VK_PRIOR = &H21: VK_NEXT = &H22: VK_END = &H23: VK_HOME = &H24
    VK_LEFT = &H25: VK_UP = &H26: VK_RIGHT = &H27: VK_DOWN = &H28: VK_SELECT = &H29: VK_PRINT = &H2A
    VK_EXECUTE = &H2B: VK_SNAPSHOT = &H2C: VK_INSERT = &H2D: VK_DELETE = &H2E: VK_HELP = &H2F
 
    ' VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'
    ' VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '9'

    VK_NUMPAD0 = &H60: VK_NUMPAD1 = &H61: VK_NUMPAD2 = &H62: VK_NUMPAD3 = &H63: VK_NUMPAD4 = &H64
    VK_NUMPAD5 = &H65: VK_NUMPAD6 = &H66: VK_NUMPAD7 = &H67: VK_NUMPAD8 = &H68: VK_NUMPAD9 = &H69
    VK_MULTIPLY = &H6A: VK_ADD = &H6B: VK_SEPARATOR = &H6C: VK_SUBTRACT = &H6D: VK_DECIMAL = &H6E: VK_DIVIDE = &H6F
    VK_F1 = &H70: VK_F2 = &H71: VK_F3 = &H72: VK_F4 = &H73: VK_F5 = &H74: VK_F6 = &H75: VK_F7 = &H76
    VK_F8 = &H77: VK_F9 = &H78: VK_F10 = &H79: VK_F11 = &H7A: VK_F12 = &H7B
    VK_F13 = &H7C: VK_F14 = &H7D: VK_F15 = &H7E: VK_F16 = &H7F: VK_F17 = &H80: VK_F18 = &H81
    VK_F19 = &H82: VK_F20 = &H83: VK_F21 = &H84: VK_F22 = &H85: VK_F23 = &H86: VK_F24 = &H87
    VK_NUMLOCK = &H90: VK_SCROLL = &H91
 
    '   VK_L VK_R - left and right Alt, Ctrl and Shift virtual keys.
    '   Used only as parameters to GetAsyncKeyState() and GetKeyState().
    '   No other API or message will distinguish left and right keys in this way.
    VK_LSHIFT = &HA0: VK_RSHIFT = &HA1: VK_LCONTROL = &HA2: VK_RCONTROL = &HA3: VK_LMENU = &HA4: VK_RMENU = &HA5
 
    VK_ATTN = &HF6: VK_CRSEL = &HF7: VK_EXSEL = &HF8: VK_EREOF = &HF9: VK_PLAY = &HFA
    VK_ZOOM = &HFB: VK_NONAME = &HFC: VK_PA1 = &HFD: VK_OEM_CLEAR = &HFE
End Enum
'==========================================================================================

Public Function KeyPressed(ByVal VKey As VirtualKeys) As Boolean
    KeyPressed = IIf(GetKeyState(VKey) < 0, True, False)
End Function

Теперь вы можете назначить одной кнопке 2 макроса:

Sub ПроцедураДляЗапускаСПанелиИнструментов()
    If KeyPressed(VK_CONTROL) Then Call Макрос1 Else Call Макрос2
End Sub
  • 17184 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

0 / 0 / 0

Регистрация: 01.03.2007

Сообщений: 5

1

Excel

Как определить нажатую кнопку?

01.03.2007, 14:00. Показов 19167. Ответов 8


Студворк — интернет-сервис помощи студентам

На рабочем листе Excel (не на форме) расположено N-ое количество управляющих элементов «CommandButton», поставленных на лист из Панели инструментов «Элементы управления», т.е. как OLEObject. Как можно определить, какая именно CommandButton была нажата во время работы, т.е. либо в переменную, либо в произвольную ячейку записать уникальный идентификатор нажатой кнопки. Решение с назначением кнопке макроса, в котором по событию Click в произвольную ячейку будет записываться, например, свойство Name кнопки НЕ подходит (не универсально, не гибко, слишком много кнопок).



0



2 / 2 / 0

Регистрация: 20.11.2011

Сообщений: 54

01.03.2007, 20:16

2

Доброго времени суток!
CommandButton.Index не подойдет?
С уважением, Анатолий



0



kandizzz

0 / 0 / 0

Регистрация: 01.03.2007

Сообщений: 5

02.03.2007, 00:44

 [ТС]

3

Я не силен в программировании на VBA, но если имеется в виду конструкция:

Visual Basic
1
2
3
Private Sub CommandButton1_Click()
     Лист1.Range("A1").Value = CommandButton.Index
End Sub

то она не работает:

Compile error:
Variable not defined

VB считает в данном случае, что CommandButton — это Variable.

Работает вариант:

Visual Basic
1
2
3
Private Sub CommandButton1_Click()
     Лист1.Range("A1").Value = CommandButton1.Index
End Sub

но не устраивает, т.к. нужно конкретно указывать номер кнопки: CommandButton1.



0



rank1

03.03.2007, 17:27

4

Один из вариантов решения:
Запускаем макрос Gen, в ворде появляется код сгенеренных N хендлеров событий от кнопок.
Вставляем сгенеренный код в вба модуль и теперь все вызовы от кнопок перенаправляются в одну процедуру.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
Sub gen()
    Dim t, i
    t = "'****VBA generated code****" & vbNewLine
    For i = 1 To 256
        t = t & "Private Sub CommandButton" & i & "_Click()" & vbNewLine & _
            " call cbhandler(" & i & ")" & vbNewLine & _
            "End Sub" & vbNewLine
    Next i
    '-----------------------------
    Dim w As New Word.Application
    w.Visible = True
    w.Documents.Add
    w.ActiveDocument.Range.Text = t
    Set w = Nothing
End Sub
 
Sub cbhandler(i As Long)
    MsgBox i
End Sub
'****VBA generated code****
Private Sub CommandButton1_Click()
 Call cbhandler(1)
End Sub
Private Sub CommandButton2_Click()
 Call cbhandler(2)
End Sub
Private Sub CommandButton3_Click()
 Call cbhandler(3)
End Sub

… И так далее — к-во хендлеров можем указать до 64кб — ограничение на размер модуля в вба.

90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

04.03.2007, 00:24

5

Можно воспользоватся кнопкой с панели «Формы» и обработать нажатие в одном макросе:
MsgBox CStr(Application.Caller)
Можно создать массив в Class Modules
См. пример для уже созданных в ручную кнопок.



0



kandizzz

0 / 0 / 0

Регистрация: 01.03.2007

Сообщений: 5

04.03.2007, 01:01

 [ТС]

6

rank1

Спасибо, конечно, за ответ, но это не соответствует условиям задачи.

Используя Ваш пример, это должно выглядеть примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub cbhandler()
    MsgBox "Уникальный идентификатор: " & _
    Unique_identifier_of_the_CommandButton
End Sub
 
'****VBA generated code****
 
Private Sub CommandButton1_Click()
    Call cbhandler(identifier)
End Sub
 
Private Sub CommandButton2_Click()
    Call cbhandler(identifier)
End Sub
 
Private Sub CommandButton3_Click()
    Call cbhandler(identifier)
End Sub

В противном случае нет смысла городить огород. Можно просто написать:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub CommandButton1_Click()
    Лист1.Range("A1").Value = 1
End Sub
 
Private Sub CommandButton2_Click()
    Лист1.Range("A1").Value = 2
End Sub
 
Private Sub CommandButton3_Click()
    Лист1.Range("A1").Value = 3
End Sub



0



0 / 0 / 0

Регистрация: 01.03.2007

Сообщений: 5

04.03.2007, 01:32

 [ТС]

7

Димит

<font color=»#FF0000 CommandButton_Array.zip</font> — это то, что нужно.

Как все, оказывается, просто, когда знаешь. Не поверишь, но я больше недели перекапывал интернет в поисках ответа и все бестолку.

Огромное человеческое спасибо!

Напоследок, растолкуй, пожалуйста, что означает:

После создания кнопок «CommandButtonN» закрой-открой файл или выполни макрос «AddMassiv

т.е., в каких случаях нужно запускать макрос «AddMassiv». Например, я включил и выключил на листе режим конструктора, и «AddMassiv» пришлось запускать снова.

С уважением,

Олег.



0



90 / 37 / 14

Регистрация: 03.11.2010

Сообщений: 429

04.03.2007, 06:11

8

В AddMassiv создаётся массив переменных ( Bt() ). Все переменные обнуляются при работе в редакторе. По этому придётся заново его создавать.
При добавлении кнопок на лист, добавленные кнопки не войдут в массив, т.е. опять придётся запустить макрос AddMassiv.



0



0 / 0 / 0

Регистрация: 01.03.2007

Сообщений: 5

04.03.2007, 18:13

 [ТС]

9

Спасибо за разъяснение. Вопросов больше нет.

Думаю, на этом тему можно закрыть.



0



 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

Доброго дня…

На листе две кнопки (без макросов).
Как в VBA определить, какая кнопка нажата?

Спасибо.

Прикрепленные файлы

  • L3.xls (35.5 КБ)

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#2

07.04.2018 09:31:37

Вы лучше опишите саму задачу, которую пытаетесь решить

Код
Sub Кнопка2_Щелчок()
    MsgBox "Нажата кнопка 2"
End Sub

Sub Кнопка1_Щелчок()
    MsgBox "Нажата кнопка 1"
End Sub

Изменено: Sanja07.04.2018 09:46:35

Согласие есть продукт при полном непротивлении сторон.

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

govorun, классы, события и в них определить что за объект задействован, но присоединяюсь к Sanja, смысл в чем? Много кнопок и чтоб не писать кучу макросов? Кнопки автоматом создаются и нужно обрабатывать объекты не дописывая обработчик для каждого? …..

По вопросам из тем форума, личку не читаю.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

Sanja,
Есть набор таблиц на скрытых листах. Я их не хочу показывать, а вернее давать возможность вручную добавлять туда данные.
Научен опытом…, потом гемороя не оберешься разгребать… Для ввода данных пользователю будет показан Лист,  на котором будет две кнопки и «умная таблица».
После заполнения таблицы будет нажата кнопка1 или кнопка2. Соответственно, либо данные таблицы (после проверки) запишутся  в другую основную таблицу, либо Лист скроется без сохранения данных. Таблица на Листе не статична (в части строк).  Количество столбцов статично, но не известно (зависит от количества  столбцов в основной таблице).
Может есть другой вариант?
Может через форму? — но я там не нашел подходящего стандартного прибамбаса.

Изменено: govorun07.04.2018 11:23:55

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#5

07.04.2018 09:55:20

Цитата
govorun написал: будет две кнопки

См. обработчики нажатия этих кнопок выше(#2)

Согласие есть продукт при полном непротивлении сторон.

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#6

07.04.2018 10:00:01

Цитата
govorun написал:
На листе две кнопки (без макросов).

читаем дальше:

Цитата
После заполнения таблицы будет нажата кнопка1 или кнопка2.

ну нажата и что??? судя по сообщению #1 — это кнопки для нажимания, а не для макросов

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

govorun,  в дополнение  Есть два разных объекта кнопка Form Control и ActiveX Control. И осторожно, при такой работе можете терять стек UNDO, то есть отмена действий будет не возможна стандартным методом.

По вопросам из тем форума, личку не читаю.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#8

07.04.2018 10:27:53

Цитата
Ігор Гончаренко написал:
это кнопки для нажимания

Совершенно верно….

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#9

07.04.2018 10:34:17

Цитата
БМВ написал:
отмена действий будет не возможна стандартным методом

Понимаю…
Екселевский файл создается с базовым (от слов База данных) подходом. Никакого прямого доступа к данным. Если коряво ввел данные — то так и останется, либо редактируй отдельные записи…
Будет обработчик на редактирование определенных записей.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Сообщение #2 видели?

Согласие есть продукт при полном непротивлении сторон.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#11

07.04.2018 10:45:54

Sanja,
Видел и ломаю голову, насколько это то. По всему видать — это тело макроса для кнопки. А мне нужно отследить действие с кнопками.

Код
If нажата кнопка1 Then
....
End if

Или куда этот ((#2)) код записать?  

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Смотрите вторую Вашу тему. Там я, кстати за Вас, предложил адекватное название для темы

Согласие есть продукт при полном непротивлении сторон.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

Sanja,посмотрел, спасибо…
а как самому название темы изменить?

 

Дмитрий Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#14

07.04.2018 11:35:10

Цитата
govorun написал:
А мне нужно отследить действие с кнопками.

Кто вызвал функцию или процедуру?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Предложите название темы. Модераторы заменят.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

Sanja, постом #2 проблема решена.
Дмитрий Щербаков, #14 полезная штука

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

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

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#18

07.04.2018 16:52:02

Цитата
Дмитрий Щербаков написал:
Кто вызвал функцию или процедуру?

никто ничего не вызывал, ни функций ни процедур.
см.#1

Цитата
На листе две кнопки (без макросов).

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Дмитрий Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#19

07.04.2018 17:02:57

Цитата
Ігор Гончаренко написал:
никто ничего не вызывал, ни функций ни процедур

но это не мешает на каждую кнопку повесить любой лажовый код и тогда кнопка таки будет что-то вызывать и можно будет понять, какая нажата :)
А так-то да, Игорь, ты прав. Я лишь привел пример статьи, которая может быть полезна для решения задачи

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Дима,
да просто удивление берет (мягко говоря)
навесить на лист две кнопки и не привязать к ним макросы!
и на кой они там, эти кнопки без макросов??? где смысл?
все стандартные элементы выполняют свои довольно четкие стандартные функции
привязка к кнопке макроса — это практически карма кнопок всегда и везде! в этом практически весь смысл существования этих элементов!
стандартная задача кнопки — по нажатию на нее активировать макрос, привязанный к этой кнопке.

и тут ноу-хау!!! начиняем лист кнопками без макросов! единственный вопрос, который возник у меня: «зачем ограничивать абсурд всего двумя кнопками? если есть возможность довести его до абсолюта!»

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

Off

.. дааа, видел я макросы без кнопок, но кнопку без макросов вижу первый раз… »

«…дааа, видала я котов без улыбок, но улыбку без кота вижу первый раз..»

По вопросам из тем форума, личку не читаю.

 

точно, чистое зазеркалье

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#23

07.04.2018 17:59:33

Цитата
Ігор Гончаренко написал: и на кой они там, эти кнопки без макросов???

Что бы понять чего хочет сделать пользователь (#4).

Цитата
Ігор Гончаренко написал: и тут ноу-хау

1. Ноу-хау — это двигатель прогресса. И мне не совсем понятна Ваша реакция на появление ноу-хау.
2. Возможно Вы не сталкивались с ситуациями, когда при нажатии на кнопку вылетает какая то ошибка и раскрывается код макроса. И дальше — что пользователю в голову взбредет. По-этому — минимум доступа к коду и данным.

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

#24

07.04.2018 18:04:31

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

Цитата
govorun написал:
вылетает какая то ошибка и раскрывается код макроса.

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

По вопросам из тем форума, личку не читаю.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#25

07.04.2018 18:25:45

Цитата
БМВ написал:
правильно написанном коде такого не должно возникать.

Согласен в целом и полностью.
Из опыта. Забыл закрыть в Комбобоксе возможность редактирования записей. Ушел в отпуск. Звонок коллеги.
— я не нашла в списке то, что мне нужно, что делать?
— рядом кнопку видишь на которой написано «Если не нашли — добавить»?
— да.
— нажимай и там все понятно…
Вышел с отпуска и обомлел. Вместо того что бы нажать на кнопку она в комбобоксе исправляла записи. Это была база данных. Я пол дня потратил что бы исправить. Хорошо что протокол соорудил.  

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

#26

07.04.2018 18:39:32

Off

Цитата
govorun написал:
Вместо того что бы нажать на кнопку она в комбобоксе исправляла записи.

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

По вопросам из тем форума, личку не читаю.

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#27

07.04.2018 18:50:56

Цитата
БМВ написал:
последствия использования Excel

Это был не Excel, это была (собственно и сейчас есть) база данных.
Я бы и сейчас за Excel не взялся, но судьба заставляет…

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

#28

07.04.2018 18:54:49

Off

Цитата
govorun написал:
Это был не Excel

Тогда как напрямую записи правились? Ладно, опустим. К теме не относится совсем.

По вопросам из тем форума, личку не читаю.

 

«если есть возможность сделать что-нибудь не правильно — обязательно найдется человек, который это сделает!»
правильный путь — не писать бестолковых макросов, а не удивляться бестолковости пользователей, для меня абсолютно очевидно, что виноват в этом случае программист, который понаоставлял граблей, а не пользователь, который на них наступил.
наивно рассчитывать, что в каждом поле ввода пользователь будет вносить ТОЛЬКО ПОДХОДЯЩИЕ данные при возможности внести разные)) и т.д.  

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

govorun

Пользователь

Сообщений: 139
Регистрация: 22.01.2017

#30

08.04.2018 21:35:56

Оказалось проблема не решена. Макрос на кнопке можно править. Мне нужно отследить действие с кнопками, не прописать макрос для кнопки, а именно отследить действие, что кнопка нажата.

Код
If нажата кнопка1 Then
... 
End if

На кнопке не должно быть макроса.

Изменено: govorun08.04.2018 21:36:32

To capture a specific key being pressed, you need the OnKey method:

Application.OnKey "~", "myMacro" ' for the regular enter key
' or if you want Enter from the numeric keypad:
' Application.OnKey "{ENTER}", "myMacro"
' Below I'll just assume you want the latter.

The above says that myMacro must be run when the Enter key is pressed. The OnKey method only needs to be called once. You could put it in the Workbook_Open event:

Private Sub Workbook_Open()
    Application.OnKey "{ENTER}", "myMacro"
End Sub

To stop capturing the Enter key,

Application.OnKey "{ENTER}"

To check whether Enter was pressed while on cell A1, you could do this:

Sub myMacro()
    If Not Intersect(Selection, Range("A1")) Is Nothing Then
    ' equivalent to but more flexible and robust than
    'If Selection.Address = "$A$1" Then
        MsgBox "You pressed Enter while on cell A1."
    End If
End Sub

Now to detect if Enter was pressed in a specific cell only if that cell has been edited, we have to be a bit clever. Let’s say you edit a cell value and press Enter. The first thing that is triggered is the OnKey macro, and after that the Worksheet_Change event is triggered. So you first have to «save the results» of OnKey, and then handle the Worksheet_Change event based on those results.

Initiate OnKey like this: Application.OnKey "{ENTER}", "recordEnterKeypress"

In your code module you would have this:

Public enterWasPressed As Boolean

Sub recordEnterKeypress()
    enterWasPressed = True
End Sub

The cell edit will be captured by the Worksheet_Change event:

Private Sub Worksheet_Change(ByVal Target As Range)
    If enterWasPressed _
        And Not Intersect(Target, Range("A1")) Is Nothing Then
        MsgBox "You just modified cell A1 and pressed Enter."
    End If
    enterWasPressed = False 'reset it
End Sub

Now, the above code does what you ask in the question, but I would like to reiterate: your question sounds awfully like an XY problem. Why do you want to detect the Enter key being pressed? Let us know and maybe we can suggest alternatives.

Метод 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 (левая) % (процент)

Примеры:

  1. Код "^{w}" соответствует сочетанию клавиш Ctrl+w.
  2. Код "^+{t}" соответствует сочетанию клавиш Ctrl+Shift+t.
  3. Код "%{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. Сочетания клавиш для кнопок.


Много кнопок — 1 макрос. Как опредеть какая кнопка нажата?

master88911

Дата: Пятница, 08.08.2014, 08:22 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Здравствуйте.

Составляю программку по составлению смет для личного пользования.
Суть проблемы.
Есть упорядоченные данные (несколько строк). Напротив этих данных висит кнопка «Внести».
Макрос должен делать типовую операцию — определить каким либо образом на какую кнопку нажали, в зависимости от этого выделить по нужным координатам необходимые строки и скопировать в новую книгу.

Т.к. макрос типовой, прописывать одно и тоже, к каждой кнопке глупо.

Прошу подсказать решение или предложить альтернативные варианты.

К сообщению приложен файл:

9107689.xlsx
(14.9 Kb)

 

Ответить

anvg

Дата: Пятница, 08.08.2014, 08:37 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Доброе время суток

Цитата

определить каким либо образом на какую кнопку нажали

Вас выручит Application.Caller в коде Кнопка1_Щелчок
Успехов.

 

Ответить

Rioran

Дата: Пятница, 08.08.2014, 09:40 |
Сообщение № 3

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

Замечаний:
0% ±


Excel 2013

master88911, здравствуйте.

Можно объявить Public числовую переменную Х. Пусть каждая кнопка будет в эту переменную складывать свой номер. Если кнопки будут идти по очереди, то можно будет установить прямое соответствие между номером кнопки и строкой, откуда надо брать данные. Каждая кнопка после изменения переменной Х будет вызывать макрос из модуля, т.е. код каждой кнопки будет одинаковый.

В Вашем файле уравнение для номера строки будет:

[Номер строки] = Х*5 — 2


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

 

Ответить

anvg

Дата: Пятница, 08.08.2014, 10:28 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Цитата

Каждая кнопка после изменения переменной Х будет


А как? На нажатие кнопки написать свою процедуру? ТС же, насколько понял, хочет иметь одну процедуру для всех кнопок

Цитата

Т.к. макрос типовой, прописывать одно и тоже, к каждой кнопке глупо.

Application.Caller же в коде одиночной процедуры, вызываемой разными кнопками, возвращает имя кнопки, что собственно и хочет ТС

Цитата

определить каким либо образом на какую кнопку нажали

Сообщение отредактировал anvgПятница, 08.08.2014, 10:29

 

Ответить

master88911

Дата: Пятница, 08.08.2014, 10:53 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Спасибо за подсказки. Но почесав голову решил танцевать от координат ячейки на которой стоит курсор.

[vba]

Код

stroka1 = ActiveCell.Row
For I = 3 To 10000 Step 11
If stroka >= I And stroka <= I + 11 Then
stroka = I
Exit For
End If
Next I

[/vba]

 

Ответить

RAN

Дата: Пятница, 08.08.2014, 11:16 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

<_<

К сообщению приложен файл:

9107689.xlsb
(16.1 Kb)


Быть или не быть, вот в чем загвоздка!

 

Ответить

master88911

Дата: Пятница, 08.08.2014, 12:23 |
Сообщение № 7

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

RAN, просто офигеть. shock

Всего 3 строки кода. Я восхищен.

Спасибо!!!

 

Ответить

������������� ������� ������

������������� ������� ������

����������� ������� KeyPress, KeyDown � KeyUp, ����� �������� �� ������� ������ �������������. ������� KeyPress ������ ������������ ��� ������������� ������ � �������� «�����������» ��������� (�����, �����, ����� ����������), ����� ����� ���������� ����������, �������� � ��������� ���� ��� � ���� �� �������. � ������� ����� ������� ������������ ����� ������ �� ���������� ���� <Ctrl+�������>, � ����� ������� <Backspace>. ������� ����� � ������, ��� ��������� ��� �������� ������������ ������ � ������� ��������� ��������� ������� KeyPress.

������� KeyDown � KeyUp, ��������, ���������� ����������� ����� ���������� �� ���������� ������, ������� ��������� ���� <Alt+Shift+Ctrl+F9>. � ����� ��������� �������� �������, ��� � KeyPress, �� ���� ��� ��������� ������������ ����� ������� ����� ��������� ������. ��������, ����� ������� ��������� ��������� ������� KeyDown, ������� ��������� � ������� ���������� <Ctrl+<-> � <Ctrl+->> �������������� ��������� ��� ����������� �������� ������ ���������, ��������, �� 10.

� ����� 10 �� �������� �������� ������, ����������� ��������� � ���, ��� ������������ ���� � ����� ���������� ��������. ����� �� ������� ��� ��������� �������.

� ������ ��������� ����� � ����� �� ������� ��������� ������� ��� �������� ������ �� �����������. ����������� ��������� ��������� ������� KeyPress, ����� ������ � ������ ������������ ������� � ������ ��������� �� �������������. ��������� ����������� ��� ��������� ������� ������ ����� � �����:

Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _

As MSForms.ReturnInteger)

‘ ���� ��������� ���� �������� ��������:

If Chr(KeyAscii) < «0» Or _

(Chr(KeyAscii) > «9» And Chr(KeyAscii) < «A») Or _

(Chr(KeyAscii) > «Z» And Chr(KeyAscii) < «a») Or _

Chr(KeyAscii) > «z» Then

MsgBox «������������ ������!»

KeyAscii = 0 ‘ ������������ �������

End If

End Sub

��, � �������, ��� ������������ ����� ������� ��������� �������� �������, �� ���� ��� ��������. ��� ������ �������� If … Then ��������� ������������ ������, ������������ ��������� �� ����. ����� ���� �������� KeyAscii = 0; KeyAscii �������� ���������� ��������� ��������� ������� KeyPress, ������� �� ������������ ��� ��������� ���������� � ������ ���������. ��������� ��� �������� ������ ��� �������, ������������� � ��������� ����. � ��������� ���� ��������� ���� �� ������������ ������, ������� ��� 0, ������������ ������������� ������������ ������ �������� ��� �����.

��������� �������� ��������� KeyAscii ��������� �������� ����������� ��������� ������ �� ����������. ��������, ��������� ��������� ��������� ������� ����� ������������ ��� ����������� � ���������� ��������� ������������� ������ � ���� ������, ����������� ������� �������� ��������:

Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _

As MSForms.ReturnInteger)

KeyAscii = Asc(UCase(Chr(KeyAscii)))

End Sub

��������, �������������� ��������������, ���������� ������������� ���� �������, ��������� ���� � ������. ��������� KeyAscii �������� �������� ����� �������, ������� ���������� �������������� ���� ��� � ������ � ������� ������� Chr, ����� ��������� ������ � ������� ������� � ������� UCase �, �������, �������������� ������ ����� � ����� ����� � ������� Asc.

���� �� ������ ������������� �������� �������� ���������� ��� ������ ���������, �������� ��������� ��������� ������� ��� ����������� ������� �� ����������� ����������. �� ������ ���������������� �������� �������� ������ �� �������, ����� ������������ �������� ���� ���������. ��������� ����� ������������ ��� �� ����������� ��� ����������� ������ �������������� �������� ��� ������ ����� ���, ��� ������������ �������� ��� ������ �� �������� ���������, — ��� ��� ������������ ��� ��������� ��������� �� ���������� ������������.

�������� �������� ����� ����� � � ��� ������, ���� ��� �������� ����� �������. ���� �������� ���������� ��������� ������ � ������� �� �����-������ ���� ������ ��� ������� �� Internet, ��, ��������, �� �������� ���������� ������������ �����, ���� ��������� ����� ������ ������ ��� ��������� ����� ������� ������� ������� � ������� ������ ������ ����.

����� ��������� �������� �������� ���������� ����� ����, ��� ������������ �������� ���� ���������, �������� ��������� ��������� ������� BeforeUpDate. ��� ������� ����������, ����� ������������ ������� �� ������ �������� ����������, �������� ������� <Tab> ��� �������� ���������� ������, ����������� ������� �������� ����������. VBA ������������ ������� BeforeUpDate ��������������� ����� ���, ��� �������� ������ ������� ����������, ��� �� � ������ �������� ���������� ������ � �������� �� �����, ��������� ������������ ��������� ������. ��������� ������ ����������, ��� ������������ �������� Cancel:

Private Sub txtSerial Number_Change()

If Len(t xt Serial Number.Value) > 5 Then

MsgBox «������� ����� ��������. ��������� ����.»

Cancel

End If

End Sub

������ ����� ����� �������� �������� ������ �������� ���������� �� ���� �������, ����� ������������ ������� �� ������ ��, ����������� �����. ��� ���������� ������ �����, ����� �������� �������� ���������� �������� ���������� ��������� ���������� � �����. ���� �� ������� ����� ��� ��������, ��������� ��������������� ����������� ��� � ��������� ��������� ������� Click ������ ��. �����������, �� �������������� �����, ������� �������� ������������ ������ ���� ������� ������ �������. � ����� ���� ������, � ������� ������������ ����� �������, �� ����� ����� �� ����������� ������� ����� ��������� � ���. ���� ������������ ����������� ��������� ������� �� ������, �� �������� ��������� � ��� �� ��� ��� �� �����, �� ������ �������� � ������� ����� ����� ������ ��� ����� ����, ��� ������������ ������� �� ������ ��. ����� ������� ��� �� �������� ������� ������������ ������ ������ � �������� ���������� � ������������ �������, ����� �������� ��������� ��������� �� ������.

Понравилась статья? Поделить с друзьями:
  • Если курсор в word маленький
  • Если команда excel правка заполнить прогрессия
  • Если количество символов в ячейке больше excel то
  • Если книги excel открываются в одном окне
  • Если исчезли вкладки в excel