Содержание
- Класс TextBox — создание текстового поля VBA
- События класса TextBox VBA языка
- TextBox.Change event (Access)
- Syntax
- Remarks
- Support and feedback
- Событие TextBox.Change (Access)
- Синтаксис
- Замечания
- Поддержка и обратная связь
- Событие TextBox.Exit (Access)
- Синтаксис
- Параметры
- Замечания
- Пример
- Поддержка и обратная связь
Класс TextBox — создание текстового поля VBA
Давайте рассмотрим класс TextBox языка VBA, который позволяет размещать на форме текстовое поле. Класс vba TextBox позволяет создавать как многострочные, так и однострочные области для ввода текста, хот в последнем случае удобней воспользоваться функцией MsgBox. Также можно добавлять полосы прокрутки и определять максимальную длину вводимых символом. TextBox может использоваться и как компонент для ввода пароля.
Давайте для начала рассмотрим основные свойства класса TextBox и его базовое событие, а потом напишем пример.
События класса TextBox VBA языка
Value или Text – текст, который введен в текстовое поле TextBox
Visible – позволяет спрятать (значение false) или снова отобразить (значение true) элемент.
MultiLine – данное свойство позволяет задать, будет ли текстовое поле однострочным (false), или многострочным (true).
WordWrap – свойство актуально использовать, если MultiLine содержит значение true, в таком случае, если WordWrap установлено в true, то произойдет автоматический перенос текста на новую строку, когда будет достигнута граница текстового поля TextBox.
ScrollBars – позволяет указать, будут или отображаться полосы прокрутки. Свойство может принимать следующие значения:
- 0 – fmScrollBarsNone (полосы прокрутки отсутствуют)
- 1– fmScrollBarsHorizontal (горизонтальная полоса прокрутки)
- 2 – fmScrollBarsVertical (вертикальная полоса прокрутки)
- 3 – fmScrollBarsBoth (горизонтальная и вертикальная прокрутки)
PasswordChar – позволяет задать символ, который будет отображаться вместо вводимых данных. Свойство актуально при вводе пароля.
MaxLength – позволяет указать максимальное количество символов, которое можно ввести в текстовое поле. По умолчанию – 0, то есть, ограничения нет.
Как и у других элементов управления, у класса TextBox есть события, основным событием для TextBox является Change – оно возникает каждый раз, когда в текстовое поле вводится символ. Возможно вам приходилось видеть такую картинку: при вводе проверочного кода, пока его длинна не достигнет заданной (например, 12 символов), кнопка “Проверить” не будет доступной. Тут тоже можно такое реализовать.
Хорошо, теперь настало время практики. Я не буду снова вникать во все мелочи, как в прошлых статьях, поэтому скажу прямо: добавьте в проект новый модуль и новую форму. Выберите из окна ToolBox элемент управления Надпись (Label), добавьте ее на форму, пусть будет вверху, под ней поставьте текстовое поле (TextBox), а в самом низу – пусть будет кнопка (CommandButton с надписью “Проверить”). Хорошо, как и прежде, в редакторе кода для модуля прописываем процедуру:
Sub Module3() UserForm3.ShowEnd Sub
Учтите, что имя вашего модуля и формы могут отличаться.
Теперь нам нужно написать программный код на языке VBA, который будет делать следующее:
В текстовое поле будет вводиться текст, длина текста не больше 12 символов, пока длина будет меньше 12 символов, кнопка “Проверить” будет недоступна. Как только мы достигаем предела, кнопка становится активной, при нажатии на нее, содержимое текстового поля TextBox должно отобразиться в поле Label (Надпись).
И так, давайте посмотрим на процедуры, которые я прописал в редакторе кода для формы:
Private Sub bCheck_Click() Label1.Caption = TextBox1.TextEnd Sub
Тут идет обработка одиночного щелчка по кнопке, при нажатии на кнопку, свойству Caption объекта Label1 (Надпись) будет присвоено содержимое текстового поля TextBox1 (свойство Text).
Private Sub TextBox1_Change() Dim LenText As Byte LenText = Len(TextBox1.Text) If LenText = 12 Then bCheck.Enabled = True Else bCheck.Enabled = False End IfEnd Sub
Тут происходит обработка события Change для текстового поля объекта TextBox1 класса vba TextBox. Переменная LenText будет хранить длину вводимого текста, при каждом вводе данных будет происходить проверка длины, если она ровна 12 – то произойдет активация кнопки, иначе 0 кнопка будет неактивна.
Private Sub UserForm_Activate() Label1.Caption = «Введите любой текст» Label1.FontSize = 15 Label1.ForeColor = &H0 Label1.TextAlign = fmTextAlignCenter Label1.WordWrap = True TextBox1.MultiLine = False TextBox1.MaxLength = 12 TextBox1.FontSize = 15 bCheck.Enabled = FalseEnd Sub
В этой процедуре происходит настройка начальных значений, некоторые из них можно задать и в окне Свойств, но я решил для наглядности прописать все в программном коде. Тут нет ничего страшно, как только форма загрузится в память, кнопка “Проверить” будет неактивной, размер шрифта для текстового поля и надписи установлен в 20, также мы установили максимальную длину текста для класса TextBox VBA языка и его однострочность.
Источник
TextBox.Change event (Access)
The Change event occurs when the contents of the specified control change.
Syntax
expression.Change
expression A variable that represents a TextBox object.
Examples of this event include entering a character directly in the text box or combo box or changing the control’s Text property setting by using a macro or Visual Basic.
Setting the value of a control by using a macro or Visual Basic doesn’t trigger this event for the control. You must type the data directly into the control, or set the control’s Text property.
To run a macro or event procedure when this event occurs, set the OnChange property to the name of the macro or to [Event Procedure].
By running a macro or event procedure when a Change event occurs, you can coordinate data display among controls. You can also display data or a formula in one control and the results in another control.
The Change event doesn’t occur when a value changes in a calculated control.
A Change event can cause a cascading event. This occurs when a macro or event procedure that runs in response to the control’s Change event alters the control’s contents; for example, by changing a property setting that determines the control’s value, such as the Text property for a text box. To prevent a cascading event:
- If possible, avoid attaching a Change macro or event procedure to a control that alters the control’s contents.
- Avoid creating two or more controls having Change events that affect each other; for example, two text boxes that update each other.
Changing the data in a text box or combo box by using the keyboard causes keyboard events to occur in addition to control events like the Change event. For example, if you move to a new record and type an ANSI character in a text box in the record, the following events occur in this order:
KeyDown в†’ KeyPress в†’ BeforeInsert в†’ Change в†’ KeyUp
The BeforeUpdate and AfterUpdate events for the text box or combo box control occur after you have entered the new or changed data in the control and moved to another control (or clicked Save Record on the Records menu), and therefore after all of the Change events for the control.
In combo boxes for which the LimitToList property is set to Yes, the NotInList event occurs after you enter a value that isn’t in the list and attempt to move to another control or save the record. It occurs after all the Change events for the combo box. In this case, the BeforeUpdate and AfterUpdate events for the combo box don’t occur because Microsoft Access doesn’t accept a value that is not in the list.
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Событие TextBox.Change (Access)
Событие Change возникает при изменении содержимого указанного элемента управления.
Синтаксис
expression. Изменить
Выражение Переменная, представляющая объект TextBox .
Замечания
Примеры этого события включают ввод символа непосредственно в текстовое поле или поле со списком или изменение параметра свойства Text элемента управления с помощью макроса или Visual Basic.
Задание значения элемента управления с помощью макроса или Visual Basic не активирует это событие для элемента управления. Необходимо ввести данные непосредственно в элемент управления или задать свойство Text элемента управления.
Чтобы выполнить макрос или процедуру события при возникновении этого события, задайте для свойства OnChange имя макроса или [Процедура события].
Выполняя макрос или процедуру события при возникновении события Изменения , можно координировать отображение данных между элементами управления. Вы также можете отобразить данные или формулу в одном элементе управления, а результаты — в другом.
Событие Change не возникает при изменении значения в вычисляемом элементе управления.
Событие Change может вызвать каскадное событие. Это происходит, когда макрос или процедура события, выполняемая в ответ на событие Change элемента управления, изменяет содержимое элемента управления. Например, путем изменения параметра свойства, определяющего значение элемента управления, например свойства Text для текстового поля. Чтобы предотвратить каскадное событие, выполните приведенные далее действия.
- По возможности не присоединяйте макрос изменения или процедуру события к элементу управления, который изменяет содержимое элемента управления.
- Избегайте создания двух или более элементов управления с событиями изменения , влияющими друг на друга; например, два текстовых поля, которые обновляют друг друга.
Изменение данных в текстовом поле или поле со списком с помощью клавиатуры приводит к возникновению событий клавиатуры в дополнение к событиям управления, таким как изменение . Например, при переходе к новой записи и вводе символа ANSI в текстовом поле записи в этом порядке происходят следующие события:
KeyDown → KeyPress → BeforeInsert → Change → KeyUp
События BeforeUpdate и AfterUpdate для элемента управления «Текстовое поле» или «Поле со списком» возникают после ввода новых или измененных данных в элементе управления и перемещения в другой элемент управления (или нажатия кнопки Сохранить запись в меню «Записи «) и после всех событий Изменения элемента управления.
В полях со списком, для которых свойство LimitToList имеет значение Да, событие NotInList возникает после ввода значения, которого нет в списке, и попытки перейти к другому элементу управления или сохранить запись. Он возникает после всех событий Изменения для поля со списком. В этом случае события BeforeUpdate и AfterUpdate для поля со списком не возникают, так как Microsoft Access не принимает значение, отсутствующее в списке.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Событие TextBox.Exit (Access)
Событие Exit возникает непосредственно перед тем, как элемент управления теряет фокус на другом элементе управления в той же форме или отчете.
Синтаксис
expression. Выход (отмена)
Выражение Переменная, представляющая объект TextBox .
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Отмена | Обязательный | Integer | Установите значение True , чтобы отменить событие. |
Замечания
Это событие не применяется к флажкам, кнопкам параметров или переключателям в группе параметров. Он применяется только к самой группе параметров.
Чтобы выполнить макрос или процедуру события при возникновении этого события, задайте для свойства OnExit имя макроса или [Процедура события].
Так как событие Ввод возникает до перемещения фокуса к определенному элементу управления, для отображения инструкций можно использовать макрос или процедуру события Enter. Например, можно использовать макрос или процедуру события, чтобы отобразить небольшую форму или окно сообщения, определяющие тип данных, которые обычно содержатся в элементе управления, или дать инструкции по использованию элемента управления .
Событие Exit возникает перед событием LostFocus .
В отличие от события LostFocus , событие Exit не возникает, когда форма теряет фокус. Например, предположим, что вы установите флажок в форме, а затем щелкните отчет. При установке флажка возникают события ВВОД и GotFocus . При щелчке отчета возникает только событие LostFocus . Событие Exit не возникает (так как фокус перемещается в другое окно). Если снова установить флажок на форме, чтобы вывести ее на передний план, возникает событие GotFocus , но не событие ВВОД (так как элемент управления был фокусом, когда форма была последней активной). Событие Exit возникает только при щелчке другого элемента управления в форме.
При перемещении фокуса на элемент управления в форме, а у этого элемента управления нет фокуса на этой форме, события Exit и LostFocus для элемента управления, который имеет фокус на форме, происходят до событий ВВОД и GotFocus для элемента управления, в который вы перемещены.
Если вы используете мышь для перемещения фокуса с элемента управления в основной форме в элемент управления в подформе этой формы (элемент управления, который еще не имеет фокуса на подчиненную форму), возникают следующие события:
- Выход (для элемента управления в основной форме)
- LostFocus (для элемента управления в основной форме)
- Введите (для элемента управления подчиненной формы)
- Выход (для элемента управления в подчиненной форме, в которой был фокус)
- LostFocus (для элемента управления в подчиненной форме, на которой был фокус)
- Введите (для элемента управления в подчиненной форме, в которую переместился фокус)
- GotFocus (для элемента управления в подчиненной форме, в которую переместился фокус)
Если элемент управления, к которому вы переходите в подчиненную форму, ранее был фокусирован, ни его событие ВВОД , ни событие GotFocus не возникает, но событие ВВОД для элемента управления подчиненной формы не возникает. При перемещении фокуса с элемента управления на подчиненную форму на элемент управления в основной форме события Exit и LostFocus для элемента управления в подчиненной форме не возникают, просто событие Exit для элемента управления подчиненной формы и события ВВОД и GotFocus для элемента управления в основной форме.
Для перемещения фокуса на другой элемент управления часто используется мышь или клавиша, например TAB. Это приводит к возникновению событий мыши или клавиатуры в дополнение к событиям, описанным в этом разделе.
Пример
В следующем примере к текстовому поле LastName присоединяются две процедуры событий. Процедура события Ввод отображает сообщение с указанием типа данных, которые пользователь может ввести в текстовое поле. Процедура события Exit отображает диалоговое окно с запросом у пользователя, следует ли сохранить изменения, прежде чем фокус переместится на другой элемент управления. Если пользователь нажимает кнопку Отмена , аргумент Отмена имеет значение True (1), который перемещает фокус в текстовое поле без сохранения изменений. Если пользователь нажимает кнопку ОК , изменения сохраняются, а фокус перемещается на другой элемент управления.
Чтобы попробовать пример, добавьте следующую процедуру события в форму, содержащую текстовое поле LastName.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Давайте рассмотрим класс TextBox языка VBA, который позволяет размещать на форме текстовое поле. Класс vba TextBox позволяет создавать как многострочные, так и однострочные области для ввода текста, хот в последнем случае удобней воспользоваться функцией MsgBox. Также можно добавлять полосы прокрутки и определять максимальную длину вводимых символом. TextBox может использоваться и как компонент для ввода пароля.
Давайте для начала рассмотрим основные свойства класса TextBox и его базовое событие, а потом напишем пример.
События класса TextBox VBA языка
Value или Text – текст, который введен в текстовое поле TextBox
Visible – позволяет спрятать (значение false) или снова отобразить (значение true) элемент.
MultiLine – данное свойство позволяет задать, будет ли текстовое поле однострочным (false), или многострочным (true).
WordWrap – свойство актуально использовать, если MultiLine содержит значение true, в таком случае, если WordWrap установлено в true, то произойдет автоматический перенос текста на новую строку, когда будет достигнута граница текстового поля TextBox.
ScrollBars – позволяет указать, будут или отображаться полосы прокрутки. Свойство может принимать следующие значения:
- 0 – fmScrollBarsNone (полосы прокрутки отсутствуют)
- 1– fmScrollBarsHorizontal (горизонтальная полоса прокрутки)
- 2 – fmScrollBarsVertical (вертикальная полоса прокрутки)
- 3 – fmScrollBarsBoth (горизонтальная и вертикальная прокрутки)
PasswordChar – позволяет задать символ, который будет отображаться вместо вводимых данных. Свойство актуально при вводе пароля.
MaxLength – позволяет указать максимальное количество символов, которое можно ввести в текстовое поле. По умолчанию – 0, то есть, ограничения нет.
Как и у других элементов управления, у класса TextBox есть события, основным событием для TextBox является Change – оно возникает каждый раз, когда в текстовое поле вводится символ. Возможно вам приходилось видеть такую картинку: при вводе проверочного кода, пока его длинна не достигнет заданной (например, 12 символов), кнопка “Проверить” не будет доступной. Тут тоже можно такое реализовать.
Хорошо, теперь настало время практики. Я не буду снова вникать во все мелочи, как в прошлых статьях, поэтому скажу прямо: добавьте в проект новый модуль и новую форму. Выберите из окна ToolBox элемент управления Надпись (Label), добавьте ее на форму, пусть будет вверху, под ней поставьте текстовое поле (TextBox), а в самом низу – пусть будет кнопка (CommandButton с надписью “Проверить”). Хорошо, как и прежде, в редакторе кода для модуля прописываем процедуру:
Sub Module3() UserForm3.Show End Sub
Учтите, что имя вашего модуля и формы могут отличаться.
Теперь нам нужно написать программный код на языке VBA, который будет делать следующее:
В текстовое поле будет вводиться текст, длина текста не больше 12 символов, пока длина будет меньше 12 символов, кнопка “Проверить” будет недоступна. Как только мы достигаем предела, кнопка становится активной, при нажатии на нее, содержимое текстового поля TextBox должно отобразиться в поле Label (Надпись).
И так, давайте посмотрим на процедуры, которые я прописал в редакторе кода для формы:
Private Sub bCheck_Click() Label1.Caption = TextBox1.Text End Sub
Тут идет обработка одиночного щелчка по кнопке, при нажатии на кнопку, свойству Caption объекта Label1 (Надпись) будет присвоено содержимое текстового поля TextBox1 (свойство Text).
Private Sub TextBox1_Change() Dim LenText As Byte LenText = Len(TextBox1.Text) If LenText = 12 Then bCheck.Enabled = True Else bCheck.Enabled = False End If End Sub
Тут происходит обработка события Change для текстового поля объекта TextBox1 класса vba TextBox. Переменная LenText будет хранить длину вводимого текста, при каждом вводе данных будет происходить проверка длины, если она ровна 12 – то произойдет активация кнопки, иначе 0 кнопка будет неактивна.
Private Sub UserForm_Activate() Label1.Caption = "Введите любой текст" Label1.FontSize = 15 Label1.ForeColor = &H0 Label1.TextAlign = fmTextAlignCenter Label1.WordWrap = True TextBox1.MultiLine = False TextBox1.MaxLength = 12 TextBox1.FontSize = 15 bCheck.Enabled = False End Sub
В этой процедуре происходит настройка начальных значений, некоторые из них можно задать и в окне Свойств, но я решил для наглядности прописать все в программном коде. Тут нет ничего страшно, как только форма загрузится в память, кнопка “Проверить” будет неактивной, размер шрифта для текстового поля и надписи установлен в 20, также мы установили максимальную длину текста для класса TextBox VBA языка и его однострочность.
Элемент управления пользовательской формы TextBox в VBA Excel. Использование текстового поля для ввода и вывода информации, основные свойства, примеры. Привязка текстового поля к ячейке.
UserForm.TextBox – это элемент управления пользовательской формы, предназначенный для ввода, редактирования и вывода информации в текстовом формате.
Текстовое поле незаменимо, когда необходимо заполнить пользовательскую форму новой информацией. Например, это может быть ФИО нового сотрудника и его паспортные данные, сумма выручки за день, новый электронный адрес и многое-многое другое.
Если с помощью текстового поля требуется вводить заранее известную информацию, элементы которой можно сгруппировать в список, то в этом случае удобнее вместо элемента управления TextBox использовать ListBox или ComboBox.
Вводить информацию в TextBox на открытой форме можно не только с помощью клавиатуры, но и вставкой текста из буфера обмена. Когда текстовое поле применяется для ввода пароля, есть возможность отобразить все его знаки замещающим символом, например, звездочкой.
Иногда, если на пользовательской форме используется только одно текстовое поле и кнопка «OK» (или кнопки «OK» и «Отмена»), для ввода информации такую форму можно заменить функцией InputBox, а для вывода информации, когда не требуется редактирование отображаемого текста, – функцией MsgBox.
Свойства текстового поля
Свойство | Описание |
---|---|
AutoSize* | Автоподбор размера текстового поля. True – размер автоматически подстраивается под длину размещаемой строки. False – размер элемента управления определяется свойствами Width и Height. |
AutoTab | Включение автоматической табуляции – передачи фокуса следующему элементу управления при достижении максимального числа символов при значениях свойства MaxLenght > 0. True – автоматическая табуляция включена, False – выключена. |
ControlSource | Ссылка на источник данных для поля TextBox. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на TextBox. |
Enabled | Возможность ввода, редактирования, копирования, вставки, удаления текста. True – все перечисленные опции включены, False – выключены (цвет текста в поле становится серым). |
Font | Шрифт, начертание и размер текста в поле. |
Height | Высота текстового поля. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края текстового поля. |
Locked | Запрет ввода, редактирования, удаления текста. True – перечисленные опции запрещены (разрешено выделение и копирование текста), False – перечисленные опции разрешены. |
MaxLenght | Максимальная длина строки. По умолчанию – 0, что означает – ограничений нет. |
Multiline | Устанавливает многострочный (True) или однострочный (False) режим ввода-вывода текста. |
PasswordChar | Задает символ, который будет отображаться при вводе знаков пароля. |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой свойством AutoTab или нажатием клавиш «Tab», «Enter». Отсчет начинается с 0. |
Text** | Текстовое содержимое (значение) поля (=Value). |
TextAlign | Выравнивание текста: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края текстового поля. |
Value** | Текстовое содержимое (значение) поля (=Text). |
Visible | Видимость текстового поля. True – TextBox отображается на пользовательской форме, False – TextBox скрыт. |
Width | Ширина текстового поля. |
WordWrap | Актуально при Multiline = True. Переход на новую строку при достижении границы текстового поля. True – переход включен, False – переход выключен. |
* При использовании свойства AutoSize в значении True следует учитывать, что автоматическое изменение размеров поля при вводе текста может нарушить дизайн пользовательской формы.
** Text и Value — это два обозначения одного и того же свойства. Если в окне Properties элемента управления TextBox в поле свойства Text начать ввод строки, в поле Value ввод будет дублироваться. И наоборот, при вводе текста в поле свойства Value, дублирование произойдет в поле Text.
В таблице перечислены только основные, часто используемые свойства текстового поля. Все доступные свойства отображены в окне Properties элемента управления TextBox.
Свойства BackColor, BackStyle, BorderColor, BorderStyle отвечают за внешнее оформление текстового поля и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления TextBox на проекте пользовательской формы.
Привязка текстового поля к ячейке
Привязать элемент управления TextBox к ячейке на рабочем листе можно двумя способами.
1. В окне Properties элемента управления TextBox в поле свойства ControlSource необходимо указать адрес ячейки:
2. Присвоить свойству ControlSource адрес ячейки в коде VBA Excel:
UserForm1.TextBox1.ControlSource = «C5» |
Теперь ячейка C5 активного листа будет привязана к элементу управления TextBox1. При открытии формы текстовое поле будет заполнено значением ячейки C5.
Чтобы наглядно ознакомиться с взаимозависимостью значения ячейки C5 и содержимого текстового поля, разместите на пользовательской форме еще какой-нибудь элемент управления и откройте ее в немодальном* окне:
Sub Test() UserForm1.TextBox1.ControlSource = «C5» UserForm1.Show 0 End Sub |
Измените значение ячейки C5 и нажмите клавишу «Tab» или «Enter» – изменения будут продублированы в текстовом поле на форме. Измените содержимое поля TextBox1, нажмите клавишу «Tab» или «Enter», передав фокус другому элементу управления, – изменения продублируются в ячейке C5.
Чтобы привязать текстовое поле к ячейке неактивного листа, необходимо в адресе указать имя листа по ярлыку с разделителем «!»:
UserForm1.TextBox1.ControlSource = «Лист2!A3» |
Если имя листа содержит пробел, заключите его в одинарные кавычки:
UserForm1.TextBox1.ControlSource = «‘Мой лист’!B6» |
Точно также адрес ячейки конкретного листа можно указать непосредственно в окне Properties элемента управления TextBox в поле свойства ControlSource (без парных кавычек).
* Отображение пользовательской формы в немодальном окне позволяет редактировать ячейки на рабочем листе Excel, не закрывая форму.
Примеры использования TextBox
Пример 1
Обмен содержимым между текстовым полем, переменной и ячейкой на рабочем листе:
‘Присвоение текстовому полю значения ‘ячейки A2 и переменной a1 UserForm1.TextBox1.Text = Range(«A2») UserForm1.TextBox1.Text = a1 ‘Присвоение ячейке B3 и переменной a2 ‘значения текстового поля Cells(3, 2) = UserForm1.TextBox1.Text a2 = UserForm1.TextBox1.Value ‘Свойства Text и Value элемента ‘управления TextBox равнозначны |
Пример 2
Программное создание элемента управления TextBox, размещение его по центру пользовательской формы, добавление всплывающей подсказки и текста по умолчанию.
Предположим, что текстовое поле предназначено для ввода даты, поэтому добавляем соответствующую подсказку, а в качестве текста по умолчанию – текущую дату.
Создаем новую пользовательскую форму с именем UserForm2. Если у вас другое имя формы, это не имеет значения, так как обращаться к ней будем с помощью ключевого слова «Me». Открываем модуль созданной формы и вставляем в него следующий код VBA Excel:
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 |
Private Sub UserForm_Initialize() Dim myTextBox As Control ‘Создаем новый TextBox и присваиваем его переменной Set myTextBox = Me.Controls.Add(«Forms.TextBox.1») ‘Задаем размеры и заголовок пользовательской формы With Me .Height = 100 .Width = 220 .Caption = «Форма №2» End With ‘Присваиваем значения свойствам текстового поля With myTextBox .Width = 100 .Height = 20 ‘Left и Top рассчитаны для Excel 2016* .Left = 60 — 5 .Top = 40 — 15 ‘Добавляем всплывающую подсказку .ControlTipText = «Введите дату подписания договора» ‘Вставляем в поле текущую дату .Text = Format(Now, «DD.MM.YYYY») ‘Выравниваем текст по центру .TextAlign = 2 End With End Sub |
В результате выполнения кода откроется следующая форма с всплывающей подсказкой при наведении на TextBox курсора:
* Значения свойств Left и Top рассчитаны для Excel 2016. Вычитаемые числа зависят от толщины границ пользовательской формы, которые в других версиях Excel могут отличаться.
In this Article
- What are VBA events?
- Types of Events
- Dangers of Using Code in Events
- Disable Events
- Workbook Events Examples (not exhaustive)
- Workbook Open Event
- Workbook New Sheet Event
- Workbook Before Save Event
- Workbook Before Close Event
- Worksheet Event Examples (not exhaustive)
- Worksheet Change Event
- Worksheet Before Double Click Event
- Worksheet Activate Event
- Active X Control Events (not exhaustive)
- Command Button Click Event
- Drop Down (Combo Box) Change Event
- Tick Box (Check Box) Click Event
- UserForm Events (not exhaustive)
- UserForm Activate Event
- Change Event
- Click Event
- Chart Events
- Application Events
- Application.OnTime
- Application.OnKey
What are VBA events?
Events are happening all the time when a user opens an Excel workbook and starts doing various actions such as entering data into cells or moving between sheets
Within the Visual Basic Editor (ALT+F11), sub routines are already set up which can get fired off when the user does something e.g. entering data into a cell. The sub routine does not provide any action code, merely a ‘Sub’ statement and an ‘End Sub’ statement with no code between them. They are effectively dormant so nothing happens until you enter some code.
Here is an example based on the ‘Change’ event in a worksheet:
As a VBA programmer, you can add in code to make certain things happen when the user takes a specific action. This gives you the chance to control the user, and to prevent them taking actions that you do not want them to do and which might damage your workbook. For example, you may want them to save off their own individual copy of the workbook under another name, so that they do not affect the original, which may be being used by a number of users.
If they close the workbook, then they will automatically be prompted to save their changes. However, the workbook has a ‘BeforeClose’ event and you can enter code to prevent the workbook being closed and firing off a ‘Save’ event. You can then add a button to the worksheet itself and put your own ‘Save’ routine onto it. You can also disable the ‘Save’ routine using the ‘BeforeSave’ event
An understanding of how events work is absolutely essential to a VBA programmer.
Types of Events
Workbook Events – these events are fired off based on what the user does with the workbook itself. They include user actions such as opening the workbook, closing the workbook, saving the workbook, adding or deleting sheet
Worksheet Events – these events are fired off by a user taking actions on a specific worksheet. Every worksheet within the workbook has an individual code module, which contains various events specifically for that worksheet (not for all the worksheets). These include user actions such as changing the contents of a cell, double clicking on a cell, or right clicking on a cell.
Active X Control Events – Active X controls can be added to a worksheet using the ‘Insert’ icon on the ‘Developer’ tab in the Excel ribbon. These are often button controls to enable the user to take various actions under control of your code, but they can also be objects such as drop downs. Using Active X controls as opposed to Form controls on the worksheet gives a whole scope for programmability. Active X controls give you far more flexibility from a programming point of view over using form controls in a worksheet.
For example, you could have two drop down controls on your worksheet. You want the available list in the second drop down to be based on what the user chose in the first drop down. Using the ‘Change’ event on the first drop down, you can create code to read what the user has selected and then update the second drop down. You could also de-activate the second drop down until the user has made a selection in the first drop down
UserForm Events – You can insert and design a professional looking form to use as a pop-up. All the controls that you place on your form are Active X controls and they have the same events as the Active X controls that you might place on a worksheet
Chart Events – These events are only related to a chart sheet and not to a chart appearing as part of a worksheet. These events include resizing the chart or selecting the chart.
Application Events – These use the Application object in VBA. Examples would allow code to be fired off when a certain key is pressed or when a certain time is reached. You could program a situation where the workbook is left open 24/7 and it imports data from an external source overnight at a pre-determined time.
Dangers of Using Code in Events
When you write code to do something when the user takes a certain action, you need to bear in mind that your code could be triggering other events, which could put your code into a continuous loop.
For example, suppose that you use the ‘Change’ event on a worksheet so that when the user puts a value into a cell, a calculation based on that cell is placed into the cell immediately to the right of it.
The problem here is that the placing of the calculated value into the cell triggers another ‘Change’ event, which then in turn triggers yet another ‘Change’ event, and so on until your code has run out of columns to use, and throws up an error message.
You need to think carefully when writing the code for the event to ensure that other events will not be triggered inadvertently
Disable Events
You can use code to disable events to get around this problem. What you will need to do is to incorporate code to disable events whilst your event code is running and then re-enable events at the end of the code. Here is an example of how to do it:
Sub DisableEvents()
Application.EnableEvents = False
Application.EnableEvents = True
End Sub
Bear in mind that this disables all events right across the Excel application, so this would also affect other functions within Excel. If you use this for any reason, make sure that events are switched back on afterwards.
Importance of Parameters in Events
Events usually have parameters which you can use to find out more about what the user is doing and the cell location that they are in.
For example, the Worksheet Change event looks like this:
Private Sub Worksheet_Change(ByVal Target As Range)
By using the range object, you can find out the cell row/column coordinates that the user is actually in.
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Column
MsgBox Target.Row
End Sub
If you only want your code to work on a certain column or row number, then you add a condition that exits the subroutine if the column is not the required one.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
End Sub
This gets around the problem of your code triggering multiple events, since it will only work if the user has changed a cell in column 2 (column B)
Workbook Events Examples (not exhaustive)
The workbook events are found under the ‘ThisWorkbook’ object in the VBE Project Explorer. You will need to select ‘Workbook’ on the first drop down on the code window and then the second drop down will show you all the events available
Workbook Open Event
This event is fired off whenever the workbook is opened by a user. You could use it to put a welcome message to a user by capturing their username
Private Sub Workbook_Open()
MsgBox "Welcome " & Application.UserName
End Sub
You could also check their username against a list held on a hidden sheet to see if they are authorised to access the workbook. If they are not an authorised user, then you can display a message and close the workbook so that they cannot use it.
Workbook New Sheet Event
This event is triggered when a user adds a new sheet to the workbook
You could use this code to only allow yourself to add a new sheet, rather than have different users all adding sheets and making a mess of the workbook
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Application.DisplayAlerts = False
If Application.UserName <> "Richard" Then
Sh.Delete
End If
Application.DisplayAlerts = True
End Sub
Note that you need to switch off the alerts as a user warning will appear when the sheet is deleted which allows the user to circumvent your code. Make sure that you turn the alerts back on afterwards!
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Workbook Before Save Event
This event is triggered when the user clicks on the ‘Save’ icon, but before the ‘Save’ actually takes place
As described earlier, you may want to prevent users saving their changes to the original workbook, and force them to create a new version using a button on the worksheet. All that you need to do is to change the ‘Cancel’ parameter to True, and the workbook can never be saved by the conventional method.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
End Sub
Workbook Before Close Event
You can use this event to prevent users closing down the workbook, and again force them to exit through a worksheet button. Again, you set the ‘Cancel’ parameter to ‘True’. The red X in the top right-hand corner of the Excel window no longer works any more.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub
Worksheet Event Examples (not exhaustive)
The worksheet events are found under the specific sheet name object in the VBE Project Explorer. You will need to select ‘Worksheet’ on the first drop down on the code window and then the second drop down will show you all the events available
VBA Programming | Code Generator does work for you!
Worksheet Change Event
This event is triggered when a user makes a change to a worksheet, such as entering a new value into a cell
You can use this event to put an additional value or comment in next to the changed cell, but as discussed earlier, you do not want to start setting off a loop of events.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
ActiveSheet.Cells(Target.Row, Target.Column + 1). Value = _
ActiveSheet.Cells(Target.Row, Target.Column). Value * 1.1
End Sub
In this example, the code will only work if the value is entered into Column B (column 2). If this is true then it will add 10% to the number and place it into the next available cell
Worksheet Before Double Click Event
This event will fire off code if a user double clicks on a cell. This can be extremely useful for financial reports such as a balance sheet or profit & loss account where numbers are likely to be challenged by managers, especially if the bottom line is negative!
You can use this to provide a drill-down facility, so that when the manager challenges a particular number, all they have to do is double click on the number, and the breakdown appears as part of the report.
This is very impressive from a user’s point of view, and saves them constantly asking ‘why is this number so high?’
You would need to write code to find out the heading / criteria for the number (using the Target object properties) and then filter the tabular data and then copy it into the report.
Worksheet Activate Event
This event occurs when the user moves from one sheet to another. It applies to the new sheet that the user is moving to.
It could be used to ensure that the new sheet is completely calculated before the user starts doing anything on it. It can also be used to only re-calculate that particular sheet without re-calculating the entire workbook. If the workbook is large and has complicated formula in it, then re-calculating one sheet saves a lot of time
Private Sub Worksheet_Activate()
ActiveSheet.Calculate
End Sub
Active X Control Events (not exhaustive)
As discussed earlier, you can add Active X controls directly onto a worksheet. These can be command buttons, drop downs, and list boxes
The Active X events are found under the specific sheet name object (where you added the control) in the VBE Project Explorer. You will need to select the name of the Active X control on the first drop down on the code window and then the second drop down will show you all the events available
Command Button Click Event
When you have put a command button onto a spreadsheet, you will want it to take some action. You do this by putting code on the Click event.
You can easily put an ‘Are you sure message?’ on this so that a check is made before your code runs
Private Sub CommandButton1_Click ()
Dim ButtonRet As Variant
ButtonRet = MsgBox("Are you sure that you want to do this?", vbQuestion Or vbYesNo)
If ButtonRet = vbNo Then Exit Sub
End Sub
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Drop Down (Combo Box) Change Event
An Active X drop down has a change event, so that if a user selects a particular item from the drop-down list, you can capture their choice using this event and then write code to adapt other parts of the sheet or workbook accordingly.
Private Sub ComboBox1_Change ()
MsgBox "You selected " & ComboBox1.Text
End Sub
Tick Box (Check Box) Click Event
You can add a tick or check box to a worksheet so as to provide option choices for the user. You can use the click event on it to see if the user has changed anything on this. The values returned are True or False according to whether it has been ticked or not.
Private Sub CheckBox1_Click ()
MsgBox CheckBox1.Value
End Sub
UserForm Events (not exhaustive)
Excel provides the ability for you to design your own forms. These can be very useful to use as pop-ups to collect information or to provide multiple choices to the user. They use Active X controls as described previously and have exactly the same events, although the events depend very much on the type of control.
Here is an example of a simple form:
When it is displayed this is what it looks like on screen
You would use events on the form to do things like enter a default company name when the form is opened, to check the company name input agrees to one already in the spreadsheet and has not been mis-spelt, and to add code to the click events on the ‘OK’ and ‘Cancel’ buttons
The code and events behind the form can be viewed by double clicking anywhere on the form
The first drop down gives access to all the controls on the form. The second drop down will give access to the events
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
UserForm Activate Event
This event is triggered when the form is activated, normally when it is displayed. This event can be used to set up default values e.g. a default company name in the company name text box
Private Sub UserForm_Activate()
TextBox1.Text = "My Company Name"
End Sub
Change Event
Most of the controls on the form have a change event, but in this example, the company name text box can use the event to put a restriction on the length of the company name being entered
Private Sub TextBox1_Change ()
If Len (TextBox1.Text) > 20 Then
MsgBox "The name is restricted to 20 characters", vbCritical
TextBox1.Text = ""
End If
End Sub
Click Event
You can use this event to take action from the user clicking on controls on the form, or even the form itself
On this form there is an ‘OK’ button, and having collected a company name, we would want to place it in a cell on the spreadsheet for future reference
Private Sub CommandButton1_Click ()
ActiveSheet.Range("A1"). Value = TextBox1.Text
Me.Hide
End Sub
This code acts when the user clicks the ‘OK’ button. It puts the value in the company name input box into cell A1 on the active sheet and then hides the form so that user control is returned back to the worksheet.
Chart Events
Chart events only work on charts that are on a separate chart sheet, and not on a chart that is incorporated into a standard worksheet
Chart events are somewhat limited and cannot be used on a worksheet where you might well have multiple charts. Also, users do not necessarily want to switch from a worksheet containing numbers to a chart sheet – there is no immediate visual impact here
The most useful event would be to find out the component of a chart that a user has clicked on e.g. a segment in a pie chart, or a bar in a bar chart, but this is not an event available on the standard range of events.
This problem can be solved by using a class module to add a ‘Mouse Down’ event which will return details of the chart component that the user has clicked on. This is used on a chart within a worksheet.
This involves some very complicated coding, but the results are spectacular. You can create drill downs e.g. the user clicks on a pie chart segment and instantly that chart is hidden and a second chart appears in its place showing a pie chart of detail for the original segment, or you could produce the tabular data supporting that segment of the pie chart.
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Application Events
You can use the Application object in VBA to fire off code according to a particular event
Application.OnTime
This can enable you to fire off a piece of code at regular intervals for as long as the workbook is loaded into Excel. You may want to auto-save your workbook to a different folder every 10 minutes, or leave the worksheet running overnight so as to bring in the latest data from an external source.
In this example, a sub routine is entered into a module. It displays a message box to every 5 minutes, although this could easily be another coded procedure. At the same time, it resets the timer to the current time plus 5 more minutes.
Every time it runs, the timer resets to run the same sub routine in another 5 minutes time.
Sub TestOnTime()
MsgBox "Testing OnTime"
Application.OnTime (Now () + TimeValue("00:05:00")), "TestOnTime"
End Sub
Application.OnKey
This function enables you to design your own hot keys. You can make any key combination call a sub routine of your creation.
In this example the letter ‘a’ is redirected so that instead of placing an ‘a’ in a cell, it will display a message box. This code needs to be placed in an inserted module.
Sub TestKeyPress()
Application.OnKey "a", "TestKeyPress"
End Sub
Sub TestKeyPress()
MsgBox "You pressed 'a'"
End Sub
You run the sub routine ‘TestKeyPress’ first of all. You only need to run this once. It tells Excel that every time the letter ‘a’ is pressed it will call the sub routine ‘TestKeyPress’. The sub routine ‘TestKeyPress’ just displays a message box to tell you that you pressed key ‘a’. It could of course load a form or do all sorts of other things.
You can use any key combination that you can use with the ‘SendKeys’ function
To cancel this functionality, you run the ‘OnKey’ statement without the ‘Procedure’ parameter.
Sub CancelOnKey()
Application.OnKey "a"
End Sub
Everything is now back to normal.
В общем проблема состоит вот в чём. У меня есть форма, на ней куча текстбоксов, кнопок и меток (но это не важно). Каждый текстбокс и кнопка имеют свои определённые имена (не дефолтные). Мне на каждую кнопку и текстбокс нужно было привязать по одному обработчику одного события. И я воспользовался вот этим прекрасным методом:
1) Добавил класс cm_ControlsEvents, добавил ему необходимые контролы и соответствующие обработчики:
Код |
---|
Public WithEvents txbx As MSForms.TextBox Public WithEvents btn As MSForms.CommandButton Private Sub btn_Click() // выполняется код End Sub Private Sub txbx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) // выполняется код End Sub |
2) Далее в ощем модуле объявил массив этих самых классов
Код |
---|
Public controlsArray() As New cm_ControlsEvents |
3) И в процессе инициализации формы я заполняю массив ссылками на соответствующие контролы:
Код |
---|
Private Sub UserForm_Initialize() Dim item As Control, countControls As Integer ReDim controlsArray(Me.Controls.Count) countControls = 0 For Each item In Me.Controls If TypeOf item Is MSForms.TextBox Then Set controlsArray(countControls).txbx = item item.TabStop = True countControls = countControls + 1 ElseIf TypeOf item Is MSForms.CommandButton Then If item.Tag = "Copy" Then Set controlsArray(countControls).btn = item item.TabStop = False countControls = countControls + 1 End If ElseIf Not TypeOf item Is MSForms.Label Then item.TabStop = False countControls = countControls + 1 End If Next item End Sub |
Тут в код можно особо не вникать, всё там нормально заполняется и работает.
И теперь по клику на любой из кнопок корректно срабатывает событие btn_Click() и, соответственно, при нажатии клавиш в текстбоксе чётко отрабатывает событие txbx_KeyPress().
В общем проблем не было до тех пор, пока мне не понадобилось использовать событие txbx_Enter(). Дело в том, что если я его добавляю в класс cm_ControlsEvents
Код |
---|
Public WithEvents txbx As MSForms.TextBox Public WithEvents btn As MSForms.CommandButton Private Sub btn_Click() // выполняется код End Sub Private Sub txbx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) // выполняется код End Sub Private Sub txbx_Enter() // должен выполняться код End Sub |
то оно просто-напросто не срабатывает ни под каким предлогом. Однако если же я в модуле формы просто объявлю обработчик для какого-то конкретного текстбокса, вот так:
Код |
---|
Sub txbx_GPP_2_Enter() MsgBox "Event enter txbx!" End Sub |
то оно прекрасно срабатывает при фокусе на этом текстбоксе. Однако мне нужно этот обработчик поцепить на все текстбоксы в форме и я не понимаю почему именно это событие не срабатывает через класс cm_ControlsEvents.
Вот суть проблемы. Прошу гуру VBA поделиться дельным советом по этому поводу. Заранее благодарен