When we make a UserForm, it takes data as input from users. But the data provided to the form does not close itself, so it can mislead the user to input data again. So, we use two different commands to close a userform when we give the input. They use the “Unload Me” method to close a UserForm, or we can use a UserForm.Hide method.
Table of contents
- Excel VBA Close Userform
- How to Close UserForm in Excel VBA?
- #1 – Close Userform Using “Unload Me” Statement in VBA
- #2 – Close UserForm Using Hide Method in Excel VBA
- Difference Between Unload & Hide in Excel VBA
- Recommended Articles
- How to Close UserForm in Excel VBA?
UserForms are vital while getting inputs from the user as part of the VBA project. We usually design the UserForm before we present it in front of the user. Once designing the VBA UserForm completes, we need to show up the same in front of the user and require VBA coding. Similarly, to close the UserForm requires VBA coding knowledge.
This article will show you how to close the UserForm in VBA coding.
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 Close UserForm (wallstreetmojo.com)
How to Close UserForm in Excel VBA?
We must keep showing the UserForm in front of the user completing the purpose of the UserForm. So, we must close the UserForm. We can close the userform by using the “Unload Me” and “UserForm.Hide” statements. Even though both are slightly different, they will eventually serve our purpose.
You can download this VBA Close UserForm Excel Template here – VBA Close UserForm Excel Template
#1 – Close Userform Using “Unload Me” Statement in VBA
For example, look at the below image of the UserForm.
We have named the UserForm “MyUserForm.”
If we run the UserForm, we will see the UserForm like below.
We need to fill in the required details. Once we fill in the information, if we click on the “Submit” button, it will capture the same data to the worksheet, which is visible on the left side.
Clicking the “Submit” button captured the data we had entered in the UserForm.
If you notice, we have one more button called “Cancel.” What does this do?
Before we display the UserForm, we need to configure this button. So, we will go back to the basic visual editor to configure this button.
Now, we will double-click on the “Cancel” button. It will open up the automatic VBA subprocedureSUB 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 like the one below.
In this procedure, we need to write the VBA codeVBA 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 about what should happen if we click the “Cancel” button. When we click on this “Cancel” button, it should close the UserForm we are working on now.
So, write the code as “Unload Me.”
Code:
Private Sub CancelButton_Click() Unload Me End Sub
“Unload Me” is the word we use to close the UserForm we are working on. Here the UserForm recognizes the word “Me” as the UserForm itself.
“Unload Me” can be used only on that UserForm procedure. We cannot call this statement in other modules. If called, it will show the error message as “Invalid use of Me Keyword.”
Let us run the code using the F5 key or manually now. First, we will see a blank UserForm.
Fill in the data and click on “Submit.”
Once we click the “Submit” button, it will store the values to the mentioned cells.
If the data entry is complete, we need to close the UserForm. Isn’t it?
So, click on the “Cancel” button to close the UserForm. It will close the UserForm.
#2 – Close UserForm Using Hide Method in Excel VBA
We can also close UserForm using the “Hide” method in VBA. Once again, we will double-click the “Cancel” button to see the private subprocedure.
Since we have already written the code to close the UserForm, we can see the existing code in VBA. So, now we will delete this.
We need to call the UserForm by its name to use the “Hide” method. In this case, our UserForm name is “MyUserForm.”
After mentioning the UserForm by its name, if we put a dot (.), we can see all the properties and methods of this UserForm. Now, we will select the “Hide” method.
Let us run the UserForm one more time. We will see a blank UserForm. Fill in the details first.
Now, without a click on the “Submit” button, we will click the “Cancel” button, which will hide the UserForm.
Difference Between Unload & Hide in Excel VBA
It would help if you had a question about the difference between “Unload” and “Hide,” where both serve a similar purpose. There is a difference between these two. Now first, we will use the “Unload Me” statement. Look at the below image.
We have entered the data in the user form but have not yet submitted it. Therefore, if we click on “Cancel,” it will unload the UserForm.
We will run the code through excel shortcut keyAn Excel shortcut is a technique of performing a manual task in a quicker way.read more F5 or manually. It will display a blank UserForm.
Even though we had entered the data correctly by mistake, we clicked on the “Cancel” button. When the new UserForm appeared, we filled the data from scratch.
Now, we will use the “Hide” method.
No, we will click on the “Cancel” button. It will hide the visible UserForm. But, when we re-run the macro, it will come back with the data we have already entered on the UserForm.
Like this, we can use the “Unload” statement and “Hide” method to close the UserForm in Excel VBA.
Recommended Articles
This article has been a guide to VBA Close UserForm. Here, we learn how to close UserForm using the “Unload Me” statement and “Userform.Hide” method in Excel VBA with simple to advanced examples. Below are some useful Excel articles related to VBA: –
- FileDialog in VBA
- VBA InStr
- Use of COUNTIF in VBA
- Call Sub in VBA
VBA UserForms are a key tool for managing user interactions. When UserForms are well designed, they guide users through the options and settings without any help file or guidance. However, from my own UserForm development, I know one of the most overlooked aspects is how to close VBA UserForms. Is it best to hide or unload the form? Does it matter either way?
This post covers key considerations to ensure the closure process achieves the desired outcome.
Download the example file: Click the link below to download the example file used for this post:
Basic VBA code
To start, let’s look at the basic VBA code for opening and closing UserForms. In this post, the UserForm is called myUserForm, which looks like this.
The UserForm has three elements:
- Text box: named txtTextBox
- Hide button: named cmdHide
- Unload button: named cmdUnload
Display a UserForm
The code to display a UserForm is usually stored outside of the UserForm in a standard module. The following code displays a UserForm.
Sub OpenUserForm()
'Show a userform
myUserForm.Show
End Sub
Hide a UserForm
To hide a UserForm using a button, the code may be contained within the UserForm itself, or in a separate module.
Code contained within the UserForm
The code below shows an example where the code is contained within the UserForm. Me. refers to the UserForm object.
Private Sub cmdHide_Click()
'Hide the UserForm using code within the UserFrom module
Me.Hide
End Sub
Code contained within a standard code module
Where the code is contained within another module, we must refer to the name of the UserForm, as shown by the code below.
Sub hideMyForm() myUserForm.Hide End Sub
When using the hide code outside of the UserForm, we need to call the code from the button.
Private Sub cmdHide_Click()
'Call the code contained within a standard module
Call hideMyForm
End Sub
Unload a UserForm
Another way to close a UserForm is to unload it. Like the examples above, the code can be referenced from within or outside the UserForm code module.
Code contained within the UserForm
The code is an example where the code is contained within the UserForm.
Private Sub cmdUnload_Click()
'Unload the UserForm using code within the UserForm module
Unload Me
End Sub
Code contained within a standard code module
The example below is where the code is contained within a standard code module
Sub unloadMyForm()
'Unload the UserForm using code within a standard module
Unload myUserForm
End Sub
When using the unhide code outside of the UserForm, we need to call the code from the UserForm.
Private Sub cmdUnload_Click()
'Call the code contained within a standard module
Call unloadMyForm
End Sub
Close button
The simplest option to close a UserForm is the standard [X] close button. It is convenient because it is always at the top of the window where the user expects it. By default, it doesn’t require any code to work as it’s part of the Windows framework.
The close button is equivalent to the unload method to close the VBA UserFrom.
Assigning the Esc key
The Esc key is commonly used within interface design to close a window. We can use this on our UserForm too, though the option to apply the setting is in a strange place.
Select a button on the UserForm and set the Cancel property to True.
When the UserForm is displayed, pressing the Esc key triggers the button with the Cancel property. Therefore, the Esc key can be assigned to a button with hide or unload.
As there is an option to hide or unload, which should we choose? Does it matter? YES, it definitely does matter.
The two options differ in their approach; they achieve slightly different things.
Unload
Unload closes the form completely; it no longer exists in memory. It will be as if the initialize event had never triggered, so if we refer to any of the objects on the UserForm, they will have no value.
Hide
Hide makes a UserForm invisible. It is still there; we just can’t see it. As it still exists, we can still reference objects on the form to retrieve their values.
For example, if there is text in a text box, we can obtain that value after the form has closed. The code below displays a message box with the text from the UserForm.
Sub displayTextFromClosedUserForm()
'Display the text contained within the UserFrom text box
'If UserFrom not loaded, it will display nothing
'If UserForm hidden, will display the value
MsgBox myUserForm.txtTextBox
End Sub
Note: As the form remains open, it continues to hold the memory.
Preloading the UserForm
What if we want to reference an object on a UserForm before we display it? The initialize event has not been executed, and the form does not exist in memory. To get around this issue, we use the load command to create the UserForm, but not display it.
Sub LoadUserForm()
'Load the UserForm without displaying
Load myUserForm
End Sub
By using this method, the initialize event triggers, but not the activate event. The activate event only triggers only when the UserForm is displayed.
To guarantee the UserForm is always in memory, load the form during the workbook open event.
How to close using the X button
By default, the [X] close button unloads the UserForm. Which is a problem if we want to hide it. But we can hijack the [X] button control to achieve the same as the hide command.
The UserForm has an event called QueryClose. Using this event, we can cancel the unload action, then hide the UserForm.
Enter the following code in the UserFrom code module
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Capture the [X] button click
If CloseMode = vbFormControlMenu Then
'Stop the default unload close
Cancel = True
'Force the Hide close
Me.Hide
End If
End Sub
Once we’ve canceled the unload action, we can now refer to the elements on the UserForm, just like the normal hide.
How did the user close the form?
As there are multiple ways to close a UserForm, it may be helpful to know which option the user selected. For example, did they click “OK” or “Cancel”?
In this situation, an easy option is to use a public variable. We can assign the value to the variable as part of the close procedure.
The public variable can then be accessed by any module.
Related Posts:
- Resize a UserForm with VBA or Windows API
- Hide or disable a VBA UserForm [X] close button
- Private vs Public Subs, Variables & Functions in VBA
About the author
Hey, I’m Mark, and I run Excel Off The Grid.
My parents tell me that at the age of 7 I declared I was going to become a qualified accountant. I was either psychic or had no imagination, as that is exactly what happened. However, it wasn’t until I was 35 that my journey really began.
In 2015, I started a new job, for which I was regularly working after 10pm. As a result, I rarely saw my children during the week. So, I started searching for the secrets to automating Excel. I discovered that by building a small number of simple tools, I could combine them together in different ways to automate nearly all my regular tasks. This meant I could work less hours (and I got pay raises!). Today, I teach these techniques to other professionals in our training program so they too can spend less time at work (and more time with their children and doing the things they love).
Do you need help adapting this post to your needs?
I’m guessing the examples in this post don’t exactly match your situation. We all use Excel differently, so it’s impossible to write a post that will meet everybody’s needs. By taking the time to understand the techniques and principles in this post (and elsewhere on this site), you should be able to adapt it to your needs.
But, if you’re still struggling you should:
- Read other blogs, or watch YouTube videos on the same topic. You will benefit much more by discovering your own solutions.
- Ask the ‘Excel Ninja’ in your office. It’s amazing what things other people know.
- Ask a question in a forum like Mr Excel, or the Microsoft Answers Community. Remember, the people on these forums are generally giving their time for free. So take care to craft your question, make sure it’s clear and concise. List all the things you’ve tried, and provide screenshots, code segments and example workbooks.
- Use Excel Rescue, who are my consultancy partner. They help by providing solutions to smaller Excel problems.
What next?
Don’t go yet, there is plenty more to learn on Excel Off The Grid. Check out the latest posts:
Excel VBA Close UserForm
Earlier we had discussed how to create a UserForm in VBA. Now to get input from the user there was a button for submit, which stored then the value given by the user in an excel sheet. But what after giving the value the form is still there. Or what if the user does not want to give any data and close the userform. We had not discussed how we will close the userform for the user. Similar to submit button to submit the data we had another button which was for cancel which is used to hide the userform. The cancel button also has its own code to hide the userform from the user. Now there are two methods by which we can hide a userform. They are as follows:
- The first method is when we use the Unload Me method. This method unloads the UserForm and it disappears from the display.
- Another method is when we use Useform.Hide method. This method hides the UserForm from the display.
It is recommended to use the second method to close the UserForm as the first method will completely unload the UserForm and any data entered by the user will be completely lost. But when we use the second method of hiding the UserForm, then the last entry done on the userform by the user is still present.
How to Close UserForm in Excel VBA?
We will learn about how to close UserForm in Excel VBA with its difference and by a few examples but first, let us learn the method of closing a userform in VBA.
There are two methods to close userform in VBA:
- Unload Me
- Hide
You can download this VBA Close UserForm Excel Template here – VBA Close UserForm Excel Template
Excel VBA Close UserForm – Example #1
First, let us try the method of closing a UserForm using the Unload Me option. We had a userform in our previous article which looks like the one below.
For the submit button we had our code, which stored the data entered by the user in excel. Now double click on the cancel button which will open the code for the same as follows,
Code:
Private Sub CommandButton2_Click() End Sub
Cancel Button was the second command button we provided to the userform. Now write the code statement as Unload me in the section as shown in the image below.
Code:
Private Sub CommandButton2_Click() Unload Me End Sub
We can see that Me is an Object of Unload statement. Now let us run the userform by pressing the F5 key to display it.
Press Cancel button to see that the userform disappears and it takes us back to the original userform of the project window.
Excel VBA Close UserForm – Example #2
Now let us try the second method which userform.hide method in a similar fashion as above, first, let us open the userform from the userform in the project window.
Now double click the cancel button which will open the view code for the cancel command button.
We already have Unload Me statement present in the cancel command button, clear the code and replace it with the Userform.Hide statement.
Code:
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Now let us again run the userform by pressing F5 key and display it on the screen.
When we press the cancel button we are again moved to the project window of the userform. Now we all might be wondering that what is the difference between the two methods, as both the methods close the userform for us perfectly then why is the second method most recommended method of both. We will find out exactly why in the next two examples.
Excel VBA Close UserForm – Example #3
Now let us move to the first method Unload Me statement for the cancel button and provide some data to the userform. Double click on the cancel button from the userform to open the view code for the command button and replace the code with the Unload Me statement as follows.
Code:
Private Sub CommandButton2_Click() Unload Me End Sub
Now run the userform again by pressing the F5 key and make it display on the screen.
Let us provide some data to the userform as follows, now don’t press the submit button, press the Cancel button.
Again run the userform by pressing F5 key.
Now we can see that we have lost the data we have provided to the userform since we did not submit it, it was not stored in the worksheet and we closed the userform using the Unload Me statement which removed the data which was already filled.
Excel VBA Close UserForm – Example #4
Now let us do the same exercise but by using Userform.Hide statement,
In the cancel command button replace the code for it using the userform.hide method as shown below.
Code:
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Now we will again run the userform by pressing the F5 key and provide it with some data as follows.
Now let us press the cancel button, and again run the userform which will give us the following result.
The data is not even lost when we pressed the cancel button if we press submit it will store the data in excel as follows.
Now the data is stored the userform is empty now and we can close the userform using the cancel button,
Things to Remember
- Once the data entry has been done by the user we need to close the userform so it is as important as the submit button.
- Close Userform is in the command button of the userform in VBA, In general, it is named as Cancel or Close.
- There are two separate methods of closing a userform but they eventually serve the same purpose as each other.
- The Userform.Hide method is most recommended as even if the userform is closed by the user before the data entry, the data is not lost and the entry made by the user is again displayed when a user opens the userform.
Recommended Articles
This is a guide to VBA Close UserForm. Here we discuss how to close UserForm in Excel using Unload Me statement and Userform. Hide method in VBA along with some practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA Activate Sheet
- VBA IsError
- VBA List Box
- VBA With
Уважаемые форумчане! Напомните, плиззз, команды в VBA для сохранения и закрытия userform. Спасибо! |
|
А что значит сохранить? У формы нет такой функции А закрыть можно так Sub Макрос1() метод Hide — просто скрывает формулу от пользователя |
|
{quote}{login=Pavel55}{date=28.04.2008 06:41}{thema=}{post}А что значит сохранить? У формы нет такой функции А закрыть можно так Sub Макрос1() метод Hide — просто скрывает формулу от пользователя Всем спасибо уже сделал так |
|
)) ну, всё правильно) только вы спрашивали о сохранении формы, а сами сохраняете активную книгу ) или нам надо было догадаться ?) |
|
СердЖиГ Гость |
#5 29.04.2008 11:34:08 {quote}{login=Pavel55}{date=28.04.2008 10:07}{thema=}{post})) ну, всё правильно) только вы спрашивали о сохранении формы, а сами сохраняете активную книгу ) или нам надо было догадаться ?){/post}{/quote} Павел, сорри, уже вечер был |
Return to VBA Code Examples
In this tutorial, you will learn how to initialize, open, and close a Userform using VBA.
For this example, we created a simple Userform called basicUserform shown below with a label, a textbox, and three command buttons.
Open a Userform using VBA
Use the Show Command to open the Userform called basicUserform:
basicUserform.Show
Close a Userform using VBA
You can close a form using the Unload Command:
Unload basicUserform
This will close the UserForm from within running code.
Instead, you can also use the Me keyword to close a form within the form’s code module:
Unload Me
Note: You can only use Unload Me in procedures contained in the Userform Code Module:
Notice in the example above we added “Unload.Me” to the “Click” event of the Cancel button. So when the user clicks the Cancel button, the form will unload.
You can access the UserForm Code Module by double-clicking on the module in the Code Explorer (on the left). Or by right-clicking in the UserForm visual editor.
Initialize a Userform in VBA
When a form is loaded, the “Initialize” event is triggered. You can use this event to change the UserForm appearance such as populating combo boxes or turning controls on/off in your initialization code.
This code will disable the Cancel button when the UserForm is launched:
Private Sub UserForm_Initialize()
cmdCancel.Enabled = False
End Sub
Note: This code must be placed in the UserForm code module (see picture above).
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!
- Excel VBA Закрыть UserForm
Excel VBA Закрыть UserForm
Ранее мы обсуждали, как создать пользовательскую форму в VBA. Теперь для получения ввода от пользователя была кнопка для отправки, в которой затем сохранялось значение, указанное пользователем в листе Excel. Но что после придания значения, форма все еще там. Или что делать, если пользователь не хочет предоставлять какие-либо данные и закрывать форму пользователя. Мы не обсуждали, как мы закроем пользовательскую форму для пользователя. Аналогично кнопке отправки для отправки данных у нас была другая кнопка, которая была для отмены, которая используется для скрытия пользовательской формы. Кнопка отмены также имеет свой собственный код, чтобы скрыть пользовательскую форму от пользователя. Теперь есть два метода, с помощью которых мы можем скрыть пользовательскую форму. Они заключаются в следующем:
- Первый метод — когда мы используем метод Unload Me. Этот метод выгружает пользовательскую форму и исчезает с дисплея.
- Другой метод, когда мы используем метод Useform.Hide. Этот метод скрывает пользовательскую форму от дисплея.
Рекомендуется использовать второй метод, чтобы закрыть пользовательскую форму, так как первый метод полностью выгружает пользовательскую форму, и любые введенные пользователем данные будут полностью потеряны. Но когда мы используем второй метод сокрытия пользовательской формы, тогда последняя запись, сделанная пользователем в пользовательской форме, все еще присутствует.
Как закрыть UserForm в Excel VBA?
Мы узнаем о том, как закрыть UserForm в Excel VBA с его различием, и на нескольких примерах, но сначала давайте изучим способ закрытия пользовательской формы в VBA.
Есть два способа закрыть пользовательскую форму в VBA:
- Выгрузить меня
- Спрятать
Вы можете скачать этот шаблон VBA Закрыть UserForm Excel здесь — VBA Закрыть шаблон UserForm Excel
Excel VBA Закрыть UserForm — Пример # 1
Во-первых, давайте попробуем метод закрытия UserForm, используя опцию Unload Me. У нас была пользовательская форма в нашей предыдущей статье, которая выглядит как приведенная ниже.
Для кнопки отправки у нас был наш код, в котором были сохранены данные, введенные пользователем в Excel. Теперь дважды нажмите на кнопку отмены, которая откроет код для того же, как показано ниже,
Код:
Частный Sub CommandButton2_Click () End Sub
Кнопка «Отмена» была второй командной кнопкой, которую мы предоставили пользовательской форме. Теперь напишите оператор кода как Unload me в разделе, как показано на рисунке ниже.
Код:
Приватный саб CommandButton2_Click () Unload Me End Sub
Мы можем видеть, что Me является оператором Object of Unload. Теперь давайте запустим пользовательскую форму, нажав клавишу F5, чтобы отобразить ее.
Нажмите кнопку «Отмена», чтобы увидеть, что пользовательская форма исчезает, и она возвращает нас к исходной пользовательской форме окна проекта.
Excel VBA Закрыть UserForm — Пример № 2
Теперь давайте попробуем второй метод, метод userform.hide, аналогичный описанному выше, во-первых, давайте откроем форму пользователя из формы пользователя в окне проекта.
Теперь дважды нажмите кнопку отмены, которая откроет код просмотра для кнопки отмены.
У нас уже есть оператор Unload Me, присутствующий в кнопке отмены, очистите код и замените его на оператор Userform.Hide .
Код:
Приватный Sub CommandButton2_Click () UserForm1.Hide End Sub
Теперь давайте снова запустим пользовательскую форму, нажав клавишу F5, и отобразим ее на экране.
Когда мы нажимаем кнопку отмены, мы снова перемещаемся в окно проекта пользовательской формы. Теперь всем нам может быть интересно, в чем разница между этими двумя методами, поскольку оба метода полностью закрывают для нас пользовательскую форму, тогда почему второй метод является наиболее рекомендуемым методом для обоих. Мы точно выясним, почему в следующих двух примерах.
Excel VBA Закрыть UserForm — Пример № 3
Теперь давайте перейдем к первому методу Unload Me оператора для кнопки отмены и предоставим некоторые данные для пользовательской формы. Дважды щелкните на кнопке отмены в пользовательской форме, чтобы открыть код представления для командной кнопки и заменить код оператором Unload Me, как показано ниже.
Код:
Приватный саб CommandButton2_Click () Unload Me End Sub
Теперь снова запустите пользовательскую форму, нажав клавишу F5, и отобразите ее на экране.
Давайте предоставим некоторые данные для пользовательской формы следующим образом, теперь не нажимайте кнопку отправки, нажмите кнопку «Отмена».
Снова запустите пользовательскую форму, нажав клавишу F5.
Теперь мы можем видеть, что мы потеряли данные, которые мы предоставили пользовательской форме, так как мы не предоставили ее, она не была сохранена на рабочем листе, и мы закрыли пользовательскую форму с помощью оператора Unload Me, который удалил уже заполненные данные.
Excel VBA Закрыть UserForm — Пример № 4
Теперь давайте сделаем то же самое упражнение, но с помощью оператора Userform.Hide,
В командной кнопке отмены замените код, используя метод userform.hide, как показано ниже.
Код:
Приватный Sub CommandButton2_Click () UserForm1.Hide End Sub
Теперь мы снова запустим пользовательскую форму, нажав клавишу F5, и предоставим ей некоторые данные следующим образом.
Теперь давайте нажмем кнопку отмены и снова запустим пользовательскую форму, которая даст нам следующий результат.
Данные даже не теряются, когда мы нажимаем кнопку «Отмена», если мы нажимаем «Отправить», данные сохраняются в Excel следующим образом.
Теперь данные сохранены, пользовательская форма теперь пуста, и мы можем закрыть пользовательскую форму, используя кнопку отмены,
То, что нужно запомнить
- После того, как пользователь введет данные, нам нужно закрыть пользовательскую форму, чтобы она была так же важна, как кнопка отправки.
- Закрыть пользовательская форма находится в командной кнопке пользовательской формы в VBA. Как правило, она называется Отмена или Закрыть.
- Есть два отдельных метода закрытия пользовательской формы, но они в конечном итоге служат той же цели, что и друг друга.
- Метод Userform.Hide наиболее рекомендуется, поскольку даже если пользовательская форма закрыта пользователем перед вводом данных, данные не теряются, и введенная пользователем запись снова отображается, когда пользователь открывает пользовательскую форму.
Рекомендуемые статьи
Это руководство по VBA Close UserForm. Здесь мы обсудим, как закрыть UserForm в Excel, используя оператор Unload Me и метод Userform.Hide в VBA, а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи —
- Как активировать лист в VBA?
- Оценить формулу в Excel
- Полное руководство по списку VBA
- HYPERLINK Формула в Excel
В настоящей заметке рассматриваются методы создания пользовательских форм и работы с ними.[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.
This post provides an in-depth guide to the VBA Userform starting from scratch.
The table of contents below shows the areas of the VBA UserForm that are covered and the section after this provides a quick guide so you can refer back to the UserForm code easily.
“The system should treat all user input as sacred.” – Jef Raskin
A Quick Guide to the VBA UserForm
The following table provides a quick guide to the most common features of the UserForm
Function | Examples |
---|---|
Declare and create | Dim form As New userformCars |
Declare and create | Dim form As userformCars Set form = New userformCars |
Show as modal | form.Show OR form.Show vbModal |
Show as non modal | form.Show vbModeless |
Unload | Private Sub buttonCancel_Click() Unload Me End Sub |
Hide | Private Sub buttonCancel_Click() Hide End Sub |
Getset the title | form.Caption = «Car Details» |
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
The VBA UserForm is a very useful tool. It provides a practical way for your application to get information from the user.
If you are new to UserForms you may be overwhelmed by the amount of information about them. As with most topics in VBA, 90% of the time you will only need 10% of the functionality.
In these two blog posts(part 2 is here) I will show you how to quickly and easily add a UserForm to your application.
This first post covers creating the VBA Userform and using it as modal or modeless. I will also show you how to easily pass the users selection back to the calling procedure.
In the second part of this post I will cover the main controls such as the ListBox, the ComboBox(also called the Dropdown menu), the TextBox and the CheckBox. This post will contain a ton of examples showing how to use each of these controls.
Related Articles
VBA Message Box
VBA UserForm Controls
Download the Code
What is the VBA Userform?
The VBA UserForm is a dialog which allows your application to get input from the user. UserForms are used throughout all Windows applications. Excel itself has a large number of UserForms such as the Format Cells UserForm shown in the screenshot below.
Excel’s “Format cells” UserForm
UserForms contain different types of controls such as Buttons, ListBoxes, ComboBoxes(Dropdown lists), CheckBoxes and TextBoxes.
In the Format Cells screenshot above you can see examples of these controls:
- Font, Font style and Size contain a textbox with a ListBox below it
- Underline and Color use a Combobox
- Effects uses three CheckBoxes
- Ok and Cancel are command Buttons
There are other controls but these are the ones you will use most of the time.
The Built-in VBA Userforms
It is important to note that VBA has some useful built-in UserForms. These can be very useful and may save you having to create a custom one. Let’s start by having a look at the MsgBox.
VBA MsgBox
The VBA message box allows you to display a dialog to the user. You can choose from a collection of buttons such as Yes, No, Ok and Cancel.
You can easily find out which of these buttons the user clicked on and use the results in your code.
The following code shows two simple examples of using a message box
' https://excelmacromastery.com/ Sub BasicMessage() ' Basic message MsgBox "There is no data on this worksheet " ' Basic message with "Error" as title MsgBox "There is no data on this worksheet ", , "Error" End Sub
In the next example, we ask the user to click Yes or No and print a message displaying which button was clicked
' https://excelmacromastery.com/ Sub MessagesYesNoWithResponse() ' Display Yes/No buttons and get response If MsgBox("Do you wish to continue? ", vbYesNo) = vbYes Then Debug.Print "The user clicked Yes" Else Debug.Print "The user clicked No" End If End Sub
In the final example we ask the user to click Yes, No or Cancel
' https://excelmacromastery.com/ Sub MessagesYesNoCancel() ' Display Yes/No buttons and get response Dim vbResult As VbMsgBoxResult vbResult = MsgBox("Do you wish to continue? ", vbYesNoCancel) If vbResult = vbYes Then Debug.Print "The user clicked Yes" ElseIf vbResult = vbNo Then Debug.Print "The user clicked No" Else Debug.Print "The user clicked Cancel" End If End Sub
You can see all the MsgBox options here.
InputBox
If you want to get a single piece of text or value from the user you can use the InputBox. The following code asks the user for a name and writes it to the Immediate Window(Ctrl + G):
' Description: Gets a value from the InputBox ' The result is written to the Immediate Window(Ctrl + G) ' https://excelmacromastery.com/vba-userform/ Sub GetValue() Dim sValue As String sValue = Application.InputBox("Please enter your name", "Name Entry") ' Print to the Immediate Window Debug.Print sValue End Sub
You can add validation to the InputBox function using the Type parameter:
' https://excelmacromastery.com/ Public Sub InputBoxTypes() With Application Debug.Print .InputBox("Formula", Type:=0) Debug.Print .InputBox("Number", Type:=1) Debug.Print .InputBox("Text", Type:=2) Debug.Print .InputBox("Boolean", Type:=4) Debug.Print .InputBox("Range", Type:=8) Debug.Print .InputBox("Error Value", Type:=16) Debug.Print .InputBox("Array", Type:=64) End With End Sub
You can download the workbook with all the code examples from the top of this post.
GetOpenFilename
We can use the Windows file dialog to allow the user to select a file or multiple files.
The first example allows the user to select a file
' Print the name of the selected file sfile = Application.GetOpenFilename("Excel Files (*.xlsx),*.xlsx") Debug.Print sfile
The following example allows the user to select multiple files
' https://excelmacromastery.com/ Sub GetMultipleFiles() Dim arr As Variant arr = Application.GetOpenFilename("Text Files(*.txt),*.txt" _ , MultiSelect:=True) ' Print all the selected filenames to the Immediate window Dim filename As Variant For Each filename In arr Debug.Print filename Next End Sub
Note: If you need more flexibility then you can use the File Dialog. This allows you to use the “Save as” file dialog, select folders and so on.
How to Create a VBA UserForm
If the built-in UserForms do not cover your needs then you will need to create your own custom Userform. To use a UserForm in our code we must first create one. We then add the necessary controls to this Userform.
We create a UserForm with the following steps
- Open the Visual Basic Editor(Alt + F11 from Excel)
- Go to the Project Window which is normally on the left(select View->Project Explorer if it’s not visible)
- Right-click on the workbook you wish to use
- Select Insert and then UserForm(see screenshot below)
Creating a Userform
A newly created UserForm will appear. Anytime you want to access this Userform you can double click on the UserForm name in the Project window.
The Toolbox dialog should also be visible. If it’s not visible select View->Toolbox from the menu. We use the toolbox too add controls to our UserForm.
The UserForm Toolbox
Designing the VBA UserForm
To view the design of the UserForm, double click on it in the Project window. There are three important windows we use when creating our UserForms.
- The UserForm
- The properties window – this is where we can change the setting of the Userform and its controls
- The toolbox – we use this to add new controls to our UserForm
UserForm Windows
A Very Simple VBA UserForm Example
Let’s have a look at a very simple UserForm example.
You can download this and all the code examples from the top of this post.
- Create a new UserForm
- Rename it to userformTest in the (Name) property in the properties window
- Create a new module(Right-click on properties window and select Insert->Module)
- Copy the DislayUserForm sub below to the module
- Run the sub using Run->Run UserForm Sub from the menu
- The UserForm will be displayed – you have created your first UserForm application!
- Click on the X in the top right of the UserForm to close
' https://excelmacromastery.com/ Sub DisplayUserForm() Dim form As New UserFormTest form.Show End Sub
Setting the Properties of the UserForm
We can change the attributes of the UserForm using the properties window. Select View->Properties Window if the window is not visible.
When we click on the UserForm or a control on a UserForm then the Properties window displays the attributes of that item.
VBA Properties Window
Generally speaking, you only use a few of these properties. The important ones for the UserForm are Name and Caption.
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
- Type in the new name
The Controls of the VBA UserForm
We add controls to the UserForms to allow the user to make selections, enter text or click a button. To add a control use the steps below
- Go to the toolbox dialog – if not visible select View->Toolbox
- Click on the control you want to add – the button for this control will appear flat
- Put the cursor over the UserForm
- Hold down the left mouse button and drag until the size you want
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 |
Adding Code to the VBA UserForm
To view the code of the UserForm
- Right-click on the UserForm in the properties windows(or the UserForm itself) and select “View Code”
- You will see a sub called UserForm_Click. You can delete this when you create your first sub
Note: If you double click on a control it will bring you to the click event of that control. This can be a quicker way to get to the UserForm code.
Adding Events to the VBA UserForm
When we use a UserForm we are dealing with events. What this means is that we want to perform actions when events occur. An event occurs when the users clicks a button, changes text, selects an item in a ComboBox, etc. We add a Sub for a particular event and place our code in it. When the event occurs our code will run.
One common event is the Initialize event which occurs when the UserForm is created at run time. We normally use this event to fill our controls with any necessary data. We will look at this event in the section below.
To add an event we use the ComboBoxes over the code window(see screenshot above). The left one is used to select the control and the right one is used to select the event. When we select the event it will automatically add this sub to our UserForm module.
Note: Clicking on any control on the UserForm will create the click event for that control.
The Initialize Event of the VBA UserForm
The first thing we want to do with a UserForm is to fill the controls with values. For example, if we have a list of countries for the user to select from we could use this.
To do this we use the Initialize event. This is a sub that runs when the UserForm is created(see next section for more info).
To create the Initialize event we do the following
- Right-click on the UserForm and select View Code from the menu.
- In the Dropdown list on the left above the main Window, select UserForm.
- This will create the UserForm_Click event. You can ignore this.
- In the Dropdown list on the right above the main Window, select Initialize.
- Optional: Delete the UserForm_Click sub created in step 2.
Adding the Initialize Event
We can also create the Initialize event by copying or typing the following code
Private Sub UserForm_Initialize() End Sub
Once we have the Initialize event created we can use it to add the starting values to our controls. We will see more about this in the second part of this post.
Initialize versus Activate
The UserForm also has an Activate event. It is important to understand the difference between this and the Initialize event.
The Initialize event occurs when the actual object is created. This means as soon as you use on of the properties or functions of the UserForm. The code example below demonstrates this
Dim frm As New UserForm1 ' Initialize will run as UserForm is created ' the first time we use it frm.BackColor = rgbBlue frm.Show
We normally reference the UserForm first by calling Show which makes it seem that displaying the UserForm is triggering the Initialize event. This is why there is often confusion over this event.
In the example below calling Show is the first time we use the UserForm. Therefore it is created at this time and the Initialize event is triggered.
Dim frm As New UserForm1 ' Initialize will run here as the Show is the ' first time we use the UserForm frm.Show
The Activate event occurs when the UserForm is displayed. This can happen using Show. It also occurs any time the UserForm is displayed. For example, if we switch to a different window and then switch back to the UserForm then the Activate event will be triggered.
We create the Activate event the same way we create the Initialize event or we can just copy or type the following code
Private Sub UserForm_Activate() End Sub
- Initialize occurs when the Userform is created. Activate occurs when the UserForm is displayed.
- For each UserForm you use – Initialize occurs only once, Activate occurs one or more times.
Calling the VBA UserForm
We can use the VBA UserForm in two ways
- Modal
- Modeless
Let’s look at each of these in turn.
Modal Userform
Modal means the user cannot interact with the parent application while this is visible. The excel Format cells dialog we looked at earlier is a modal UserForm. So are the Excel Colors and Name Manager dialogs.
We use modal when we don’t want the user to interact with any other part of the application until they are finished with the UserForm.
Modeless Userform
Modeless means the user can interact with other parts of the application while they are visible. An example of modeless forms in Excel is the Find dialog(Ctrl + F).
You may notice that any Excel dialog that allows the user to select a range has a limited type of Modeless – the user can select a range of cells but cannot do much else.
Modal versus Modeless
The actual code to make a UserForm modal or modeless is very simple. We determine which type we are using when we show the UserForm as the code below demonstrates
Dim frm As New UserFormFruit ' Show as modal - code waits here until UserForm is closed frm.Show vbModal ' Show as modeless - code does not wait frm.Show vbModeless ' default is modal frm.Show
As the comments above indicate, the code behaves differently for Modal and Modeless. For the former, it waits for the UserForm to close and for the latter, it continues on.
Even though we can display any UserForm as modal or modeless we normally use it in one way only. This is because how we use them is different
Typical use of a Modal form
With a Modal UserForm we normally have an Ok and a Cancel button.
The Ok button normally closes the UserForm and performs the main action. This could be saving the user inputs or passing them back to the procedure.
The Cancel button normally closes the UserForm and cancels any action that may have taken place. Any changes the user made on the UserForm are ignored.
Typical use of a Modeless form
With a Modeless UserForm we normally have a close button and an action button e.g. the Find button on the Excel Find Dialog.
When the action button is clicked an action takes place but the dialog remains open.
The Close button is used to close the dialog. It normally doesn’t do anything else.
A VBA UserForm Modal Example
We are going to create a Modal UserForm example. It is very simple so you can see clearly how to use a UserForm.
You can download this and all the code examples from the top of this post.
The following UserForm allows the user to enter the name of a fruit:
We use the following code to show this UserForm and to retrieve the contents of the fruit textbox:
' PROCEDURE CODE ' https://excelmacromastery.com/ Sub UseModal() ' Create and show form Dim frm As New UserFormFruit ' Display Userform - The code in this procedure ' will wait here until the form is closed frm.Show ' Display the returned value MsgBox "The user has selected " & frm.Fruit ' Close the form Unload frm Set frm = Nothing End Sub ' USERFORM CODE ' Returns the textbox value to the calling procedure Public Property Get Fruit() As String Fruit = textboxFruit.Value End Property ' Hide the UserForm when the user click Ok Private Sub buttonOk_Click() Hide End Sub
What you will notice is that we hide the UserForm when the user clicks Ok. We don’t set it to Nothing or unload it until after we are finished retrieving the user input. If we Unload the UserForm when the user clicks Ok then it no longers exists so we cannot access the values we want.
Using UserForm_QueryClose to Cancel the UserForm
We always want to give the user the option to cancel the UserForm. Once it is canceled we want to ignore any selections the user made.
Each form comes with an X in the top right-hand corner which allows the user to cancel it:
The X button on the UserForm
This button cancels the UserForm automatically – no code is necessary. When the user clicks X the UserForm is unloaded from memory. That is, it no longer exists so we will get an error if we try to access it. The code below will give an error if the user clicks on the X
' https://excelmacromastery.com/ Sub DisplayFruit() Dim frm As New UserFormFruit frm.Show ' ERROR HERE - If user clicks the X button Debug.Print frm.Fruit End Sub
To avoid this error we want to prevent the UserForm from being Unloaded when the X button is clicked. To do this we use the QueryClose event.
We create a variable first at the top of the UserForm code module. We also add a property so that we can read the variable when we need to retrieve the value:
Private m_Cancelled As Boolean Public Property Get Cancelled() As Variant Cancelled = m_Cancelled End Property
Then we add the UserForm_QueryClose event to the UserForm module:
' https://excelmacromastery.com/ Private Sub UserForm_QueryClose(Cancel As Integer _ , CloseMode As Integer) ' Prevent the form being unloaded If CloseMode = vbFormControlMenu Then Cancel = True ' Hide the Userform and set cancelled to true Hide m_Cancelled = True End Sub
In the first line, we prevent the UserForm from being unloaded. With the next lines, we hide the UserForm and set the m_Cancelled variable to true. We will use this variable later to check if the UserForm was canceled:
We can then update our calling procedure to check if the UserForm was canceled
' PROCEDURE CODE ' https://excelmacromastery.com/ Sub DisplayFruit() Dim frm As New UserFormFruit frm.Show If frm.Cancelled = False Then MsgBox "You entered: " & frm.Fruit Else MsgBox "The UserForm was cancelled." End If End Sub
If we want to add a Cancel button it is simple to do. All we need to do is Hide the form and set the variable m_Cancelled to true. This is the same as we did in the QueryClose Event above:
' https://excelmacromastery.com/vba-userform/ Private Sub buttonCancel_Click() ' Hide the Userform and set cancelled to true Hide m_Cancelled = True End Sub
Using the Escape key to cancel
If you want to allow the user to cancel using the Esc it is simple(but not obvious) to do. You set the Cancel property of your ‘Cancel’ button to True. When Esc is pressed the click event of your Cancel button will be used.
Putting All the Modal Code Together
The final code for a Modal form looks like this:
' USERFORM CODE ' https://excelmacromastery.com/ Private m_Cancelled As Boolean ' Returns the cancelled value to the calling procedure Public Property Get Cancelled() As Boolean Cancelled = m_Cancelled End Property ' Returns the textbox value to the calling procedure Public Property Get Fruit() As String Fruit = textboxFruit.Value End Property Private Sub buttonCancel_Click() ' Hide the Userform and set cancelled to true Hide m_Cancelled = True End Sub ' Hide the UserForm when the user click Ok Private Sub buttonOk_Click() Hide End Sub ' Handle user clicking on the X button Private Sub UserForm_QueryClose(Cancel As Integer _ , CloseMode As Integer) ' Prevent the form being unloaded If CloseMode = vbFormControlMenu Then Cancel = True ' Hide the Userform and set cancelled to true Hide m_Cancelled = True End Sub ' PROCEDURE CODE ' https://excelmacromastery.com/ Sub DisplayFruit() ' Create the UserForm Dim frm As New UserFormFruit ' Display the UserForm frm.Show ' Check if the user cancelled the UserForm If frm.Cancelled = True Then MsgBox "The UserForm was cancelled." Else MsgBox "You entered: " & frm.Fruit End If ' Clean up Unload frm Set frm = Nothing End Sub
&nbps;
You can use this code as a framework for any Modal UserForm that you create.
VBA Minimize UserForm Error
We are now going to use a simple example to show how to use a Modeless VBA UserForm. In this example, we will add a customer name to a worksheet each time the user clicks on the Add Customer button.
You can download this and all the code examples from the top of this post.
The code below displays the UserForm in Modeless mode. The problem with this code is that if you minimize Excel the UserForm may not be visible when you restore it:
' PROCEDURE CODE ' https://excelmacromastery.com/ Sub UseModeless() Dim frm As New UserFormCustomer ' Unlike the modal state the code will NOT ' wait here until the form is closed frm.Show vbModeless End Sub
The code below solves the problem above. When you display a Userform using this code it will remain visible when you minimize and restore Excel:
' https://excelmacromastery.com/ Sub UseModelessCorrect() Dim frm As Object Set frm = VBA.UserForms.Add("UserFormCustomer") frm.Show vbModeless End Sub
An important thing to keep in mind here is that after the frm.Show line, the code will continue on. This is different to Modal where the code waits at this line for the UserForm to be closed or hidden.
When the Add button is clicked the action occurs immediately. We add the customer name to a new row in our worksheet. We can add as many names as we like. The UserForm will remain visible until we click on the Close button.
The following is the UserForm code for the customer example:
' USERFORM CODE ' https://excelmacromastery.com/ Private Sub buttonAdd_Click() InsertRow End Sub Private Sub buttonClose_Click() Unload Me End Sub Private Sub InsertRow() With Sheet1 ' Get the current row Dim curRow As Long If .Range("A1") = "" Then curRow = 1 Else curRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1 End If ' Add item .Cells(curRow, 1) = textboxFirstname.Value .Cells(curRow, 2) = textboxSurname.Value End With End Sub
Part 2 of this post
You can find the second part of this post here.
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.)