Элемент управления пользовательской формы 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 могут отличаться.
Excel VBA TextBox
A TextBox is simply a box used to get input from a user. Text boxes are a part of UserForms. For example, in the Developer tab in any Excel worksheet, if we want to make text boxes in a UserForm, we can select the textbox option from user form controls in VBA, or in the worksheet, we can select it from the Design tab.
VBA TextBox is one of the many controls of the UserForm. By displaying the text box on the UserForm, we can ask them to enter the data into the text box. Furthermore, it can store the data entered by the user on the worksheet with simple codes.
Userforms are very attractive in VBA codingVBA code refers to a set of instructions written by the user in the Visual Basic Applications programming language on a Visual Basic Editor (VBE) to perform a specific task.read more. It helps us immensely, especially when we need input from the users. With UserForms, we have many controls. For example, to get the input value from the users, “Text Box” is the ideal option in a UserForm. By putting a text box on the UserForm, we can tell the user to enter the required value in the text box we display. If you have no idea about VBA text boxes, this article will take a tour of VBA text boxes.
Table of contents
- Excel VBA TextBox
- How to Insert TextBox in VBA UserForm?
- TextBox Properties
- Example of using TextBox in Userform
- Recommended Articles
- How to Insert TextBox in VBA UserForm?
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA TextBox (wallstreetmojo.com)
How to Insert TextBox in VBA UserForm?
You can download this VBA Text Box Template here – VBA Text Box Template
To insert a text box first, we need to insert a UserForm. To insert the UserForm, go to Insert > UserForm.
As soon as you click on UserForm, we will use UserForm just like another module.
Click on UserForm to see the controls of the UserForm.
From this “Controls” toolbox, select “TextBox” and drag on the UserForm.
With this, we can see many properties associated with this text box.
TextBox Properties
Press the F4 key to see the properties of the TextBox.
As we can see, the text box has a name, color, and border like this many. Now, give a proper name to refer to this text box while coding easily.
Example of using TextBox in Userform
We will conduct one of the projects with VBA textText is a worksheet function in excel but it can also be used in VBA while using the range property. It is similar to the worksheet function and it takes the same number of arguments. These arguments are the values which needs to be converted.read more. We will create a data entry user formThe form in Excel simplifies data entry by allowing us to view, add, edit, and delete one record in a horizontal orientation. It is a hidden feature that isn’t accessible through the ribbon tools. This functionality must be added using the quick access toolbar option under the File tab.read more to store the details of the employees.
Step 1: On the UserForm, draw the label.
Step 2: Change the default text of the label to “Employee Name.”
Step 3: In front of the label, draw a text box.
Step 4: Give a proper name to the text box as “EmpNameTextBox.”
Step 5: Draw one more label below the first label and enter the text as “Employee ID.”
Step 6: In front of the second label, draw one more text box and name it “EmpIDTextBox.”
Step 7: Draw one more label and enter the text as “Salary.”
Step 8: Draw one more text box in front of the “Salary” label and name it “SalaryTextBox.”
Step 9: Insert the “Command Button” from the ToolBox.
Step 10: Change the text of the command button to “Submit.”
We have completed the UserForm design part. Next, we need to write the code to store the data entered in this UserForm. As of now, run the UserForm by pressing the F5 key. We should see a UserForm like this.
Step 11: Change the caption of the UserForm in the “Properties” window.
Step 12: Now, double-click on the “Submit” command button. As soon as you double-click, you will see this auto-sub procedure like the one below.
What should happen when you click on the “Submit” button? First, we need to mention the tasks in the VBA code. In this project, we aim to store the data entered in the text box as soon as we click the “Submit” button.
For this, first, create a template like this in the worksheet named “Employees Sheet.”
Step 13: Now, come back to the Visual Basic Editor. Inside the button, click subroutine in VBASUB in VBA is a procedure which contains all the code which automatically gives the statement of end sub and the middle portion is used for coding. Sub statement can be both public and private and the name of the subprocedure is mandatory in VBA.read more first to determine the last used row by using the below code.
Code:
Private Sub CommandButton1_Click() Dim LR As Long LR = Worksheets("Employee Sheet").cell(Rows.Count, 1).End(xlUp).Row + 1 End Sub
Step 14: First, we will store “Employee Name” in the first column. So for this, we need to access the text box named “EmpNameTextBox.”
Code:
Private Sub CommandButton1_Click() Dim LR As Long LR = Worksheets("Employee Sheet").cell(Rows.Count, 1).End(xlUp).Row + 1 Ramge("A" & LR).Value = EmpNameTextBox.Value End Sub
Step 15: We need to store the “Employee ID” in the second column. So, we may obtain this by accessing the text box “EmpIDTextBox.”
Code:
Private Sub CommandButton1_Click() Dim LR As Long LR = Worksheets("Employee Sheet").cell(Rows.Count, 1).End(xlUp).Row + 1 Ramge("A" & LR).Value = EmpNameTextBox.Value Ramge("B" & LR).Value = EmpIDTextBox.Value End Sub
Step 16: At last, we need to store the salary part. For this, we need to access a text box named “SalaryTextBox.”
Code:
Private Sub CommandButton1_Click() Dim LR As Long LR = Worksheets("Employee Sheet").cell(Rows.Count, 1).End(xlUp).Row + 1 Ramge("A" & LR).Value = EmpNameTextBox.Value Ramge("B" & LR).Value = EmpIDTextBox.Value Range("C" & LR).Value = SalaryTextBox.Value End Sub
We have completed the coding part as well. Now, run the code using the F5 key. We should see a UserForm like the one below.
As of now, all the boxes are empty.
Fill in the details first.
Now, click on the “Submit” button. It will store the data on the worksheet.
Like this, you can keep entering the data and press the “Submit” button. It is a simple data entry UserForm with a text box.
Recommended Articles
This article has been a guide to VBA TextBox. Here, we learn how to insert and use textbox control in UserForm through Excel VBA, practical examples, and a downloadable template. Below you can find some useful Excel VBA articles: –
- VBA Close UserForm
- Excel VBA ArrayList
- Insert Row using VBA
- Using Not Equal in VBA
Excel VBA UserForm Textbox
TextBox is one of the UserForm control. You can select and drag TextBox on the UserForm. It is used to display text or edit existing text on the TextBox. TextBox can have static data or dynamic data. You can see how TextBox works and more details about UserForm TextBox Control on the UserForm in the following section.
- VBA TextBox Control on the UserForm
- Add Dynamic TextBox Control on the UserForm Using VBA
- Clear TextBox Control Using VBA
- Delete TextBox Control on the UserForm using VBA
VBA TextBox Control on the UserForm
Please find more details about VBA ActiveX TextBox Control on the UserForm.
-
- Go To Developer Tab and then click Visual Basic from the Code or Press Alt+F11.
- Go To Insert Menu, Click UserForm. Please find the screenshot for the same.
-
- Drag the TextBox control on the Userform from the Toolbox. Please find the screenshot for the same.
-
- Click on the properties.
- On the left side find ‘Text’ from the available properties.
- On the right side mention as ‘Welcome!’.
- Like this you can add number of Text Box controls on the UserForm according to your requirement.
Add ActiveX Dynamic Text Box Control on the UserForm Using VBA
Please find the following steps and example code, it will show you how to add dynamic TextBox control on the userform.
-
- Add Text Box and CommandButton on the userform from the toolbox.
- Right click on the CommandButton, click properties
- Change the CommandButton caption to ‘Create_TextBox ’
- Double click on the CommandButton
- Now, it shows the following code.
Private Sub CommandButton1_Click() End Sub
-
- Call the below procedure named ‘Add_Dynamic_TextBox ’ and find the below procedure to run.
Private Sub CommandButton1_Click() Call Add_Dynamic_TextBox End Sub
Procedure to call in the CommandButton:
Sub Add_Dynamic_TextBox() 'Add Dynamic TextBox and assign it to object 'Lbl' Set lbl = UserForm2.Controls.Add("Forms.TextBox.1") 'Assign TextBox Name lbl.Caption = "Dynamic TextBox" 'TextBox Border Style lbl.BorderStyle = 2 'TextBox Position lbl.Left = 10 lbl.Top = 10 End Sub
-
- Now, click F5 to run the macro, click ‘Create_TextBox ’ button to see the result.
- You can see the created dynamic Text Box which is shown in the following screen shot.
Clear ActiveX TextBox Control Using VBA
Please find the below code it will show you how to clear ActiveX Text Box control. In the below example ‘TextBox1’ is the text box name.
Sub Clr_TxtBx() TextBox1.Text = "" End Sub
Delete TextBox Control on the UserForm using VBA
Please find the below code, it will show you how to delete or remove the control on the UserForm. In the below example, its deleting the TextBox named ‘New TextBox’ which is on the UserForm named ‘UserForm4’. We can use Remove method to delete the controls which are created during run time. Controls which are created during design time cannot be deleted using this method. Please find the below example and screen shots for better understand.
Code 1: Adding control During Run Time
Private Sub CommandButton1_Click() 'We can use Add method to add the new controls on run time Set lblBtn = Me.Controls.Add("Forms.TextBox.1") With lblBtn .Top = 20 .Left = 20 .Caption = "New TextBox" .Name = "lblNew1" End With MsgBox "New TextBox Added" End Sub
Please find the below screen shot for your reference for the above macro and its output.
When we click on Add Command Button:
Code 1: Deleting or Removing Text Box control which is created during run time.
Private Sub CommandButton2_Click() 'We can use Remove method to delete the controls which are created during run time 'Note: Controls which are created on design time cannot be deleted using this method Me.Controls.Remove ("lblNew1") MsgBox "New TextBox Deleted" End Sub
Please find the below screen shot for your reference for the above macro and its output.
When we click on Delete Command Button:
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
-
-
- In this topic:
-
- VBA TextBox Control on the UserForm
- Add ActiveX Dynamic Text Box Control on the UserForm Using VBA
-
- Procedure to call in the CommandButton:
-
- Clear ActiveX TextBox Control Using VBA
- Delete TextBox Control on the UserForm using VBA
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
3 Realtime VBA Projects
with Source Code!
Go to Top
UserForm Controls — Label, TextBox and CommandButton
UserForm acts as a container in which you add multiple ActiveX controls, each of which has a specific use and associated properties. By itself, a UserForm will not be of much use unless ActiveX controls are added to it which are the actual user-interactive objects. Using ActiveX Controls on a Worksheet have been illustrated in detail, in the separate section of «Excel VBA: ActiveX Controls, Form Controls & AutoShapes on a Worksheet».
Also refer «2. UserForm and Controls — Properties» for properties common to the UserForm and most Controls
Note: In below given examples, vba codes are required to be entered in the Code Module of the UserForm, unless specified otherwise.
——————————-
Contents:
Label
CommandButton
TextBox
——————————-
Label
A Label Control displays text and is used to describe other controls viz. it is often used to describe a TextBox, or if you want to display instructions on the form. Use the Caption property to display text, the Left & Top properties to position it, the TextAlign property to align text within the Label, the Font property for font name/style/size, the BackColor and ForeColor properties for background and text colors. You can format a Label either in the Properties Window or using a VBA statement like Label1.Caption = «Enter brief particulars» or using the vba WITH statement as shown below.
Private Sub CommandButton1_Click()
‘clicking the command button in the UserForm will format the Label
With Label1
‘to display text
.Caption = «Enter brief particulars»
‘text alignment set to center
.TextAlign = fmTextAlignCenter
‘wrap text
.WordWrap = True
‘set font property
.Font.Name = «Arial»
.Font.Size = 12
.Font.Italic = True
‘set font color to yellow and background color to red
.ForeColor = RGB(255, 255, 0)
.BackColor = RGB(255, 0, 0)
End With
End Sub
———————————————————————————————————————-
CommandButton
A CommandButton is typically used to execute a macro. The Click event of the CommandButton is used to attach vba code to a CommandButton of a UserForm. In VBE (Visual Basic Editor), if the UserForm is visible, you can double-click on the CommandButton to access the Click event, or else you can select the name of the CommandButton (in the code module for the UserForm) from the top-left dropdown of the code window and then select Click from the top-right dropdown. Clicking on the CommandButton will run the code which is attached to the Click event or you can insert the name of a macro to be run on clicking the CommandButton. See below example(s):
Example 1 — The Click event which unloads the UserForm on clicking the CommandButton:
Private Sub CommandButton2_Click()
‘clicking on the button unloads the UserForm
‘display message before closing
MsgBox «Closing UserForm!»
‘unloads the UserForm
Unload Me
End Sub
Example 2 — Clicking the CommandButton will call (& execute) another macro whose name has been inserted — used typically when a set of codes are often or repeatedly required to be executed. Refer Images 5a (before Clear Button is clicked) & 5b (after Clear Button is clicked):
Private Sub CommandButton1_Click()
‘clicking on the «Clear» button will call another macro, named clearForm, which will get executed:
clearForm
End Sub
Private Sub clearForm()
‘this macro is called on clicking the «Clear» button — clears all controls in the UserForm:
‘clear all text appearing in TextBox
TextBox1.Value = «»
‘clear the text area of the ComboBox (ie. user-entered or user-selected value)
ComboBox1.Value = «»
‘deselect the CheckBox
CheckBox1.Value = False
‘deselect the OptionButton
OptionButton1.Value = False
End Sub
———————————————————————————————————————
TextBox
A TextBox accepts text or data from the user. In addition to the common properties mentioned earlier, its key properties include:
AutoTab Property: A Boolean value (True/False) which specifies whether the tab moves automatically to the next control in the tab order after the the maximum allowable number of characters (as determined by the MaxLength property) are entered in the TextBox by the user. False value (is the default) indicates moving manually to the next control in the tab order when the user presses the Tab key. This property is particularly useful in a case where the TextBox accepts a 5-digit item code number and the tab moves on automatically after 5 digits are entered.
EnterKeyBehavior Property: A Boolean value (True/False) which determines the effect when a user presses the ENTER key in a TextBox. If MultiLine property is set to True, then the True value indicates creating a new line on pressing ENTER while the False value (Default) moves focus to the next control in the tab order. If MultiLine property is set to False, then focus is always moved to the next control in the tab order ignoring the EnterKeyBehavior Property.
MaxLength Property: Specifies the maximum number of characters which can be entered in a TextBox. Specifying a value of 0 indicates there is no maximum limit.
MultiLine Property: A Boolean value (True/False) which determines if text will be displayed in multiple lines or not, in the TextBox. True indicates that the text is displayed in multiple lines, and this is also the default value. See the ScrollBars Property below for how a multiline TextBox can have vertical scroll bars and even a horizontal scroll bar under certain conditions. The WordWrap property is ignored in the single-line setting.
PasswordChar Property: Specifies what characters to display in TextBox instead of the characters actually entered or typed by the user. This property is useful to protect sensitive information or security codes, or to validate a user before allowing to proceed further.
ScrollBars Property: Specifies whether a TextBox has vertical and/or horizontal scroll bars, or none. There are 4 ‘self-explanatory’ settings: (i) fmScrollBarsNone (value 0) — this is the default setting; (ii) fmScrollBarsHorizontal (value 1); (iii) fmScrollBarsVertical (value 2); and (iv) fmScrollBarsBoth (value 3). The scroll bar setting fmScrollBarsNone displays no scroll bar. If AutoSize is set to True, no scroll bar is diplayed because the TextBox enlarges itself to accommodate the additional text or data. If WordWrap is set to True, a multiline TexBox displays no horizontal scroll bar. The scroll bar settings fmScrollBarsHorizontal or fmScrollBarsBoth, display a horizontal scroll bar in a singleline TextBox if the text is longer than the edit region. The scroll bar settings fmScrollBarsVertical or fmScrollBarsBoth, display a vertical scroll bar in a multiline TextBox if the text is longer than the edit region and WordWrap is set to True. To display a horizontal scroll bar in a multiline TexBox, the scroll bar setting should be fmScrollBarsHorizontal, WordWrap should be set to False and the text should be longer than the edit region. Note 1: A horizontal (or vertical) scroll bar is visible only if the control has enough room to include the scroll bar under (or at the right edge of) its edit region.
Text Property: The text in a TextBox is returned or set by this property. A value assigned to the Text property gets automatically assigned to the Value property, and vice-versa.
Example 1: You can Add a TextBox in a UserForm and format it (ie. apply or set properties), either in the Properties Window, or using VBA code as shown below.
Private Sub CommandButton1_Click()
‘click command button to create new TextBox and apply properties — a MultiLine TextBox with a vertical scroll bar
Dim txtSampleTextBox As MSForms.TextBox
Set txtSampleTextBox = Controls.Add(«Forms.TextBox.1», «txtSampleTB»)
With txtSampleTextBox
‘set font property
.Font.Name = «Times New Roman»
.Font.Size = 10
‘text alignment set to center
.TextAlign = fmTextAlignLeft
‘specify size
.Width = 100
.Height = 50
‘set position in the UserForm
.Left = 50
.Top = 75
‘set behaviour
.MultiLine = True
.WordWrap = True
.AutoSize = False
.ScrollBars = 2
‘set focus
.SetFocus
End With
End Sub
Example 2: Enabled Property of a TextBox is particularly useful where you do not want to allow the user to type directly into the TextBox which should be filled only per the user-selected option, say from a ListBox — see below vba code(s):
Private Sub UserForm_Initialize()
‘set properties for ListBox and TextBox on initialization of UserForm
‘populating ListBox with numbers 1 to 10; display a ControlTip instructing the user to select from ListBox.
With ListBox1
For i = 1 To 10
.AddItem i
Next i
.ControlTipText = «Select Number from ListBox, to enter in TextBox.»
End With
‘set Enabled Property to False so that the user cannot type directly; Note: ControlTip cannot be displayed when Enabled is set to False
Me.TextBox1.Enabled = False
End Sub
Private Sub ListBox1_Click()
‘ListBox click event
‘fills TextBox on ListBox selection
TextBox1.Text = ListBox1.Value
End Sub
Example 3: Use TextBox to set up a password — set multiple username-password matches to enable multi-user access.
In this Example we use the PasswordChar Property to check if username and password match, in which case the user is allowed to proceed and UserForm1 gets loaded. UserForm2 (Refer Image 6) contains TextBox1 for entering username and TextBox2 for entering password, and CommandButton1 which on being clicked matches the username & password, and on validating a match the UserForm1 is loaded allowing the user to proceed.
Private Sub UserForm_Initialize()
‘set properties for TextBox2 on initialization of UserForm2.
‘set maximum length for password field
TextBox2.MaxLength = 5
‘specify characters displayed in TextBox instead of the characters actually entered
TextBox2.PasswordChar = «*»
‘set yellow as background color
TextBox2.BackColor = RGB(255, 255, 0)
End Sub
Private Sub CommandButton1_Click()
‘use TextBox to set up a password; click command button to validate password to proceed to UserForm1.
Dim password As String
‘set matching usernames and passwords — (Angelina & 12345), (Brad & 23456) & (George & 34567)
If TextBox1.Text = «Angelina» And TextBox2.Text = «12345» Then
password = «True»
ElseIf TextBox1.Text = «Brad» And TextBox2.Text = «23456» Then
password = «True»
ElseIf TextBox1.Text = «George» And TextBox2.Text = «34567» Then
password = «True»
End If
‘if username and password match, the user is allowed to proceed and UserForm1 gets loaded:
If password = «True» Then
MsgBox «Password Validated! Please Continue.»
Unload Me
UserForm1.Show
‘if if username and password do not match, user is requested to try again:
Else
MsgBox «Incorrect UserName/Password. Try Again.»
‘clear both TextBox
TextBox1.Text = vbNullString
TextBox2.Text = vbNullString
‘set focus to TextBox1
TextBox1.SetFocus
End If
End Sub
What is VBA TextBox in Excel?
VBA TextBox is one of the many controls from UserForm controls in Excel. VBA TextBox can come handy when you want to have input from user like their name, age, address, salary, etc. Using TextBox control, you can allow users to input this kind of information and save many of your time as well as typo errors. VBA TextBox can consist of Static or Dynamic Data.
UserForm itself is a very useful tool which has different control options like TextBox, MsgBox, and InputBox, etc. which provide a more practical way to get data from user so that you can functionally process that data and find out some useful insights out of it.
In this article, you will be getting hands-on experience on Excel VBA TextBox.
Examples of Excel VBA TextBox
Below are the different examples of VBA TextBox in Excel.
You can download this VBA TextBox Excel Template here – VBA TextBox Excel Template
Example #1 – How to Insert TextBox in VBA?
Below are the steps to insert TextBox in Excel VBA.
Step 1: Open an excel file and hit Alt + F11 to navigate to VBA pane.
Step 2: As we already have discussed, TextBox is an option available in UserForm. So we need to insert UserForm in VBE. Go to Insert Menu > Click UserForm.
Step 3: As soon as you insert a UserForm in VBA you can see a Toolbox option associated with it and have different options associated with UserForm.
Step 4: In this toolbox select TextBox.
Step 5: Drag this TextBox on the user form.
Step 6: Hit F4 to see the properties of UserForm (Alternatively you can do this by right clicking on UserForm inserted). These properties allow you to make some necessary changes like changing the name of UserForm to be able to access it easily.
Some other basic changes you can do with properties pane of UserForm are like changing the Font, Changing the size, etc.
Step 7: Input the text as “Welcome to VBA TextBox!” in TextBox under UserForm.
This is how you can create a VBA TextBox.
Example #2 – Setting Value to VBA TextBox
Let’s see how we can set the values for TextBox. It is sometimes mandatory to set the values otherwise, the user will input anything of their interest.
Step 1: Insert a New UserForm in VBE. Go to Insert menu > click on UserForm.
Step 2: From UserForm Tools, select TextBox and drag it to UserForm.
Step 3: Insert a CommandButton under UserForm in the same way you added TextBox.
Step 4: Change the caption of the command button to “Submit” under properties. You can navigate to properties of command button by Right Click on Command Button > Click Properties.
Step 5: Double click on the submit button or Right click on it and select View Code.
Step 6: In the code, insert a line of new code within sub-procedure as below.
Code:
Private Sub CommandButton1_Click() TextBox1.Value = "My Name is Lalit!" End Sub
This highlighted code allows you to assign the value at right enclosed in double quotes to the TextBox. You can also use TextBox.Text property instead of TextBox.Values to set the value for TextBox.
Step 7: Hit F5 or Run button under VBE to run this code, you will see a UserForm with empty TextBox. As soon as you hit the submit button, the text assigned to TextBox will appear there in it.
Example #3 – Restrict TextBox Input to Accept only Numeric Values
Follow the below steps:
Step 1: Insert a new UserForm in your VBA and add TextBox in it.
Step 2: Change the name of TextBox under Properties section to “My_Age”.
Step 3: Double click on TextBox or right click on it and select View Code.
You’ll be able to see the initial sub-procedure as below:
Code:
Private Sub My_Age_Change() End Sub
Step 4: Now, try to add an If the condition which starts with If Not.
Code:
Private Sub My_Age_Change() If Not End Sub
Step 5: Ask compiler to check if the value of TextBox “My_Age” is numeric or not using IsNumeric Keyword in front of If Not condition.
Code:
Private Sub My_Age_Change() If Not IsNumeric(My_Age.Value) End Sub
Step 6: As every IF condition asks, add a Then Keyword for it.
Code:
Private Sub My_Age_Change() If Not IsNumeric(My_Age.Value) Then End Sub
In this piece of code, you are asking the compiler to check whether the value inputted by the user under TextBox is numeric or not. If, it’s not numeric, then what to do? Follow the next step.
Step 7: With the use of MsgBox, add a comment like “Sorry! Only Numbers are Allowed.” to be displayed if, the value in TextBox is not numeric.
Code:
Private Sub My_Age_Change() If Not IsNumeric(My_Age.Value) Then MsgBox "Sorry! Only Numbers are Allowed." End Sub
Step 8: Now, close this IF statement by using keyword End IF.
Code:
Private Sub My_Age_Change() If Not IsNumeric(My_Age.Value) Then MsgBox "Sorry! Only Numbers are Allowed." End If End Sub
Step 9: Now, run this code by hitting the F5 button from your keyboard or Run button from VBE and see the output. You’ll get a TextBox as shown below:
Now, I try to input an Integer value in it and see whether it actually allows me to input the same or not.
Bingo, it allows me to store the integer value.
Now, let’s try to add some float (Value with Decimal points) to this text box and see whether it allows us to input the same.
Let’s check if this text box allows us to store some negative values under it or not. I will type some negative number and check.
Well! Well!! Well!!!, it shoots a message me saying only numbers are allowed. It happened because this code written initially is with IF condition, it doesn’t have any workaround what to do if the number is non-positive. Moreover, Age can’t be negative. Right? Therefore, I am getting a warning message as you can see above. However, If you click OK in the message box and try inputting the number, it will allow you to do so. But I will not recommend breaking the rules over there.
Finally, let’s try some text string in the box and see if it allows the same to be stored under textbox or not.
As rightly expected, as soon as I entered the first string letter, the system prevented me to do so by throwing a message. This is because we have mentioned a condition in our code saying if the value is not numeric, please throw a message towards the user saying only numeric values are allowed.
Things to Remember
- VBA TextBox is a special option under UserForm. Which is designed to take input from the user itself.
- There are two methods to set the values for a TextBox: by using TextBox.Text and by using TextBox.Value.
- Sometimes it’s mandatory to restrict the user input so that we are getting the right type of data.
Recommended Articles
This is a guide to VBA TextBox. Here we discuss how to Create TextBox in Excel VBA along with practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA IsNumeric
- VBA UCASE
- VBA Close UserForm
- VBA Text
“I want to think that there is someone with sound judgement at the controls” – Martin Feldstein
The Webinar
If you are a member of the website, click on the image below to view the webinar for this post.
(Note: Website members have access to the full webinar archive.)
Introduction
In the first post on UserForms we looked at the general use of the UserForm.
In this post we are going to look at the individual VBA controls and how to use them. We will cover the most commonly used VBA controls. These are the Checkbox, ComboBox, CommandButton, Label, ListBox and TextBox. For each control, I will cover their most common uses and provide plenty of code examples you can use in your own projects.
The UserForm Controls
We add controls to the UserForms to allow the user to make selections, enter text or click a button. To add a control to a UserForm we do the following
- Go to the Toolbox dialog – if not visible select View->Toolbox.
- Click on the control icon you want to add – the icon will appear selected(pressed in) until you click another one.
- Put the cursor over the UserForm.
- Hold down the left mouse button and drag until the control is the size you want.
- To select or move a control click on the Select Objects icon(very left one) on the toolbox and this will put you in select mode.
The following table shows a list of the common controls
Control | Description |
---|---|
CheckBox | Turn item on/off |
ComboBox | Allows selection from a list of items |
CommandButton | Click to perform action |
Label | Displays text |
ListBox | Allows selection from a list of items |
Textbox | Allows text entry |
Properties of the Controls
The screenshot below shows the three important Windows when adding controls to a UserForm. These are
- The Properties Window.
- The Toolbox Dialog.
- The UserForm design Window.
UserForm Windows
If you click on any control or the UserForm itself you will see the properties of the selected item displayed in the Properties window. You can change the name, caption etc. in this Window.
To change the name of the UserForm do the following
- Click on the UserForm in the Project window or click on the UserForm itself.
- Click in the (Name) field of the Properties window.
- Enter the new name in this field.
Adding the Code
You can view the code of the UserForm in the following ways
- Double click on the UserForm.
- Right click on the UserForm itself and select View Code.
- Right click on the UserForm in the Project windows and select View Code.
Common control functions
The following table shows the most commonly used functions that are available to all controls.
Function | Operation | Example |
---|---|---|
Enabled | Enable/Disable control | combobox.Enabled = True textbox.Enabled = False |
SetFocus | Sets the focus to the control (cannot use with the Label) |
combobox.SetFocus |
Visible | Show/Hide control | combobox.Visible = True textbox.Visible = False |
' https://excelmacromastery.com/ Private Sub checkboxAddNotes_Click() ' Enable texbox when checkbox set to true If checkboxAddNotes.Value = True Then textboxNotes.Enabled = True textboxNotes.SetFocus Else textboxNotes.Enabled = False End If End Sub
The CheckBox
The CheckBox Cheat Sheet
Function | Operation | Example |
---|---|---|
Caption | Get/Set the text | checkbox.Caption = «Apple» |
Value | Get the checked state | If checkbox.Value = True Then |
Value | Set the checked state | checkbox.Value = False |
The CheckBox is a simple control that allows the user set something to on or off. You will often see them used on web pages where you are asked to accept terms and conditions.
Turning the CheckBox on or off
We can turn the CheckBox on or off by setting it to true or false
' Set the check on CheckBoxTerms.Value = True ' Set the check off CheckBoxTerms.Value = False
Checkbox Event with example
If we want to create an action when the user clicks on the checkbox then we create a checkbox event. This is simply a sub that runs when the checkbox is clicked.
To create this event simply click on the checkbox in design mode and you will get the following
Private Sub CheckBoxTerms_Click() End Sub
The following code shows an example of how we use it
' https://excelmacromastery.com/ Private Sub CheckBoxTerms_Click() If checkboxTerms.Value = True Then buttonOk.Enabled = True Else buttonOk.Enabled = False End If End Sub
The Label
The Label Cheat Sheet
Function | Operation | Example |
---|---|---|
Text | GetSet the text | textbox1.Text = «Apple» |
The label is the most simple control. Generally speaking, we don’t refer to it in the code. It is used to label the controls or display a short notice.
Setting the Label Text
You can set the text of the Label in the code using the Caption property
LabelAddress.Caption = "Customer Address"
The TextBox
The TextBox Cheat Sheet
Function | Operation | Example |
---|---|---|
Text | Set the text | textbox1.Text = «Apple» |
Text | Get the text | sFruit = textbox1.Text |
Value | Set the text | textbox1.Value = «Apple» |
Value | Get the text | sFruit = textbox1.Value |
Setting the Textbox Text
The textbox is used to allows the user to enter text. We can read or write from a text box as follows
TextBoxNotes.Value = "It was the best of times."
sNotes = TextBoxNotes.Value
The textbox has properties Text and Values. These are the same thing.
From MSDN: For a TextBox, any value you assign to the Text property is also assigned to the Value property.
The problem with the text box is that the user can enter anything. If the user is entering basic text then this is fine. If the text is to be used for a calculation or for looking up something then we need to validate it.
For example, if the user is going to pick a year between 2010 and 2019 we should use a ComboBox/Listbox that only contains valid years. Then we don’t need to validate the format and range of the user’s entry.
Making a TextBox numeric only
The following code prevents the user entering anything other than a number in the textbox
' https://excelmacromastery.com/ Private Sub textboxComments_KeyPress( _ ByVal KeyAscii As MSForms.ReturnInteger) Select Case KeyAscii Case Is < vbKey0, Is > vbKey9 KeyAscii = 0 Beep End Select End Sub
Using a Date Control
If you the user to select a date you can use the MonthView control. It is one of the additional controls that comes with Visual Basic. It works quite well and looks like the standard date picker you see in most applications.
To add the MonthView control:
- Go the the Visual Basic editor and make sure the Toolbox is visible(View->Toolbox if it’s not visible).
- Select Tools and then Additional Controls from the menu.
- Place a check on Microsoft MonthView Control, Version 6.0.
- The MonthView control will now appear on the Toolbox.
To get the user selection from the MonthView control you can use the DateClick event as the following code shows
' https://excelmacromastery.com/ Private Sub MonthView1_DateClick( _ ByVal DateClicked As Date) ' Store date in textbox TextBox1.Value = MonthView1.Value End Sub
For more information on the MonthView see these links:
Issues adding the MonthView – see top answer on this StackOverflow page
MSDN – Using the MonthView Control
The ComboBox
The ComboBox Cheat Sheet
Function | Operation | Example |
---|---|---|
AddItem | Add an item | listbox.AddItem «Spain» |
Clear | Remove all Items | combo.Clear |
List | Add a range of items | combo.List = Range(«A1»).Value |
ListCount | Get the number of items | cnt = combo.ListCount |
ListIndex | Get/set selected item | Idx = combo.ListIndex combo.ListIndex = 0 |
ListRows | Get/set number of items displayed | NoItems = combo.ListRows combo.ListRows = 12 |
RemoveItem | Remove an item | combo.RemoveItem 1 |
Value | Get the value of selected Item | Dim sCountry As String sCountry = combo.Value |
The ComboBox is used to allow the user to select an item from a list. It is very similar to the listbox. The main difference is the listbox allows multiple selections.
In most cases we want to do four things with the ComboBoxListBox
- Fill it with data when the Form is loaded
- Preselect an item.
- Retrieve the currently selected item(s).
- Perfom an action when the user selects a different item.
Filling the Combobox with data
We can fill the combobox one item at at a time using the AddItem property.
comboBoxFruit.AddItem "Apple" comboBoxFruit.AddItem "Pear"
You would normally use AddItem in a loop where you are checking each item before adding it
Dim cell As Range ' Fill items with first letter is A For Each cell In Sheet1.Range("A1:A50") If Left(cell.Value, 1) = "A" Then comboBoxFruit.AddItem cell.Value End If Next
Filling the ComboBox from a range
If you want to fill the ComboBox from an entire range you can do it in one line of code
comboBoxFruit.List = Sheet1.Range("A1:A5").Value
Normally when you fill a ComboBox you want to clear the existing contents first
' Clear any existing item comboBoxFruit.Clear ' Fill the ComboBox comboBoxFruit.List = Sheet1.Range("A1:A5").Value
Filling the ComboBox – No duplicates
If our range has multiple entries then we want to avoid adding the same item multiple times. We can do this using a Dictionary
' https://excelmacromastery.com/ Sub TestDuplicates() ' clear existing values comboBoxFruit.Clear ' Fill given ComboBox from given range ignoring duplicates FillComboNoDuplicates comboBoxFruit, Sheet1.Range("A1:A10") End Sub Sub FillComboNoDuplicates(cbo As ComboBox, rg As Range) ' Create dictionary Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") Dim cell As Range, sItem As String ' Go through each item in range For Each cell In rg sItem = Trim(cell.Value) ' check if item already exists in dictionary If dict.Exists(sItem) = False Then ' If doesn't exist then add to dictionary and combobox dict.Add sItem, 1 cbo.AddItem sItem End If Next ' Clean up dictonary as we no longer need it Set dict = Nothing End Sub
VBA ComboBox – Full Example 1
The easiest way to show how these work is with an example. Imagine we have a list of countries and their capitals in cells A1:B196.
We want the user to select any country. When they do our UserForm will display the capital of that country. The screenshot below shows and example of this
The first thing we want to do is fill the countries ComboBox when the form loads. We do this using the UserForm_Initialize event which we looked at in the first post on VBA UserForms.
Private Sub UserForm_Initialize() End Sub
We can use the following code to fill the ComboBox from a range and set the selected item to be the first one. (Note we don’t need to clear the ComboBox here as the Initialize event is only used once – when the UserForm is created.)
' https://excelmacromastery.com/ Private Sub UserForm_Initialize() ' Add array to combobox ComboBoxCountry.List = Sheet1.Range("A1:A196").Value ' Set the first item in combobox ComboBoxCountry.ListIndex = 0 End Sub
When the user selects a country we want to display the capital city in the textbox. We use the Change Event of the ComboBox. To create this we simply double-click on the ComboBox and it will be automatically created.
' https://excelmacromastery.com/ Private Sub ComboBoxCountry_Change() ' Get the value from the combo box Dim sCountry As String sCountry = ComboBoxCountry.Value ' Get the range Dim rg As Range Set rg = Sheet1.Range("A1:B196") ' Use VLookup to find the capital of the country TextBoxCapital.Value = _ WorksheetFunction.VLookup(sCountry, rg, 2) End Sub
When the user clicks Ok we write the selected values to the Results worksheet
' https://excelmacromastery.com/ Private Sub buttonOK_Click() With shResult ' Write the country the was selected .Range("A1") = ComboBoxCountry.Value ' Write the postion of the selected country .Range("A3") = ComboBoxCountry.ListIndex ' Write the capital of the country .Range("A2") = TextBoxCapital.Value End With ' Close the form Unload Me End Sub
VBA ComboBox – Full Example 2
A very commmon task to perform is to update a second ComboBox based on the selection of the first.
Imagine we have two ComboBoxes – one contains the name of a country and one has a list of three cities from that country.
When the user selects a country we update the city ComboBox with the cities from that country.
Our data is stored as follows
Anytime the Country ComboBox value is set to a country we update the City ComboBox to contain the three cities from that country. This happens in two places
- When we load the country combo box – the Initialize Event
- When the user selects a country – the Change Event
The code for these is as follows
' https://excelmacromastery.com/ Private Sub UserForm_Initialize() ' Add array to combobox ComboBoxCountry.List = shCity.Range("A2:A5").Value ComboBoxCountry.ListIndex = 0 ' Fill the city ComboBox FillCityCombo ComboBoxCountry.ListIndex End Sub Private Sub ComboBoxCountry_Change() ' Fill the city ComboBox FillCityCombo ComboBoxCountry.ListIndex End Sub
In both cases we call our FillCityCombo Sub to fill the city ComboBox. It takes one parameter which is the position of the current country selection.
We use the position value to count from the top row of our worksheet range.
' https://excelmacromastery.com/ Sub FillCityCombo(ByVal row As Long) ' Get the city range from the given row Dim rgCities As Range Set rgCities = shCity.Range("B2:D2").Offset(row) ' Clear current city list ComboBoxCity.Clear ' We transpose the range of columns e.g. B2:D2 to rows so ' we can add to the ComboBox ComboBoxCity.List = _ WorksheetFunction.Transpose(rgCities) ' Set the first city in list ComboBoxCity.ListIndex = 0 End Sub
The ListBox
The ListBox is used in almost the same way as the ComboBox. The code in the ComboBox section above will work for the ListBox also.
The ListBox Cheat Sheet
Function | Operation | Example |
---|---|---|
AddItem | Add an item | listbox.AddItem «Spain» |
Clear | Remove all Items | listbox.Clear |
ColumnCount | Set the number of visible columns | ComboBox1.ColumnCount = 2 |
ColumnHeads | Make the column row visible | ComboBox1.ColumnHeads = True |
List | Range to Listbox ListBox to Range |
Listbox.List = Range(«A1:A4»).Value Range(«A1:A4»).Value = Listbox.List |
List | Update a column value | Listbox.List(1,2) = «New value» |
ListCount | Get the number of items | cnt = listbox.ListCount |
ListIndex | Get/set selected item | Idx = listbox.ListIndex combo.ListIndex = 0 |
RemoveItem | Remove an item | listbox.Remove 1 |
RowSource | Add a range of values from a worksheet | ComboBox1.RowSource = Sheet1.Range(«A2:B3»).Address |
Value | Get the value of selected Item | Dim sCountry As String sCountry = listbox.Value |
We can use the ListBox the same way as we used the ComboBox. The difference is how they are displayed
- The ListBox displays a list of available items to select.
- The ComboBox only displays the selected item. You have to click on the ComboBox to see the other available items.
The other major difference between them is that the ListBox allows multiple selections and the ComboBox doesn’t.
We can get all the selected items in the ListBox by reading through all the items and checking if each one is selected. In the code below we add all the selected items to a Collection.
' USERFROM CODE ' https://excelmacromastery.com/ Private m_CollCountries As Collection ' OK click event Private Sub buttonOk_Click() ' Get the user selections Set m_CollCountries = GetSelections ' Hide the UserForm Hide End Sub ' Returns the collection of countries Property Get Countries() As Collection Set Countries = m_CollCountries End Property ' Get the selections from the ListBox Private Function GetSelections() As Collection Dim collCountries As New Collection Dim i As Long ' Go through each item in the listbox For i = 0 To ListBoxCountry.ListCount - 1 ' Check if item at position i is selected If ListBoxCountry.Selected(i) Then ' Add item to our collection collCountries.Add ListBoxCountry.List(i) End If Next i Set GetSelections = collCountries End Function
' MAIN PROCEDURE CODE ' https://excelmacromastery.com/ ' Sub to display the UserForm Sub DisplayMultiCountry() Dim frm As New UserFormCountryMulti frm.Show ' Print the collection PrintCollection frm.Countries End Sub ' Sub used to print a collection to the Immediate Window(Ctrl + G) Public Sub PrintCollection(ByRef coll As Collection) Debug.Print "The user selected the following countries:" Dim v As Variant For Each v In coll Debug.Print v Next End Sub
That concludes the two posts on UserForm(see first one here).
I hope you found them of benefit. If you have any questions or queries please feel free to add a comment or email me at Paul@ExcelMacroMastery.com.
What’s Next?
Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out the The Ultimate VBA Tutorial.
Related Training: Get full access to the Excel VBA training webinars and all the tutorials.
(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)
In this Article
- VBA UserForms
- Built in VBA UserForms
- Message Box
- Input Box
- Get Open Filename
- Excel Default Dialogs
- Inserting a New User Form
- Using the Toolbox
- Adding an Exit Button to Your Form
- Adding a Label Control to a Form
- Adding a Text Control to the Form
- Initialize and Activate Events on a Form
- Saving Your Application and Forms
- Modal and Non-Modal Forms
- Closing a Form
- Enabling and Disabling Controls
This tutorial will discuss VBA UserForms.
VBA UserForms
The Userform is a very important part of programming in VBA. It allows you to build a professional looking user interface to communicate with the users of your VBA application. It also allows you to totally control the user in what they are doing to your workbook.
You can, of course, use worksheet cells to accept parameters from the user, but the userform produces a far better user experience.
By expanding the height and width of your userform to the size of the Excel window, you can make your application look like a normal Windows application, with the user being totally unaware that they are using Excel as the host.
All the normal Windows controls, such as drop downs, list boxes, tick boxes are available to you. You also have a huge range of methods, events and properties to use to enhance the user experience.
An important point is that when you display a userform that is built in or is modal, you cannot edit your code in the VBE nor access any Excel functionality. Only when the form is closed will the cursor appear in your code.
Built in VBA UserForms
Excel VBA as several built-in forms that can be used to communicate with the user.
Message Box
This is the most commonly used form in VBA. It simply displays a text message, possibly informing a user that they have entered invalid input or that a VBA process has finished running. In their simplest form, they display a text string, but you can also add an icon such as a question or exclamation mark, and give the message box a different title.
This is a basic example. There is only one button to click, and the title bar says ‘Microsoft Excel’
The code to produce this is very straightforward:
Sub TestMsgBox()
MsgBox "This process has completed"
End Sub
You can use different parameters to add buttons, icons, and change the title bar
Sub TestMsgBox()
Dim Ret As Variant
Ret = MsgBox("Are you sure?", vbYesNo Or vbQuestion, "My Application")
If Ret = vbYes Then
'Your process here
Else
Exit Sub
End If
End Sub
This code adds in a ‘Yes’ and ‘No’ button and a question mark icon, and sets the title bar. Note that you can combine the styles of the message box by using the ‘Or’ operator
Also, when you are returning a value from a message box, the return variable must be defined as a variant or vbMsgBoxResult, and the message box statement must use brackets,
Input Box
There is a very simple input box built into VBA, although it is quite restrictive in what you can do with it. If you can, it is better to design a custom userform
Sub TestInputBox()
Dim Ret As String
Ret = InputBox("Please enter your name", "Enter Name")
MsgBox Ret
End Sub
You can also add a default value for the input into the parameters.
Get Open Filename
This allows you to utilize the Windows file dialog within your VBA code. It looks very impressive to the user when it is running, but it is very simple to incorporate and you automatically get all the file dialog functionality with it.
The code restricts the user to only see Excel files. Unfortunately, they could type in a non-Excel filename into the File name box, and click the open button, so you would need some code to ensure that an Excel file has been selected.
Use the ‘ChDir’ command to change the default directory to your own requirements before displaying the file dialog
Note the use of wildcards in the FileFilter parameter. The Excel files to display could be pre 2007, have macros, or be binary so the filter is ‘.xls*’.
Sub TestFileDialog()
Dim MyFile As String
ChDir "C:temp"
MyFile = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", , "Select a file")
MsgBox MyFile
End Sub
If required, you can allow the user to select several files at once by using the MultiSelect parameter. The default is False (single select only)
Sub TestFileDialog()
Dim MyFile As Variant
ChDir "C:temp"
MyFile = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", , "Select a file", , True)
For Each f In MyFile
MsgBox f
Next f
End Sub
The user holds down the Shift key in the file dialog to select multiple files.
The For Each loop displays the full path and name of each file selected
Excel Default Dialogs
Within Excel VBA, there is a Dialogs collection which you can use to display any standard Excel dialog. The downside is that you cannot access the parameters that the user has chosen or change the appearance of the dialog, but these dialogs can be useful in directing the user to a standard Excel function, and allowing them to choose specific parameters within the dialog.
A good example of this is to display the ‘Print’ dialog from VBA:
Sub TestPrintDialog()
Application.Dialogs(xlDialogPrint).Show
End Sub
When you open the brackets in the Dialogs collection, you will see a list of a huge number of constants for built-in dialogs. It is worth experimenting with some of these options within your code
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
Inserting a New User Form
You can design your own custom user forms by inserting a userform into the Visual Basic Editor (VBE)
You do this by selecting Insert | UserForm on the VBE menu bar.
Click on ‘UserForm’ and a new blank form will appear ready for you to develop on
The actual form itself (shown as ‘UserForm1’) looks quite small, but you can use the handles around it to enlarge or make it even smaller by dragging the handles with your cursor.
There is a properties window in the bottom left-hand corner of the screen. As the focus is directly on the form itself, this contains all the properties for the form specific to that form.
Note that when you start adding controls such as combo boxes and command buttons, these controls all have their own set of properties, and they can be very different in what you can do with each of them.
The properties that you see currently only apply only to the form itself.
The ‘Name’ property is the name used to define your form object within the VBA code. You may want to use something more meaningful for the object name, so that when you are reviewing your code, it is obvious which form is being used.
The ‘Name’ property will also reflect through to the ‘Project Explorer’ window in the top left-hand corner of the screen
You will want to alter the title bar of your form to something different from ‘UserForm1’, and you can do this by typing in your new text at the ‘Caption’ property
You can make a huge number of changes to how your form is seen by the user. You can alter colours, add images e.g. a corporate logo, change the position using ‘Left’ and ‘Top’, change the size using ‘Height’ and ‘Width’, change the mouse pointer, and many more
All of these properties can also be changed programmatically for any control that you have added to your form. For example, a user may select from a list box control, and you may want to disable or hide other controls based on the user’s choice
Using the Toolbox
You will notice that when you click on the form itself, a toolbox pop-up appears. If you click anywhere else e.g. the properties pane, it will disappear, but re-appear when your click on the form.
The toolbox provides the real mechanics of the form design. This enables you to add the normal Windows controls that users are familiar with to your form.
You will have notice that on the form, there is a network of dots. This is a ‘snapgrid’ so that when you add a control to the form, it will automatically align the position to the rows and columns of dots. This helps enormously with aligning your controls so that your do not get a ragged appearance of the controls
Should you click on a control, and then decide not to use it, clicking on the ‘Arrow’ icon in the top-left corner of the toolbox will change your cursor back to normal.
You can add additional controls to the toolbox by using Tools | Additional Controls on the VBE menu. There are a considerable number of these available, but depending on you Windows and Excel versions, they do not always work so some experimentation is often required.
Also, your users may not have access to some of these additional controls or be running older versions of Windows and Excel, which may cause problems. In large organizations, especially if they are global, there is no such thing as a standard build PC that you can rely on!
Adding an Exit Button to Your Form
A Command button is simple to add to the form. This looks the same way as buttons that you see in other Windows forms, usually as an ‘OK’ or ‘Cancel’ button.
Click on the Command Button icon in the toolbox. This is the second icon from the left on the bottom row of icons. See the image above. It has the letters ‘ab’ on it.
You can either hold your mouse button down and drag the control onto your form, or you can move the cursor to the form, where it will change to a ‘cross’ cursor and you can position and size your button
If you drag the control to the form, you will get the default sizing of the button. Moving the cursor to the form allows you to change the size of the button by dragging the ‘cross’ cursor across your form
Your form will now look like this:
The button will have default text as the caption, but you will want to change it to your own requirements. You can click on the text within the button (‘CommandButton1’) and this will allow you to edit the caption directly.
You can also change it in the properties window (bottom left-hand corner of screen). You will see a property called ‘Caption’ and you can edit the value for this. Change this to ‘Exit’
As with the form properties, the ‘Name’ property defines the name that will be used in your VBA code. You may want to use a name that is more meaningful and obvious within your code. You can enter this against the ‘Name’ property.
You can re-position the button by dragging it about on the form, and you can resize it by clicking on the button handles (white square boxes) and dragging the handles to make it larger or smaller
You can also re-size the button by changing the Height and Width values in the properties window
You can view your form in Excel by clicking on the green triangle in the VBE toolbar, or pressing F5
You can call your form from VBA code within a module by using the ‘Show’ method
Sub ShowForm()
UserForm1.Show
End Sub
Your user form is effectively a global object and can be called from anywhere within your code
Currently, your command button does nothing because there is no VBA code behind it. You have to write this yourself! All that can happen at the moment is that you can click on the ‘Close’ X in the top right-hand corner of your form.
To add VBA code, double click on the button on the form
This will take you to the normal VBA code window, and will show the default event of click.
You use the ‘Hide’ method to close the form, and you can also add in any other code, such as a message box to confirm to the user what has happened.
Note that the code window has two drop downs at the top. The first one allows you to select your form controls, and the second shows all the events that are available for you to add code. The obvious one for a button is the ‘Click’ event, but there are others such as ‘Double Click’ or ‘Mouse Move’
When you run your form now, the button actually does something. The form vanishes and a message box is displayed confirming that the form is closed
You can, of course, enlarge the exit code. You may wish to display another form, or take action on parameters that the user has entered on your form
VBA Programming | Code Generator does work for you!
Adding a Label Control to a Form
Label controls are for prompting the user as to what sort of data they need to input to a control on the form e.g. text box, drop down, etc. A label has no borders by default, but these can be added through the properties window if required.
As a control, they are read only to the user and are simply a way of putting text on the form, whether it is a bold heading, or an instruction of what to enter or choose.
To add a label, click on the ‘A’ icon in the toolbox (top row, second from left) and either double click on it or move your cursor to the form and select position and size.
Using the ‘Caption’ property in the properties window, or clicking on the label control, you can enter the text for the label control.
Note that the text will wrap according to the size of the label control, and if the string of text is too long, it will not appear completely on the form, so you need to be careful of the sizing of the label control.
Using the properties window, you can change the appearance of the label control, with different colours, fonts, back style e.g. if it overlays an image and you want it to be transparent
No code needs to be created for a label control. The main purpose is to add text to the form so that the user can see how all the other controls work
Adding a Text Control to the Form
A text control is used to allow the user to input text e.g entering a name or comments
The text control is added from the toolbox by clicking on the text control icon (top row, third from left) and double clicking or dragging the control into position on your form.
The text control is often confused with the label control, but the text control is the one for user input
The ‘Enter your name’ text is a label control, as previously described, and we now have a white text box ready for the user to type something into
Using the properties window, you can change the colours, fonts, special effects, or use password characters for your text box. Enormous flexibility is available
One very important property for a text box is the ‘MultiLine’ property. If you want the user to enter a large amount of text into the text control e.g. comments, then the ‘MultiLine’ property must be set to True.
It is a default of False which means that however big you make your text box, the text entered will stay on one continuous line and will scroll out of the text box. It will not wrap around within the box.
There is no pop-up when you right click on your text box when it is running, but CTRL+V will work for Paste, and CTRL+C will work for Cut, should the user want to cut and paste text to and from other applications
Again, you have to write your own code to deal with text that the user has typed in. You may wish to transfer it to a cell in a worksheet
You can add this code into the ‘Change’ event for the text box
Private Sub TextBox1_Change()
Sheets("Sheet1").Range("A1").Value = TextBox1.Value
End Sub
You may also want to put some validation code in to check that the user is not entering rubbish which will have disastrous effects on your application
The change event is no good for this because it is called every time the user types in a new character. The user could start typing a string of text and instantly find that they have broken your validation rules before they have completed a valid text.
You use the ‘Exit’ event. This is triggered when the user moves the focus to another control on the form, which means that the user is no longer entering data.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNull(TextBox1.Value) Or Len(TextBox1.Value) < 4 Then
MsgBox "Name is invalid", vbCritical
TextBox1.SetFocus
End If
End Sub
When the user clicks on another control on the form, this code tests for either a null value in the text box, or less than 4 characters. If the test is true, then a message box with a critical icon appears to inform the user that the name is invalid, and the focus is moved back to the offending text box for the user to correct.
Note that even if the user clicks on the Exit button, the text box exit event will be performed first, so this prevents the user exiting without correcting the input
Initialize and Activate Events on a Form
When VBA first creates and builds a form it triggers an ‘Initialize’ event. However, because the form is also displayed at this point, it also triggers an ‘Activate’ event. From then onwards, every time the form appears using the ‘Show’ method or it appears as part of a hierarchy of forms, then the ‘Activate’ event is triggered, but not the ‘Initialize’ event
The ‘Initialize’ event only happens once, but the ‘Activate’ event can happen many times
On your form you may want to set up default values from the worksheet in the input controls e.g. text boxes, so that these appear on the first use of the form, but the user can overwrite the defaults and these new values will remain in place so long as the code is running
Private Sub UserForm_Initialize()
TextBox1.Value = Sheets("Sheet1").Range("A1").Value
If TextBox1.Value=”” Then
TextBox1.Visible=False
Else
TextBox1.Visible=True
End If
End Sub
You can find the ‘Initialize’ event in the second drop down in the code window, and the userform name in the first drop down.
This code will use the value at cell A1 on ‘Sheet1’ as the default value in the text box created earlier in this article. When the form appears for the first time, the default value will appear. The user can then overwrite the default value and this will be retained. If CellA1 is blank the text box will be hidden otherwise is will be visible
The default value could also be hard coded:
TextBox1.Value = “John Smith”
You may also want to make sure that the values that the user has entered re-appear whenever the user fires up that form within that particular Excel session. VBA code can easily write the values back to cells within the workbook using the ‘Exit’ event on a control, and re-instate them using the ‘Activate’ event on the form
Private Sub TextBox1_Exit(ByVal Cancel as MSForms.ReturnBoolean)
Sheets("Sheet1").Range("A10").Value = TextBox1.Value
End Sub
Private Sub UserForm_Activate()
TextBox1.Value = Sheets("Sheet1").Range("A10").Value
End Sub
This code will make the user’s values persistent and also ensure that they are saved off with the rest of the workbook
Saving Your Application and Forms
When you save your Excel workbook containing your forms, all the forms and their VBA code get saved as well. However, any values that the forms hold whilst they are displayed will be lost.
It is important to write code so that when the user exits the workbook, or the form, the values are written back to cells within the workbook and so are preserved.
Modal and Non-Modal Forms
The form itself has a property ‘Show Modal’. This is set by default to True, but it can be changed to False (non-modal)
If a form is modal, it means that none of the Excel functionality can be accessed while the form is being displayed. This includes your code in the VBE window. You can view the code, but the cursor and keyboard are disabled.
In a non-modal form, you can access all the Excel functionality, including the VBE window, whilst the form is being displayed.
This is important from the point of view of controlling user behaviour
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Closing a Form
However well you write your code to force the user down a certain route, they can easily circumvent it by clicking on the ‘Close’ X in the top right-hand corner of the form
You can prevent this happening by modifying the ‘QueryClose’ event of the form
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
MsgBox "This action is disabled"
End Sub
The ‘QueryClose’ event is triggered when the user clicks the ‘Close’ X of the form. This code cancels the action, so the user is forced to use your ‘Exit’ button and the code that you have behind it.
Enabling and Disabling Controls
All controls on your form have a property called ‘Enabled’ which is set to True or False. If it is False, then the control is greyed out. It can be seen but cannot be used.
There is also a property called ‘Visible’ which again is set to True or False.
You can write code to either make a certain control unusable, or to make it totally invisible to the user. Using an ‘If’ statement, you can choose the circumstances when you need to do this
For example, you could disable the ‘Exit’ button initially, until the user has entered a value into the TextBox1 (name)
Private Sub UserForm_Initialize()
CommandButton1.Enabled = False
End Sub
Private Sub TextBox1_Change()
If Len(TextBox1.Value) > 0 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
This code uses the form ‘Initialize’ event to disable the exit button (Command Button 1) when the form first appears and then uses the ‘Change’ event on TextBox1 (name) to enable the Exit button if something has been typed in or disable it if the box is blank.
The ‘Change’ event is triggered every time a new character is typed in or deleted from the text box. If the user tries to enter text to make the button enabled, and then deletes all the text, the button will instantly be disabled
В настоящей заметке рассматриваются методы создания пользовательских форм и работы с ними.[1] Пользовательские диалоговые окна создаются на основе технологии пользовательских форм, к которым можно получить доступ из редактора Visual Basic (VBE; подробнее см. Настройка среды Visual Basic Editor).
Рис. 1. Окно новой пустой формы UserForm
Скачать заметку в формате Word или pdf, примеры в формате архива
Стандартная последовательность шагов при этом следующая:
- Вставьте новую форму UserForm в проект VBAProject рабочей книги.
- Добавьте элементы управления в форму UserForm.
- Настройте свойства добавленных элементов управления.
- Создайте процедуры «обработчики событий» для элементов управления. Эти процедуры добавляются в модуль кода UserForm и выполняются при возникновении различных событий (например, при щелчке на кнопке).
- Разработайте процедуру, которая отображает форму UserForm. Эта процедура находится в модуле VBA (а не в модуле кода для формы UserForm).
- Определите простой способ вызова на выполнение процедуры, созданной в п. 5. Можно поместить кнопку на рабочий лист, команду ленты и т.д.
Рассмотрим эти шаги подробнее.
Вставка новой формы UserForm
Чтобы добавить в проект форму UserForm, запустите VBE (например, нажав в Excel клавиши <Alt+F11>), выберите рабочую книгу в окне Project и выполните команду Inserts –> UserForm). Формы UserForm получают такие имена, как UserForm1, UserForm2 и т.д. Можно переименовать форму, изменив свойство Name в окне Properties (см. рис. 1). Если это окно не отображается, нажмите в VBE клавишу <F4>. В рабочей книге может быть произвольное количество форм UserForm, а каждая форма включает единственное пользовательское диалоговое окно.
Добавление элементов управления в пользовательское диалоговое окно
Чтобы добавить элементы управления в форму UserForm, воспользуйтесь панелью Toolbox. Обратите внимание, что в VBE отсутствуют команды меню, предназначенные для добавления элементов управления. Если панель Toolbox не отображена на экране, пройдите по меню View –> Toolbox (рис. 2).
Рис. 2. Окно Toolbox для добавления элементов управления в пользовательскую форму
Щелкните на той кнопке в панели Toolbox, которая соответствует добавляемому элементу управления. После этого щелкните внутри диалогового окна для создания элемента управления (используется размер элемента по умолчанию). Также можно щелкнуть на элементе управления и, перетащив его границы в диалоговом окне, задать необходимый размер в пользовательском диалоговом окне. Добавленному элементу управления назначается имя, которое состоит из названия типа элемента управления и числового кода. Рекомендуется их переименовать, чтобы в коде VBA было понятно, с чем вы имеете дело. Согласитесь, что РrоductListBox звучит лучше, чем ListBox1.
Элементы управления в окне Toolbox
Форма UserForm, которая показана на рис. 3, размещена в файле all userform controls.xlsm.
Рис. 3. Эта форма UserForm содержит 15 элементов управления
Элемент управления CheckBox (6) предоставляет пользователю возможность выбрать один из двух вариантов: включить или выключить. Если галочка установлена, то CheckBox имеет значение True, в противном случае – False.
ComboBox (4) подобен объекту ListBox (5). Отличие заключается в том, что ComboBox представляет раскрывающийся список, в котором в определенный момент времени отображается только одно значение. Кроме того, пользователю в поле списка разрешено вводить значение, которое необязательно представляет одну из опций объекта ComboBox.
Каждое создаваемое диалоговое окно будет иметь как минимум один элемент управления CommandButton (10). Обычно используются кнопки ОК и Отмена.
Элемент управления Frame (9) применяется в качестве оболочки для других элементов управления. Он добавляется в диалоговое окно либо в целях эстетики, либо из соображений логического группирования однотипных элементов управления. Элемент управления Frame требуется в случае, если в диалоговом окне содержится более одного набора элементов управления OptionButton.
Элемент управления Image (15) используется для представления графического изображения, которое сохранено в отдельном файле или вставляется из буфера обмена. Графическое изображение сохраняется вместе с рабочей книгой. Таким образом, вместе с рабочей книгой передавать другому пользователю копию графического файла необязательно. Некоторые графические файлы занимают много места, поэтому их включение в рабочую книгу приведет к радикальному увеличению ее размера.
Элемент управления Label (2) отображает текст в диалоговом окне.
Элемент управления ListBox (5) предоставляет список опций, из которого пользователь может выбрать один вариант (или несколько). Вы вправе указать диапазон на листе, который содержит элементы списка. Этот диапазон может состоять из нескольких столбцов. Кроме того, элемент управления ListBox может заполняться с помощью кода VBA.
Элемент управления MultiPage (12) позволяет создавать диалоговые окна с несколькими вкладками, которые подобны появляющимся после выбора команды Формат ячеек. По умолчанию элемент управления MultiPage состоит из двух вкладок.
Элемент управления OptionButton (7) применяется при выборе пользователем одного варианта из нескольких. Эти элементы управления всегда группируются в диалоговом окне в наборы, содержащие не менее двух опций. Когда один элемент управления OptionButton выбран, все остальные элементы управления OptionButton текущей группы автоматически становятся неактивными. Если в пользовательском диалоговом окне содержится более одного набора элементов управления OptionButton, то каждый из таких наборов должен иметь собственное значение свойства GroupName. В противном случае все элементы управления OptionButton в диалоговом окне рассматриваются как члены одной группы. Также можно вставить элементы управления OptionButton в объект Frame, что приведет к их автоматическому группированию.
Элемент управления RefEdit (16) используется тогда, когда пользователь должен выделить диапазон ячеек на листе.
Элемент управления ScrollBar (13) в некотором смысле подобен элементу управления SpinButton. Разница заключается в том, что пользователь может перетаскивать ползунок объекта ScrollBar для изменения значения с большим приращением. Элемент управления ScrollBar рекомендуется использовать при выборе значения из большого диапазона.
Элемент управления SpinButton (14) позволяет выбрать значение после щелчка на одной из двух кнопок со стрелками. Одна из них применяется для увеличения значения, а вторая — для уменьшения. Элемент управления SpinButton часто используется совместно с элементами управления TextBox и Label, которые содержат текущее значение элемента управления SpinButton.
Элемент управления TabStrip (11) подобен элементу управления MultiPage, однако использовать его сложнее. Элемент управления TabStrip, в отличие от MultiPage, не выступает контейнером для других объектов. Как правило, элемент управления MultiPage обладает более широкими возможностями.
Элемент управления TextBox (3) позволяет пользователям вводить текст в диалоговом окне.
Элемент управления ToggleButton (8) имеет два состояния: включен и выключен. Щелчок на кнопке приводит к изменению состояния на противоположное и к изменению внешнего вида кнопки. Этот элемент управления может иметь значение True (активен) или False (неактивен). Он не относится к «стандартным» элементам управления, поэтому использование двух элементов управления OptionButton или одного CheckBox может оказаться более удачным вариантом.
Использование элементов управления на рабочем листе
Элементы управления пользовательскими диалоговыми окнами могут встраиваться в рабочий лист (без использования UserForm). Доступ к элементам управления можно получить, пройдя в Excel Разработчик –> Элементы управления –> Вставить. Для использования подобных элементов в составе рабочего листа требуется гораздо меньше усилий, чем для создания пользовательского диалогового окна. Кроме того, в данном случае можно не создавать макросы, поскольку элемент управления можно связать с ячейкой рабочего листа.
Например, если на рабочий лист вставить элемент управления CheckBox, его можно связать с нужной ячейкой, задав свойство LinkedCell. Если флажок установлен, в связанной ячейке отображается значение ИСТИНА. Если же флажок сброшен, то в связанной ячейке отображается значение ЛОЖЬ. Например, на рис. 4 переключатель «Фикс. Ставка 20%» связан с ячейкой Н15. Рисунок отображает рабочий лист, содержащий некоторые элементы управления ActiveX (см. файл activex worksheet controls.xlsx). Книга включает связанные ячейки и не содержит макросов.
Рис. 4. Элементы управления ActiveX без макросов
Элементы управления на рабочем листе могут происходить из двух источников:
- Элементы управления формами. Эти элементы управления являются внедряемыми объектами.
- Элементы управления ActiveX. Эти элементы управления являются подмножеством элементов, доступных в пользовательских диалоговых окнах.
Эти элементы управления работают не одинаково. После добавления элемента управления ActiveX в рабочий лист Excel переходит в режим конструктора. В этом режиме можно настраивать свойства любого элемента управления рабочего листа, добавлять или изменять процедуры обработки событий для элемента управления, а также изменять его размер или положение. Для отображения окна свойств элемента управления ActiveX воспользуйтесь командой Разработчик –> Элементы управления –> Свойства.
Для создания простых кнопок можно использовать элемент управления Button (Кнопка), который находится на панели инструментов Формы (Form). В этом случае обеспечивается возможность запуска макроса. Если же воспользоваться элементом управления CommandButton, который относится к группе элементов управления ActiveX, то после щелчка на нем вызывается связанная процедура обработки событий (например, CommandButton1_Click), которая находится в модуле кода объекта Лист (Sheet). Связать макрос с этой процедурой нельзя.
Если Excel находится в режиме конструктора, тестирование элементов управления невозможно. В этом случае нужно выйти из режима конструктора, щелкнув на кнопке Разработчик –> Элементы управления –> Режим конструктора. Эта кнопка работает, как переключатель.
Настройка элементов управления пользовательского диалогового окна
Продолжим описание использования элементов управления в UserForm. После того, как элементов управления помещен в диалоговое окно, его можно переместить и изменить размер. Можно выделить несколько элементов управления. Для этого следует удерживать нажатой клавишу <Shift> и щелкать на объектах либо обвести указателем мыши необходимые элементы управления.
В форме UserForm содержатся вертикальные и горизонтальные направляющие, которые помогают выровнять добавленные в диалоговое окно элементы управления. При добавлении или перемещении элемент управления привязывается к направляющим, что облегчает упорядочение таких элементов в окне. Если вы не используете направляющие, можете их отключить, выбрав в VBE команду Tools –> Options. В диалоговом окне Options перейдите на вкладку General и выберите соответствующие параметры в разделе Form Grid Settings.
Меню Format окна VBE предоставляет несколько команд, которые позволяют точно разместить и выровнять элементы управления в диалоговом окне. Перед использованием этих команд необходимо указать элементы управления, к которым они будут применяться (рис. 5).
Рис. 5. Выравнивание элементов в форме UserForm
Если выделено несколько элементов управления, на выделяющей рамке одного из них (обычно последнего) вместо обычных черных маркеров появляются белые. Это означает, что этот элемент управления играет роль основы, на базе которой определяются размеры и расположение других элементов управления.
Изменение свойств элементов управления
Каждый элемент управления характеризуется набором параметров, которые определяют внешний вид и поведение элемента управления. Свойства элемента управления можно изменять в следующих случаях:
- В момент проектирования при разработке пользовательского диалогового окна. Для этого используется окно Properties.
- В процессе выполнения, когда пользовательское диалоговое окно отображается на экране. Для этого воспользуйтесь инструкциями VBA.
Работа с окном Properties. В VBE окно Properties позволяет изменять свойства выделенного элемента управления (это может быть обычный элемент управления или сама форма UserForm, рис. 6).
Рис. 6. Окно Properties для выделенного элемента управления OptionButton
В окне Properties есть две вкладки. На вкладке Alphabetic свойства выбранного объекта отображаются в алфавитном порядке. На вкладке Categorized эти свойства сгруппированы по категориям. Обе вкладки отображают одни и те же свойства.
Для того чтобы изменить свойство, необходимо щелкнуть на нем и ввести новое значение. Некоторые свойства могут принимать только ограниченный набор допустимых значений, выбираемых из соответствующего списка. После щелчка на таком свойстве в окне Properties будет отображена кнопка со стрелкой, указывающей вниз. Щелкните на этой кнопке, чтобы выбрать значение из предложенного списка. Например, свойство TextAlign может принимать одно из следующих значений: 1 — fmTextAlignLeft, 2 — fmTextAlignCenter и 3 — fmTextAlignRight.
После выделения отдельных свойств (например, Font и Picture) рядом с ними отображается небольшая кнопка с троеточием. Щелчок на этой кнопке приводит к вызову диалогового окна настройки свойства.
Для свойства Picture элемента управления Image необходимо указать графический файл или вставить изображение из буфера обмена. В последнем случае следует сначала скопировать его в буфер обмена, а затем выбрать свойство Picture элемента управления Image и нажать комбинацию клавиш <Ctrl+V> для вставки содержимого буфера обмена. Если выделить два или более элементов управления одновременно, в окне Properties отобразятся только те свойства, которые являются общими для этих объектов.
Объекту UserForm присущ ряд свойств, значения которых можно изменять. Эти свойства применяются в качестве значений, заданных по умолчанию, для элементов управления, которые добавляются в пользовательские диалоговые окна. Например, если изменить свойство Font пользовательского диалогового окна, все добавленные в окно элементы управления будут применять этот шрифт.
Общие свойства. Каждый элемент управления имеет как собственный набор уникальных свойств, так и ряд общих свойств, присущих другим элементам управления. Например, все элементы управления имеют свойство Name и свойства, определяющие его размер и расположение на форме (Height, Width, Left и Right). Если вы собираетесь работать с элементом управления с помощью кода VBA, присвойте ему значащее имя. Например, первый элемент управления OptionButton, который добавлен в пользовательское диалоговое окно, по умолчанию получит имя ОрtionButton1. В коде ссылка на этот объект будет выглядеть следующим образом: OptionButton1.Value = True. Но если элементу управления OptionButton присвоить описательное имя (например, obLandscape), то можно использовать такой оператор: obLandscape.Value = True.
Многие пользователи предпочитают имена, которые указывают на тип объекта. В предыдущем примере был использован префикс ob, который указывает на то, что объект является элементом управления OptionButton.
Можно изменять значения свойств нескольких элементов управления одновременно. Например, вы вправе создать на форме несколько элементов управления OptionButton и выровнять их по левому краю. Для этого достаточно выделить все элементы управления OptionButton и изменить значение свойства Left в окне Properties. Все выделенные элементы управления примут новое значение свойства Left.
Чтобы получить доступ к справочной информации о свойствах различных элементов управления, щелкните на свойстве в окне Properties и нажмите клавишу <F1>.
Советы по использованию клавиатуры. Многие пользователи предпочитают перемещаться по диалоговым окнам с помощью клавиатуры. Комбинации клавиш <Таb> и <Shift+Tab> позволяют циклически переключаться между элементами управления. Чтобы удостовериться, что диалоговое окно корректно реагирует на команды с клавиатуры, обратите внимание на такие моменты: порядок просмотра элементов управления и комбинации клавиш.
Порядок просмотра определяет последовательность, в которой активизируются элементы управления после нажатия пользователем клавиши <Таb> или комбинации клавиш <Shift+Tab>. Кроме того, порядок активизации указывает, какой элемент управления по умолчанию выделяется на форме первым. Если пользователь вводит текст в элемент управления TextBox, то этот элемент считается активным. Если после этого щелкнуть на элементе управления OptionButton, то именно он станет активным. Элемент управления, назначенный первым для просмотра, будет активным в момент открытия диалогового окна.
Для того чтобы указать порядок активизации, выберите команду View –> Tab Order. Кроме того, можно щелкнуть правой кнопкой мыши на UserForm и выбрать пункт Тab Order из появившегося контекстного меню. Excel отобразит диалоговое окно Tab Order (Порядок просмотра, рис. 7).
Рис. 7. В диалоговом окне Tab Order измените порядок просмотра элементов управления
Также можно указать порядок активизации элемента управления с помощью окна Properties (см. рис. 6, самое последнее из отраженных свойств). Первый активизируемый элемент управления будет иметь свойство Tablndex = 0. Изменение значения свойства Tablndex текущero объекта приведет к изменению значений свойств Tablndex других элементов правления. Изменения вносятся автоматически. Вы можете удостовериться в том, что значения свойства Tablndex всех элементов управления не больше количества элементов управления в диалоговом окне. Если нужно удалить элемент управления из списка активизируемых объектов, то присвойте его свойству TabStop значение False.
Одни элементы управления, такие как Frame и MultiPage, служат контейнерами для других элементов управления. Элементы управления в таком контейнере имеют собственный порядок просмотра (активизации). Для установки порядка просмотра группы элементов управления OptionButtons, находящихся внутри элемента управления Frame, выделите элемент управления Frame до того, как будет выполнена команда View –> Tab Order.
Большинству элементов управления диалогового окна можно назначить комбинацию клавиш. Таким образом, пользователь получит доступ к элементу управления, нажав <Alt> и указанную клавишу. Применив свойство Accelerator в окне Properties, можно определить клавишу для активизации элемента управления.
Некоторые элементы управления, например, TextBox, лишены свойства Accelerator, поскольку не отображают значение свойства Caption. Но к таким элементам можно получить доступ с помощью клавиатуры, воспользовавшись свойством Label. Присвойте клавишу элементу управления Label и расположите его в порядке просмотра перед элементом TextBox.
Отображение пользовательского диалогового окна
Для того чтобы отобразить пользовательское диалоговое окно с помощью VBA, необходимо создать процедуру, которая вызывает метод Show объекта UserForm. Форму UserForm невозможно отобразить, не выполнив как минимум одну строку кода VBA:
Sub ShowForm() UserForm1.Show End Sub |
Данная процедура должна располагаться в стандартном модуле VBA, а не в модуле формы UserForm. При отображении пользовательская форма остается на экране до тех пор, пока ее не скроют. Обычно в нее добавляют элемент управления CommandButton, который запускает процедуру закрытия формы. Эта процедура либо выгружает пользовательскую форму с помощью метода Unload, либо удаляет ее с экрана с помощью метода Hide объекта UserForm.
Отображение немодальной формы. По умолчанию отображается модальная форма. Это означает, что форма должна исчезнуть с экрана прежде, чем пользователь выполнит какие-либо действия на рабочем листе (т.е. редактирование данных невозможно). Немодальную форму также можно отобразить. В этом случае вы вправе продолжать работу в Excel, не скрывая саму форму. Для отображения немодальной формы используется следующий синтаксис:
UserForm1.Show vbModeless
Тестирование пользовательского диалогового окна. Обычно в процессе разработки возникает необходимость в тестировании формы UserForm. Для этого можно воспользоваться одним из способов:
- выполните команду Run –> Run Sub/UserForm;
- нажмите <F5>;
- щелкните на кнопке Run Sub/UserForm, которая находится на стандартной панели инструментов.
Выбор одного из этих методов приводит к запуску события инициализации диалогового окна. Как только диалоговое окно будет отображено в тестовом режиме, можно проверить порядок активизации объектов, а также поддержку комбинаций клавиш.
Отображение пользовательского диалогового окна на основе значения переменной. В некоторых случаях приходится выбирать, какое окно UserForm будет отображено. Если название пользовательского диалогового окна хранится в виде строковой переменной, можно воспользоваться методом Add для добавления объекта UserForm в коллекцию UserForms с последующим обращением к методу Show из коллекции UserForms. В приведенном ниже примере название объекта UserForm присваивается переменной MyForm, после чего отображается пользовательское диалоговое окно.
MyForm = «UserForm1» UserForms.Add(MyForm).Show |
Загрузка пользовательского диалогового окна. В VBA поддерживается оператор Load. Загрузка пользовательского диалогового окна приводит к сохранению объекта формы в памяти. Однако до тех пор пока не будет выполнен метод Show, форма останется невидимой для остальной части программы. Для загрузки окна UserForm1 воспользуйтесь оператором:
Load UserForm1
Если вы применяете сложное диалоговое окно, то вам может понадобиться предварительно загрузить его в память, чтобы в случае необходимости быстро отобразить его с помощью метода Show. Как правило, использовать метод Load в подобном случае не имеет смысла.
О процедурах обработки событий. Как только диалоговое окно появляется на экране, пользователь начинает с ним взаимодействовать, т.е. генерирует события. Например, щелчок на элементе управления CommandButton приводит к возникновению события Click объекта CommandButton. Вам необходимо создать процедуры (обработчики событий), которые будут выполняться при возникновении соответствующих событий.
Процедуры обработки событий находятся в модуле кода объекта UserForm. Наряду с этим процедура обработки события может вызывать другие процедуры, которые находятся в стандартном модуле VBA.
В коде VBA можно изменять свойства элементов управления, пока пользовательское диалоговое окно отображается на экране (т.е. на этапе выполнения). Например, можно назначить элементу управления ListBox процедуру, которая изменяет текст элемента управления Label при выборе элемента списка.
Закрытие пользовательского диалогового окна
Для закрытия формы UserForm1 воспользуйтесь командой: Unload UserForm1. Если же код находится в модуле кода формы UserForm, воспользуйтесь оператором: Unload Me. В этом случае ключевое слово Me применяется для идентификации пользовательской формы.
Обычно в коде VBA команда Unload выполняется только после того, как форма UserForm выполнит все свои функции. Например, форма UserForm может содержать элемент управления CommandButton, который используется в качестве кнопки ОК. Щелчок на этой кнопке приводит к выполнению заранее определенного макроса. Одна из функций макроса заключается в выгрузке формы UserForm из памяти. В результате пользовательское диалоговое окно отображается на экране до тех пор, пока макрос, содержащий оператор Unload, не завершает свою работу.
Когда форма UserForm выгружается из памяти, элементы управления, содержавшиеся на ней, возвращаются в первоначальное состояние. Другими словами, в коде нельзя обращаться к значениям, указываемым пользователем, после того как форма будет выгружена из памяти. Если значения, введенные пользователем, будут применяться позже (после выгрузки диалогового окна UserForm), то необходимо присвоить их переменной с областью действия Public, которая определена в стандартном модуле VBA. Кроме того, значение всегда можно сохранить в ячейке листа.
Окно формы UserForm автоматически выгружается из памяти после того, как пользователь щелкает на кнопке Закрыть (обозначается символом х в заголовке окна). Это действие также приводит к возникновению события QueryClose объекта UserForm, за которым следует событие Terminate пользовательского диалогового окна. Объект UserForm может использовать метод Hide. После его вызова диалоговое окно исчезает, но остается в памяти, поэтому в коде можно получить доступ к различным свойствам элементов управления:
UserForml.Hide
Если ваш код находится в модуле кода объекта UserForm, можно воспользоваться оператором:
Me.Hide
Если по какой-либо причине пользовательское диалоговое окно должно быть немедленно скрыто в процессе выполнения макроса, воспользуйтесь методом Hide в самом начале процедуры, а затем укажите команду DoEvents. Например, в следующей процедуре форма UserForm немедленно исчезнет после того, как пользователь щелкнет на кнопке CommandButton1. Последний оператор процедуры выгружает пользовательское диалоговое окно из памяти.
Private Sub CommandButton1_Click() Me.Hide Application.ScreenUpdating = True For r = 1 To 10000 Cells(r, 1) = r Next r Unload Me End Sub |
В рассматриваемом примере переменной ScreenUpdating присвоено значение True, в результате чего Excel полностью скрывает окно UserForm. Если этот оператор не использовать, окно UserForm остается видимым.
Пример создания пользовательского диалогового окна
В примере представлено диалоговое окно, предназначенное для получения имени и пола пользователя. В диалоговом окне вы найдете элемент управления TextBox, используемый для ввода имени, и два элемента управления OptionButton для указания пола. Информация, полученная в диалоговом окне, заносится в пустую строку рабочего листа.
Создание пользовательской формы. Создайте рабочую книгу, содержащую только один рабочий лист. Нажмите комбинацию клавиш <Alt+F11> для активизации VBE. В окне Project выберите проект рабочей книги и выполните команду Inserts –> UserForm. Воспользуйтесь окном Properties для изменения значения свойства Caption формы UserForm на Укажите имя и пол (если окно Properties не отображается, нажмите <F4>).
Рис. 8. Создание пользовательской формы
Добавьте элемент управления Label и настройте его свойства (рис. 9):
Свойство Значение
Accelerator И
Caption Имя:
Tablndex 0
Рис. 9. Пользовательская форма с элементами управления
Добавьте элемент управления TextBox и измените его свойства:
Name TextName
Tablndex 1
Добавьте элемент управления Frame и измените его свойства:
Caption Пол
Tablndex 2
Добавьте элемент управления OptionButton в состав элемента Frame и измените его свойства:
Accelerator М
Caption Мужчина
Name OptionMale
Tablndex 0
Добавьте еще один элемент управления OptionButton в состав элемента Frame и измените его свойства:
Accelerator Ж
Caption Женщина
Name OptionFemale
Tablndex 1
Добавьте элемент управления CommandButton за пределами элемента Frame и измените его свойства:
Caption OK
Default True
Name OKButton
Tablndex 3
Добавьте еще один элемент управления CommandButton и настройте его свойства:
Caption Отмена
Default False
Name CloseKButton
Tablndex 4
При создании нескольких похожих элементов управления может оказаться, что быстрее копировать существующий элемент управления, чем создавать новый. Для копирования элемента управления удерживайте нажатой клавишу <Ctrl> при перетаскивании элемента управления, что приведет к созданию копии. После этого останется изменить свойства скопированного элемента управления.
Создание кода для отображения диалогового окна. После создания элементов управления на лист необходимо добавить элемент управления ActiveX, называемый Кнопка (CommandButton). Эта кнопка будет запускать процедуру, которая предназначена для отображения формы UserForm. Для этого выполните следующие действия:
- Перейдите в окно Excel (например, воспользуйтесь комбинацией клавиш <Alt+F11>).
- Выберите команду Разработчика –> Элементы управления –> Вставить и щелкните на значке Кнопка (CommandButton), который находится в разделе Элементы ActiveX.
- Разместите кнопку на рабочем листе. Чтобы измените ее подпись, щелкните на кнопке правой кнопкой мыши и выберите в контекстном меню команду Объект CommandButton –> Edit. Для изменения других свойств объекта щелкните на нем правой кнопкой мыши и выберите команду Properties.
- Дважды щелкните на объекте CommandButton. Это приведет к активизации VBE. При этом отобразится модуль кода для листа с открытой пустой процедурой обработки событий объекта CommandButton, который расположен на рабочем листе.
- Введите единственный оператор в процедуру CommandButton1_Click (рис. 10). В процедуре используется метод Show объекта UserForml для отображения пользовательского диалогового окна.
Рис. 10. Процедура CommandButton1_Click вызывается после щелчка на кнопке рабочего листа
Тестирование диалогового окна. После щелчка на кнопке, находящейся на рабочем листе, ничего не произойдет. Точнее, кнопка будет выделена, но это не приведет к инициализации каких-либо действий. Причина этого заключается в том, что программа Excel по-прежнему остается в режиме конструктора, в который она переходит автоматически после добавления элемента управления ActiveX. Для выхода из режима конструктора щелкните на кнопке Разработчик –> Элементы управления –> Режим конструктора. Если же требуется изменить кнопку, снова перейдите в режим конструктора. После выхода из режима конструктора щелчок на кнопке приведет к отображению пользовательского диалогового окна.
Когда диалоговое окно будет отображено, введите произвольный текст в текстовом поле и щелкните на кнопке ОК. В результате ничего не произойдет, что совершенно естественно, так как для объекта UserForm не создано ни одной процедуры обработки событий. Для закрытия диалогового окна щелкните на крестике в его заголовке.
Добавление процедур обработки событий. Перейдите в VBE. Удостоверьтесь в том, что пользовательское окно отображено на экране, и дважды щелкните на кнопке Отмена. Активизируется окно кода для формы UserForm, а также добавляется пустая процедура CloseButton_Click. Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия обрабатываемого события. Добавьте в процедуру единственный оператор:
Private Sub CloseButton_Click() Unload UserForm1 End Sub |
Эта процедура, которая вызывается после щелчка на кнопке Отмена, выгружает из памяти форму UserForm1.
Щелкните на значке View Object в верхней части окна Project Explorer или дважды кликните на строке UserForm1, чтобы отобразить форму UserForm1. Дважды щелкните на кнопке ОК и введите код процедуры – обработчика событий для события Click объекта OKButton:
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 |
Private Sub OKButton_Click() Dim NextRow As Long ‘ Проверка активности листа Лист1 Sheets(«Лист1»).Activate ‘ Проверка ввода имени If TextName.Text = «» Then MsgBox «Введите имя.» TextName.SetFocus Exit Sub End If ‘ Определение следующей пустой строки NextRow = _ Application.WorksheetFunction.CountA(Range(«A:A»)) + 1 ‘ Передача имени Cells(NextRow, 1) = TextName.Text ‘ Передача пола If OptionMale Then Cells(NextRow, 2) = «Мужчина» If OptionFemale Then Cells(NextRow, 2) = «Женщина» ‘ Очистка элементов управления для ввода следующей записи TextName.Text = «» TextName.SetFocus OptionMale = False OptionFemale = False End Sub |
Перейдите в Excel и щелкните на кнопке еще раз, чтобы отобразить пользовательское диалоговое окно. С его помощью можно добавлять новые имена в рабочий лист.
Процедура OKButton_Click работает следующим образом. Сначала она проверяет, активен ли лист Лист1, введено ли имя. После этого запускается функция Excel СЧЁТЗ (CountA) для определения следующей пустой ячейки в столбце А. Затем текст из текстового поля TextBox передается в определенную ячейку столбца А. С помощью операторов If определяется выделенный элемент управления OptionButton, что обеспечивает запись соответствующего текста в столбец В (пол). Далее элементы диалогового окна очищаются и окно перезапускается, чтобы обеспечить возможность введения следующей записи. Заметим, что щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для завершения ввода данных (и выгрузки пользовательского диалогового окна) щелкните на кнопке Отмена.
Проверьте работоспособность комбинаций клавиш: Alt+М – активизирует мужской пол, Alt+Ж – женский. Рабочая книга с рассмотренным примером находится в файле get name and sex.xlsm.
События объекта User Form
Каждый элемент управления в форме UserForm (а также сам объект UserForm) разрабатывается для того, чтобы реагировать на определенные события. Эти события возникают в результате действий пользователя или генерируются программой Excel. Можно создать код, который будет выполняться при возникновении определенного события. Некоторые действия приводят к возникновению сразу нескольких событий. Например, щелчок на кнопке со стрелкой, направленной вверх, в элементе управления SpinButton приведет к возникновению события SpinUp и события Change. После того как пользовательское диалоговое окно будет отображено с помощью метода Show, Excel сгенерирует события Initialize и Activate объекта UserForm. В Excel также поддерживаются события, связанные с объектами Sheet (Лист), Chart (Диаграмма) и ThisWorkbook (ЭтаКнига).
Получение дополнительных сведений о событиях. Для того чтобы получить информацию о событиях, которые генерируются конкретным элементом управления, выполните следующее:
- Добавьте элемент управления в пользовательское диалоговое окно.
- Дважды щелкните на элементе управления, чтобы открыть модуль кода для объекта UserForm. VBE вставит пустую процедуру обработки события, принятого по умолчанию.
- Щелкните на раскрывающемся списке в правом верхнем углу окна модуля и просмотрите полный список событий, которые поддерживаются текущим элементом управления (на рис. 11 показан список событий для элемента управления CheckBox).
- Выберите событие из списка, и VBE создаст пустой обработчик события.
Рис. 11. Список событий для элемента управления CheckBox
Имя процедуры обработки событий включает имя объекта, который сгенерировал событие. Таким образом, если изменить имя элемента управления, придется внести соответствующие изменения и в имя процедуры обработки события. Имя процедуры не изменяется автоматически! Чтобы облегчить работу, присвойте описательные имена элементам управления до того, как приступите к созданию процедуры обработки соответствующих событий.
События объекта UserForm. Несколько событий непосредственно связано с отображением и выгрузкой объекта UserForm:
- Происходит перед загрузкой и отображением формы UserForm. Не происходит, если объект UserForm до этого был скрыт.
- Происходит в момент активизации объекта UserForm.
- Происходит в момент деактивизации объекта UserForm. Не происходит при сокрытии формы UserForm.
- Происходит перед выгрузкой объекта UserForm.
- Происходит после выгрузки объекта UserForm.
Важно правильно выбрать подходящее событие для процедуры обработки событий, а также проанализировать порядок выполнения событий. Использование метода Show приводит к возникновению событий Initialize и Activate (в указанном порядке). Применение команды Load приводит к вызову события Initialize. Команда Unload вызывает события QueryClose и Terminate (в указанном порядке). Метод Hide не приводит к вызову каких-либо событий.
В файле userform events.xlsm описанные события перехватываются и в момент возникновения события возникает окно сообщения. Если изучение событий объекта UserForm вызывает у вас затруднения, то, проанализировав код этого примера, вы получите ответы на многие вопросы.
События элемента управления SpinButton. Для того чтобы разобраться в концепции событий, мы подробно рассмотрим события, связанные с элементом управления SpinButton (рис. 12). Файл spinbutton events.xlsm демонстрирует применение событий, генерируемых объектами SpinButton и UserForm (первый содержится во втором). Рабочая книга включает несколько процедур обработки событий — по одной для каждого события элемента управления SpinButton и объекта UserForm. Каждая из этих процедур добавляет текст в столбце А с описанием события.
Рис. 12. События элемента управления SpinButton
Пользователь может управлять объектом SpinButton с помощью мыши или (если элемент управления активен) клавиш управления курсором. Когда пользователь щелкает мышью на верхней кнопке элемента управления SpinButton, происходят следующие события: Enter (генерируется только в том случае, если элемент управления неактивен); Change; SpinUp.
Пользователь может нажать клавишу <Таb> для того, чтобы сделать активным элемент управления SpinButton. Только после этого можно использовать клавиши управления курсором для изменения значения элемента управления. Если все именно так и происходит, то события генерируются в следующем порядке: Enter; KeyDown; Change; SpinUp (или SpinDown); KeyUp.
Элемент управления SpinButton может изменяться в коде VBA, что также провоцирует возникновение соответствующих событий. Например, оператор SpinButton1.Value = 0 устанавливает свойство Value элемента управления SpinButton1 равным 0, а это приводит к возникновению события Change. Такой результат достигается только в том случае, если исходное свойство Value не равно нулю.
Вы вправе предположить, что выполнить отмену генерирования событий можно, установив свойство EnableEvents объекта Application равным False. Но это свойство поддерживается только объектами, которые являются «истинными» в Excel: Workbook, Worksheet и Chart.
Совместное использование элементов управления SpinButton и TextBox. Элемент управления SpinButton имеет свойство Value, но не может отображать значение этого свойства. В большинстве случаев требуется, чтобы пользователь мог изменить значение элемента управления SpinButton непосредственно, а не многократно щелкая на элементе управления. Эффективным решением может стать объединение элемента управления SpinButton с элементом управления TextBox, что позволяет пользователю вводить значение элемента управления SpinButton непосредственно, используя для этого поле элемента управления TextBox. Кроме того, щелчок на элементе управления SpinButton позволит изменить значение, отображаемое в элементе управления TextBox.
На рис. 13 приведен пример (см. также файл spinbutton and textbox.xlsm). Свойство Min элемента управления SpinButton имеет значение 1, а свойство Мах— значение 100. Таким образом, щелчок на одной из стрелок элемента управления SpinButton приведет к изменению значения в пределах от 1 до 100. Код, реализующий «связывание» элементов управления SpinButton и TextBox сводится к созданию процедур обработки событий, которые будут синхронизировать свойство Value элемента управления SpinButton и свойство Text элемента управления TextBox.
Рис. 13. Комбинирование элементов управления SpinButton и TextBox
Представленная процедура выполняется каждый раз при возникновении события Change элемента управления SpinButton. Таким образом, процедура выполняется тогда, когда пользователь щелкает на элементе управления SpinButton или изменяет его значение, нажав одну из клавиш управления курсором.
Private Sub SpinButton1_Change() TextBox1.Text = SpinButton1.Value End Sub |
Если пользователь введет значение непосредственно в элемент управления TextBox, то будет сгенерировано событие Change, после чего должен выполняться следующий код:
Private Sub TextBox1_Change() Dim NewVal As Integer NewVal = Val(TextBox1.Text) If NewVal >= SpinButton1.Min And _ NewVal <= SpinButton1.Max Then _ SpinButton1.Value = NewVal End Sub |
Эта процедура начинается с вызова функции VBA Val, которая преобразует текст элемента управления TextBox в числовое значение (если элемент управления TextBox содержит строку, то функция Val возвращает значение 0). Следующий оператор определяет, попадает ли значение в указанный диапазон допустимых значений. Если это так, то свойство Value элемента управления SpinButton устанавливается равным значению, которое введено в поле элемента управления TextBox.
Пример организован таким образом, что щелчок на кнопке ОК (которая называется OKButton) передает значение элемента управления SpinButton в активную ячейку. Процедура обработки события Click элемента управления CommandButton выглядит следующим образом:
Private Sub OKButton_Click() ‘ Enter the value into the active cell If CStr(SpinButton1.Value) = TextBox1.Text Then ActiveCell = SpinButton1.Value Unload Me Else MsgBox «Некорректная запись.», vbCritical TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1.Text) End If End Sub |
Данная процедура выполняет проверку: анализируются текст, введенный в поле элемента управления TextBox, и значения элемента управления SpinButton. Такая процедура обрабатывает ситуации неверного ввода данных. Например, если пользователь введет в поле элемента управления TextBox текст Зt, то значение элемента управления SpinButton не изменится, а результат, который помещается в активную ячейку, будет отличным от ожидаемого. Обратите внимание, что значение свойства Value элемента управления SpinButton преобразуется в строку с помощью функции CStr. Это позволяет предотвратить ошибку, которая возникает, когда числовое значение сравнивается с текстовым. Если значение элемента управления SpinButton не соответствует содержимому элемента управления TextBox, то на экране отображается специальное сообщение. Причем объект TextBox активен, а его содержимое — выделено (с помощью свойств SelStart и SelLength). Таким образом, пользователю проще исправить неправильные значения.
О свойстве Tag. Каждый объект UserForm и каждый элемент управления имеет свойство Tag. Оно не представляет конечные данные и по умолчанию не имеет значения. Свойство Tag можно использовать для хранения информации, которая будет применена в программе. Например, можно создать набор элементов управления TextBox в пользовательском диалоговом окне. От пользователя требуется ввести текст только в некоторые из них. В отдельные поля вводить текст необязательно. Можно применять свойство Tag для идентификации полей, которые нужно заполнять. В таком случае значение свойства Tag — это строка, например, Required. Поэтому при написании кода обработки введенных пользователем данных можно ссылаться на свойство Tag.
Приведенный ниже пример представляет собой функцию, которая проверяет все элементы управления TextBox объекта UserForm1 и возвращает количество пустых текстовых полей, которые требуют ввода информации.
Function EmptyCount() Dim ctl As Control EmptyCount= 0 For Each ctl In UserFormi.Controls If TypeName(ctl) = «TextBox» Then If ctl.Tag = «Required» Then If ctl.Text = «» Then EmptyCount = EmptyCount + 1 End If End If End If Next ctl End Function |
Ссылка на элементы управления пользовательского диалогового окна
При работе с элементами управления, находящимися в форме UserForm, код VBA обычно содержится в модуле кода объекта UserForm. Кроме того, на элементы управления диалогового окна можно ссылаться из модуля кода VBA общего назначения. Для выполнения этой задачи необходимо задать правильную ссылку на элемент управления, указав имя объекта UserForm. В качестве примера рассмотрим процедуру, которая введена в модуле кода VBA. Эта процедура отображает пользовательское диалоговое окно, которое называется UserForm1.
Sub GetData () UserForm1.Show End Sub |
Предположим, что в диалоговом окне UserForm1 содержится текстовое поле TextBox1 и вам необходимо указать значение текстового поля по умолчанию:
Sub GetData() UserForm1.TextBox1.Value = «Джон Доу» UserForm1.Show End Sub |
Еще одним способом установки значения по умолчанию является использование события Initialize объекта UserForm. Можно написать код процедуры UserForm_Initialize, который будет располагаться в модуле кода диалогового окна:
Private Sub UserForm_Initialize() TextBox1.Value = «Джон Доу» End Sub |
Обратите внимание, что при обращении к элементу управления из модуля кода диалогового окна необязательно вводить в ссылку имя объекта UserForm. Подобное определение ссылок на элементы управления имеет свое преимущество: всегда можно воспользоваться средством Auto List Member, которое позволяет выбирать имена элементов управления из раскрывающегося списка.
Вместо того чтобы использовать фактическое имя объекта UserForm, предпочтительнее применить имя Me. В противном случае, если имя объекта UserForm изменится, вам придется изменять все ссылки (с его участием) в коде.
Использование коллекций элементов управления. Элементы управления пользовательских диалоговых окон образуют отдельную коллекцию. Например, следующий оператор отображает количество элементов управления в форме UserForm1:
MsgBox UserForm1.Controls.Count
В VBA не поддерживаются коллекции для каждого типа элемента управления. Например, не существует коллекции элементов управления CommandButton. Но тип элемента управления можно определить с помощью функции TypeName. Следующая процедура использует структуру For Each для циклического просмотра элементов коллекции Controls. В результате отображается количество элементов управления CommandButton, которые входят в коллекцию элементов управления объекта UserForm1 (этот код вы найдете в файле all userform controls.xlsm).
Sub CountButtons() Dim cbCount As Integer Dim ctl As Control cbCount = 0 For Each ctl In UserForm1.Controls If TypeName(ctl) = «CommandButton» Then _ cbCount = cbCount + 1 Next ctl MsgBox cbCount End Sub |
Настройка панели инструментов Toolbox
Если объект UserForm активен в редакторе VBE, на панели Toolbox отображаются элементы управления, которые можно добавить в пользовательское диалоговое окно. Панель Toolbox изначально содержит одну вкладку. Щелкните на ней правой кнопкой мыши и в контекстном меню выберите параметр New Page (Добавить страницу). Кроме того, можно изменить текст, который отображается на вкладке. Для этого выберите параметр Rename (Переименовать) из контекстного меню.
Рекомендуется предварительно настроить элементы управления и сохранить их для дальнейшего использования. Можно, например, в форме создать элемент управления CommandButton, который настроен на выполнение роли кнопки ОК. Можно изменять параметры кнопки: Width (Ширина), Height (Высота), Caption (Подпись), Default (По умолчанию) и Name (Имя). После этого перетащите модифицированный элемент управления CommandButton на панель инструментов Toolbox. Это приведет к созданию элемента управления. Щелкните на элементе управления правой кнопкой мыши, чтобы переименовать его или изменить значок.
Также можно создать раздел панели Toolbox, в котором будет содержаться несколько элементов управления. Например, вы вправе создать два элемента управления CommandButton, которые будут представлять кнопки ОК и Отмена. Настройте их так, как это необходимо. Затем выберите обе кнопки и переместите их на панель инструментов Toolbox. Впоследствии можно использовать новый элемент управления панели Toolbox для быстрого создания необходимых кнопок.
Этот метод также применим к элементам управления, которые используются в качестве контейнера. Например, создайте элемент управления Frame и добавьте в него четыре модифицированных элемента управления OptionButton (соответствующим образом расположив их на форме). После этого перетащите элемент управления Frame на панель инструментов Toolbox, чтобы создать модифицированный элемент управления Frame.
Можно разместить модифицированные элементы управления на отдельной вкладке панели Toolbox. Таким образом, появляется возможность экспортировать вкладку панели Toolbox для совместного применения другими пользователями Excel. Для экспорта вкладки панели Toolbox щелкните на ней правой кнопкой мыши и выберите пункт меню Export Page.
Среди прилагаемых к заметке файлов находится страничный файл под именем newcontrols.pag, который включает некоторые настроенные элементы управления. Можно импортировать этот файл в качестве новой вкладки окна Toolbox. Щелкните правой кнопкой мыши на вкладке и выберите команду Import Page. В результате панель Toolbox будет как на рис. 14.
Рис. 14. В окне Toolbox появилась страница с новыми элементами управления
Добавление элементов управления ActiveX
В пользовательском диалоговом окне содержатся и другие элементы управления ActiveX, разработанные компанией Microsoft и независимыми производителями. Для того чтобы добавить дополнительные элементы управления ActiveX на панель инструментов Toolbox, щелкните правой кнопкой мыши на ней и выберите пункт Additional Controls (Дополнительные элементы управления). В результате будет отображено диалоговое окно, показанное на рис. 15.
Рис. 15. В диалоговом окне Additional Controls можно найти дополнительные элементы управления ActiveX
В диалоговом окне Additional Controls содержатся все элементы управления ActiveX, установленные в системе. Выберите элементы управления, которые необходимо добавить на панель инструментов. После этого щелкните на кнопке ОК для добавления значков каждого из выбранных элементов управления. Не все элементы управления ActiveX, установленные в системе, поддерживаются пользовательскими диалоговыми окнами. Более того, большая их часть не поддерживается, к тому же некоторые элементы управления требуют лицензии на использование в приложениях. Если лицензия отсутствует, на экране появится сообщение об ошибке.
Создание шаблонов диалоговых окон
Зачастую при создании пользовательского диалогового окна каждый раз на форму добавляются одни и те же элементы управления. Например, все пользовательские диалоговые окна имеют два элемента управления CommandButton, используемых в качестве кнопок ОК и Отмена. В предыдущем разделе рассматривались методы комбинирования элементов управления с целью получения одного элемента управления, обладающего функциями двух. Еще одной программной уловкой может служить шаблон диалогового окна, который при необходимости импортируется для последующего создания на его основе других проектов. Преимущество шаблонного подхода заключается в следующем: процедуры обработки событий сохраняются вместе с шаблоном.
Начните с создания пользовательского диалогового окна, содержащего все элементы управления и настройки, которые необходимо повторно использовать в других проектах. После этого убедитесь, что диалоговое окно выделено. Выберите команду File –> Export File (или нажмите комбинацию клавиш <Ctrl+E>). После этого на экране появится запрос на ввод имени файла. Затем для создания проекта на основе шаблона выполните команду File –> lmport File, чтобы загрузить ранее сохраненное диалоговое окно.
Имитация диалоговых окон Excel. Внешний вид и поведение диалоговых окон Windows изменяются от программы к программе. При разработке приложений для Excel рекомендуется придерживаться стиля диалоговых окон Excel. Наилучшим методом изучения эффективных способов создания диалоговых окон является повторное создание одного из стандартных диалоговых окон Excel. Например, удостоверьтесь, что вы правильно определили комбинации клавиш и активизировали элементы управления. Для создания копии одного диалогового окна Excel следует протестировать его в различных условиях. Один только анализ диалоговых окон Excel поможет улучшить познания в вопросах структуры окон и методов создания элементов управления. Со временем вы убедитесь, что невозможно повторить отдельные диалоговые окна Excel даже с помощью VBA.
[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 405–438.
I want to add textboxes on runtime to my user form.
Currently I am doing this with this code:
Dim edtBox_n As Control
Set edtBox_n = usrFrm.Controls.Add("Forms.TextBox.1", "edtBox_n", True)
With edtBox_n
.Top = 20
.Left = 20
End With
However, I cannot manipulate textbox specific porperties like multiline, maxtext length etc.
Is there another option adding controls on runtime to a userfor which does not lack this requirement?
asked Nov 30, 2015 at 10:54
2
This works perfectly OK for me (tested on Excel 2007):
Dim edtBox_n As Control
Set edtBox_n = usrFrm.Controls.Add("Forms.TextBox.1", "edtBox_n", True)
With edtBox_n
.Top = 20
.Left = 20
.MultiLine = True
.EnterKeyBehavior = True
.Height = 100
End With
answered Nov 30, 2015 at 11:08
Pradeep KumarPradeep Kumar
6,7964 gold badges21 silver badges47 bronze badges
2
You might need to add the .visible = true as the first line after the With statement.
answered Feb 20, 2020 at 20:51
4