- Declaring Variables
- Avoiding Variable Errors
- Variable Data Types
- Using Array Variables
- Working with Constants
- Storing User Input in a Variable
Storing User Input in a Variable
Your VBA programs will usually be self-contained and run just fine on their own. However, you'll likely come across situations where you'll require some kind of custom input. For example, you might have a procedure that adjusts various aspects of a Word document. You could insert the name and location of a Word document into the procedure (this is called hard-coding the data), but that's not very flexible if your procedure is capable of working with different documents. A better idea is to have your procedure prompt for the name and location of a document. Your procedure could then take that data and use it to work on the specified document.
Whatever type of input you ask for, the result needs to be stored in a variable so that the rest of your procedure can access it. The next couple of sections take you through some VBA techniques that enable you to prompt for data and then store that data in a variable.
Getting Input Using MsgBox
You've seen a couple of times already in this book that you can display information by using the MsgBox function. This is a very useful function, so let's take a closer look at it. Here is the full syntax of this function:
MsgBox(Prompt[, Buttons][, Title][, HelpFile][, Context])
Prompt |
The message you want to display in the dialog box. (You can enter a string up to 1,024 characters long.) |
Buttons |
A number or constant that specifies, among other things, the command buttons that appear in the dialog box. (See the next section.) The default value is 0. |
Title |
The text that appears in the dialog box title bar. If you omit the title, VBA uses the name of the current program (for example, Microsoft Excel). |
HelpFile |
The text that specifies the Help file that contains the custom help topic. (I don't discuss custom help topics in this book.) If you enter HelpFile, you also have to include Context. If you include HelpFile, a Help button appears in the dialog box. |
Context |
A number that identifies the help topic in HelpFile. |
For example, the following statement displays the message dialog box shown in Figure 3.2:
MsgBox "You must enter a number between 1 and 100!",,"Warning"
Figure 3.2 A simple message dialog box produced by the MsgBox function.
Setting the Style of the Message
The default message dialog box displays only an OK button. You can include other buttons and icons in the dialog box by using different values for the Buttons parameter. Table 3.2 lists the available options.
Table 3.2. The MsgBox Buttons Parameter Options
Constant |
Value |
Description |
Buttons |
||
vbOKOnly |
0 |
Displays only an OK button. (This is the default.) |
vbOKCancel |
1 |
Displays the OK and Cancel buttons. |
vbAbortRetryIgnore |
2 |
Displays the Abort, Retry, and Ignore buttons. |
vbYesNoCancel |
3 |
Displays the Yes, No, and Cancel buttons. |
vbYesNo |
4 |
Displays the Yes and No buttons. |
vbRetryCancel |
5 |
Displays the Retry and Cancel buttons. |
Icons |
||
vbCritical |
16 |
Displays the Critical Message icon. |
vbQuestion |
32 |
Displays the Warning Query icon. |
vbExclamation |
48 |
Displays the Warning Message icon. |
vbInformation |
64 |
Displays the Information Message icon. |
Default Button |
||
vbDefaultButton1 |
0 |
The first button is the default (that is, the button selected when the user presses Enter). |
vbDefaultButton2 |
256 |
The second button is the default. |
vbDefaultButton3 |
512 |
The third button is the default. |
Modality |
||
vbApplicationModal |
0 |
The user must respond to the message box before continuing work in the current application. |
vbSystemModal |
4096 |
All applications are suspended until the user responds to the message box. |
You derive the Buttons argument in one of two ways:
- By adding up the values for each option. For example, if you want the OK and Cancel buttons (value 1) and the Warning Message icon (value 48), then you specify the value 49.
- By using the VBA constants separated by plus signs (+). This is the better way to go because it makes your code much easier to read.
For example, Listing 3.3 shows a procedure named ButtonTest, and Figure 3.3 shows the resulting dialog box. Here, three variables—msgPrompt, msgButtons, and msgTitle—store the values for the MsgBox function's Prompt, Buttons, and Title arguments, respectively. In particular, the following statement derives the Buttons argument:
msgButtons = vbYesNo + vbQuestion + vbDefaultButton2
Figure 3.3 The dialog box that's displayed when you run the code in Listing 3.3.
You also could derive the Buttons argument by adding up the values that these constants represent (4, 32, and 256, respectively), but the procedure becomes less readable that way.
Listing 3.3. A Procedure That Creates a Message Dialog Box
Sub ButtonTest() Dim msgPrompt As String, msgTitle As String Dim msgButtons As Integer, msgResult As Integer msgPrompt = "Are you sure you want to display " & vbCrLf & _ "the worksheet names?" msgButtons = vbYesNo + vbQuestion + vbDefaultButton2 msgTitle = "Display Worksheet Names" msgResult = MsgBox(msgPrompt, msgButtons, msgTitle) End Sub
Getting Return Values from the Message Dialog Box
A message dialog box that displays only an OK button is straightforward. The user either clicks OK or presses Enter to remove the dialog from the screen. The multibutton styles are a little different, however; the user has a choice of buttons to select, and your procedure should have a way to find out which button the user chose.
You do this by storing the MsgBox function's return value in a variable. Table 3.3 lists the seven possible return values.
Table 3.3. The MsgBox Function's Return Values
Constant |
Value |
Button Selected |
vbOK |
1 |
OK |
vbCancel |
2 |
Cancel |
vbAbort |
3 |
Abort |
vbRetry |
4 |
Retry |
vbIgnore |
5 |
Ignore |
vbYes |
6 |
Yes |
vbNo |
7 |
No |
To process the return value, you test the value in the variable and have your procedure take appropriate action. You learn how to do this in Chapter 6. Listing 3.4 shows a revised version of ButtonTest that uses an If statement to see whether the msgResult value equals vbYes. If so, it means the user clicked Yes in the dialog box, so the procedure runs the StoreWorksheetNames procedure (see Listing 3.4); otherwise, it does nothing.
→ |
To learn about the If statement, see "Using If...Then to Make True/False Decisions," p. 92. |
→ |
For MsgBox functions that use three buttons, you need to use the Select Case statement to process the result; see "Using the Select Case Statement," p. 97. |
Listing 3.4. A Procedure that Handles the Return Value of the MsgBox Function
Sub ButtonTest2() Dim msgPrompt As String, msgTitle As String Dim msgButtons As Integer, msgResult As Integer msgPrompt = "Are you sure you want to display " & vbCrLf & _ "the worksheet names?" msgButtons = vbYesNo + vbQuestion + vbDefaultButton2 msgTitle = "Display Worksheet Names" msgResult = MsgBox(msgPrompt, msgButtons, msgTitle) If msgResult = vbYes Then StoreWorksheetNames End If End Sub
Getting Input Using InputBox
As you've seen, the MsgBox function lets your procedures interact with the user and get some feedback. Unfortunately, this method limits you to simple command-button responses. For more varied user input, you need to use a more sophisticated technique. The rest of this chapter shows you just such a method: prompting the user for input using the InputBox function.
The InputBox function displays a dialog box with a message that prompts the user to enter data, and it provides a text box for the data itself. Here's the syntax for this function:
InputBox(Prompt[, Title][, Default][, Xpos][, Ypos][, HelpFile][, Context])
Prompt |
The message you want to display in the dialog box (1,024-character maximum). |
Title |
The text that appears in the dialog box title bar. The default value is the null string (nothing). |
Default |
The default value displayed in the text box. If you omit Default, the text box is displayed empty. |
Xpos |
The horizontal position of the dialog box from the left edge of the screen. The value is measured in points (there are 72 points in an inch). If you omit Xpos, the dialog box is centered horizontally. |
Ypos |
The vertical position, in points, from the top of the screen. If you omit Ypos, the dialog is centered vertically in the current window. |
HelpFile |
The text specifying the Help file that contains the custom help topic. (Again, I don't cover Help files in this book.) If you enter HelpFile, you also have to include Context. If you include HelpFile, a Help button appears in the dialog box. |
Context |
A number that identifies the help topic in HelpFile. |
For example, Listing 3.5 shows a procedure called InputBoxText that uses the InputBox method to prompt the user for data. Figure 3.4 shows the dialog box that appears. The result is stored in the inputData variable. If the user didn't enter data, the function returns nothing, which is represented in VBA by the string value "" (this is called the null string). The procedure uses the If statement to check whether the value stored in inputData is "" and, if it's not, it runs MsgBox to display the entered data.
Figure 3.4 A dialog box generated by the InputBox function in Listing 3.5.
Listing 3.5. A Procedure That Prompts the User for Input and Then Displays the Data
Sub InputBoxTest() Dim inputData As String ' ' Get the data ' inputData = InputBox("Enter some text:", "Input Box Text") ' ' Check to see if any data was entered ' If inputData <> "" Then ' ' If so, display it ' MsgBox inputData End If End Sub
From Here
- You often use operators and expressions to assign values to variables. I discuss this in detail in Chapter 4, "Building VBA Expressions."
- Objects have a separate variable type. I talk about it, as well as about assigning objects to variables, in Chapter 5, "Working with Objects."
- To learn about the If statement for processing MsgBox and InputBox results, see "Using If...Then to Make True/False Decisions," p. 92.
- For MsgBox functions that use three buttons, you need to use the Select Case statement to process the result; see "Using the Select Case Statement," p. 97.