Функции для определения нажатых клавиш
Порой требуется определить, нажата ли на клавиатуре определённая клавиша.
К примеру, на одну кнопку на панели инструментов можно «повесить» 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 |
Доброго времени суток!
0 |
kandizzz 0 / 0 / 0 Регистрация: 01.03.2007 Сообщений: 5 |
||||||||
02.03.2007, 00:44 [ТС] |
3 |
|||||||
Я не силен в программировании на VBA, но если имеется в виду конструкция:
то она не работает: Compile error: VB считает в данном случае, что CommandButton — это Variable. Работает вариант:
но не устраивает, т.к. нужно конкретно указывать номер кнопки: CommandButton1.
0 |
rank1 |
||||
03.03.2007, 17:27 |
4 |
|||
Один из вариантов решения:
… И так далее — к-во хендлеров можем указать до 64кб — ограничение на размер модуля в вба. |
90 / 37 / 14 Регистрация: 03.11.2010 Сообщений: 429 |
|
04.03.2007, 00:24 |
5 |
Можно воспользоватся кнопкой с панели «Формы» и обработать нажатие в одном макросе:
0 |
kandizzz 0 / 0 / 0 Регистрация: 01.03.2007 Сообщений: 5 |
||||||||
04.03.2007, 01:01 [ТС] |
6 |
|||||||
rank1 Спасибо, конечно, за ответ, но это не соответствует условиям задачи. Используя Ваш пример, это должно выглядеть примерно так:
В противном случае нет смысла городить огород. Можно просто написать:
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() ). Все переменные обнуляются при работе в редакторе. По этому придётся заново его создавать.
0 |
0 / 0 / 0 Регистрация: 01.03.2007 Сообщений: 5 |
|
04.03.2007, 18:13 [ТС] |
9 |
Спасибо за разъяснение. Вопросов больше нет. Думаю, на этом тему можно закрыть.
0 |
govorun Пользователь Сообщений: 139 |
Доброго дня… На листе две кнопки (без макросов). Спасибо. Прикрепленные файлы
|
Sanja Пользователь Сообщений: 14838 |
#2 07.04.2018 09:31:37 Вы лучше опишите саму задачу, которую пытаетесь решить
Изменено: Sanja — 07.04.2018 09:46:35 Согласие есть продукт при полном непротивлении сторон. |
||
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
govorun, классы, события и в них определить что за объект задействован, но присоединяюсь к Sanja, смысл в чем? Много кнопок и чтоб не писать кучу макросов? Кнопки автоматом создаются и нужно обрабатывать объекты не дописывая обработчик для каждого? ….. По вопросам из тем форума, личку не читаю. |
govorun Пользователь Сообщений: 139 |
Sanja, Изменено: govorun — 07.04.2018 11:23:55 |
Sanja Пользователь Сообщений: 14838 |
#5 07.04.2018 09:55:20
См. обработчики нажатия этих кнопок выше(#2) Согласие есть продукт при полном непротивлении сторон. |
||
Ігор Гончаренко Пользователь Сообщений: 13746 |
#6 07.04.2018 10:00:01
читаем дальше:
ну нажата и что??? судя по сообщению #1 — это кнопки для нажимания, а не для макросов Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||||
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
govorun, в дополнение Есть два разных объекта кнопка Form Control и ActiveX Control. И осторожно, при такой работе можете терять стек UNDO, то есть отмена действий будет не возможна стандартным методом. По вопросам из тем форума, личку не читаю. |
govorun Пользователь Сообщений: 139 |
#8 07.04.2018 10:27:53
Совершенно верно…. |
||
govorun Пользователь Сообщений: 139 |
#9 07.04.2018 10:34:17
Понимаю… |
||
Sanja Пользователь Сообщений: 14838 |
Сообщение #2 видели? Согласие есть продукт при полном непротивлении сторон. |
govorun Пользователь Сообщений: 139 |
#11 07.04.2018 10:45:54 Sanja,
Или куда этот ((#2)) код записать? |
||
Sanja Пользователь Сообщений: 14838 |
Смотрите вторую Вашу тему. Там я, кстати за Вас, предложил адекватное название для темы Согласие есть продукт при полном непротивлении сторон. |
govorun Пользователь Сообщений: 139 |
Sanja,посмотрел, спасибо… |
Дмитрий Щербаков Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#14 07.04.2018 11:35:10
Кто вызвал функцию или процедуру? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
vikttur Пользователь Сообщений: 47199 |
Предложите название темы. Модераторы заменят. |
govorun Пользователь Сообщений: 139 |
Sanja, постом #2 проблема решена. |
vikttur Пользователь Сообщений: 47199 |
Вы не можете сами менять название. только модераторы. |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#18 07.04.2018 16:52:02
никто ничего не вызывал, ни функций ни процедур.
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||||
Дмитрий Щербаков Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#19 07.04.2018 17:02:57
но это не мешает на каждую кнопку повесить любой лажовый код и тогда кнопка таки будет что-то вызывать и можно будет понять, какая нажата Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Дима, и тут ноу-хау!!! начиняем лист кнопками без макросов! единственный вопрос, который возник у меня: «зачем ограничивать абсурд всего двумя кнопками? если есть возможность довести его до абсолюта!» Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
Off .. дааа, видел я макросы без кнопок, но кнопку без макросов вижу первый раз… » «…дааа, видала я котов без улыбок, но улыбку без кота вижу первый раз..» По вопросам из тем форума, личку не читаю. |
точно, чистое зазеркалье Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
govorun Пользователь Сообщений: 139 |
#23 07.04.2018 17:59:33
Что бы понять чего хочет сделать пользователь (#4).
1. Ноу-хау — это двигатель прогресса. И мне не совсем понятна Ваша реакция на появление ноу-хау. |
||||
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
#24 07.04.2018 18:04:31 двигатель прогресса — это лень человека. Вон зверье нелинивое, носится друг за другом, по скалам за травкой карабкается и ненужны им ни ноу ни хау
а вот это все обрабатывается и в правильно написанном коде такого не должно возникать. По вопросам из тем форума, личку не читаю. |
||
govorun Пользователь Сообщений: 139 |
#25 07.04.2018 18:25:45
Согласен в целом и полностью. |
||
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
#26 07.04.2018 18:39:32 Off
А вот это последствия использования Excel не совсем по назаначению. Наверно странно слышать от влюбленного в этот продукт человека, но я считаю ,что это не система для баз данных, коллективного пользования и.т.д. , хотя встречал очень сильно написанные инструменты. По вопросам из тем форума, личку не читаю. |
||
govorun Пользователь Сообщений: 139 |
#27 07.04.2018 18:50:56
Это был не Excel, это была (собственно и сейчас есть) база данных. |
||
БМВ Модератор Сообщений: 21380 Excel 2013, 2016 |
#28 07.04.2018 18:54:49 Off
Тогда как напрямую записи правились? Ладно, опустим. К теме не относится совсем. По вопросам из тем форума, личку не читаю. |
||
«если есть возможность сделать что-нибудь не правильно — обязательно найдется человек, который это сделает!» Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
govorun Пользователь Сообщений: 139 |
#30 08.04.2018 21:35:56 Оказалось проблема не решена. Макрос на кнопке можно править. Мне нужно отследить действие с кнопками, не прописать макрос для кнопки, а именно отследить действие, что кнопка нажата.
На кнопке не должно быть макроса. Изменено: govorun — 08.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 (левая) | % (процент) |
Примеры:
- Код
"^{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. Сочетания клавиш для кнопок.
Много кнопок — 1 макрос. Как опредеть какая кнопка нажата? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
������������� ������� ������
������������� ������� ������
����������� ������� 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 ������ ��. �����������, �� �������������� �����, ������� �������� ������������ ������ ���� ������� ������ �������. � ����� ���� ������, � ������� ������������ ����� �������, �� ����� ����� �� ����������� ������� ����� ��������� � ���. ���� ������������ ����������� ��������� ������� �� ������, �� �������� ��������� � ��� �� ��� ��� �� �����, �� ������ �������� � ������� ����� ����� ������ ��� ����� ����, ��� ������������ ������� �� ������ ��. ����� ������� ��� �� �������� ������� ������������ ������ ������ � �������� ���������� � ������������ �������, ����� �������� ��������� ��������� �� ������.