Chapter 12: Custom Dialog Box Alternatives

IN THIS CHAPTER

Using an input box to get user input

Using a message box to display messages or get a simple response

Selecting a file from a dialog box

Selecting a directory

Displaying Excel's built-in dialog boxes

Before You Create That UserForm . . .

Dialog boxes are, perhaps, the most important user interface element in Windows programs. Virtually every Windows program uses them, and most users have a good understanding of how they work. Excel developers implement custom dialog boxes by creating UserForms. However, VBA provides the means to display some built-in dialog boxes, with minimal programming required.

Before I get into the nitty-gritty of creating UserForms (beginning with Chapter 13), you might find it helpful to understand some of Excel's built-in tools that display dialog boxes. The sections that follow describe various dialog boxes that you can display without creating a UserForm.

Using an Input Box

An input box is a simple dialog box that allows the user to make a single entry. For example, you can use an input box to let the user enter text or a number or even select a range. You can generate an InputBox in two ways: by using a VBA function and by using a method of the Application object.

The VBA InputBox function

The syntax for VBA's InputBox function is

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile, context])

prompt: Required. The text displayed in the InputBox.

title: Optional. The caption of the InputBox window.

default: Optional. The default value to be displayed in the dialog box.

xpos, ypos: Optional. The screen coordinates of the upper-left corner of the window.

helpfile, context: Optional. The help file and help topic.

The InputBox function prompts the user for a single piece of information. The function always returns a string, so your code may need to convert the results to a value.

The prompt may consist of up to 1,024 characters. In addition, you can provide a title for the dialog box and a default value and specify its position on the screen. You can also specify a custom Help topic; if you do, the input box includes a Help button.

The following example, which generates the dialog box shown in Figure 12-1, uses the VBA InputBox function to ask the user for his full name. The code then extracts the first name and displays a greeting in a message box.

475355-fg1201.eps

FIGURE 12-1: VBA's InputBox function at work.

Sub GetName()

Dim UserName As String

Dim FirstSpace As Integer

Do Until UserName <> “”

UserName = InputBox(“Enter your full name: “, _

“Identify Yourself”)

Loop

FirstSpace = InStr(UserName, “ “)

If FirstSpace <> 0 Then

UserName = Left(UserName, FirstSpace - 1)

End If

MsgBox “Hello “ & UserName

End Sub

Notice that this InputBox function is written in a Do Until loop to ensure that something is entered when the input box appears. If the user clicks Cancel or doesn't enter any text, UserName contains an empty string, and the input box reappears. The procedure then attempts to extract the first name by searching for the first space character (by using the InStr function) and then using the Left function to extract all characters before the first space. If a space character isn't found, the entire name is used as entered.

As I mentioned, the InputBox function always returns a string. If the string returned by the InputBox function looks like a number, you can convert it to a value by using VBA's Val function. Or you can use Excel's InputBox method, which I describe in the next section.

Figure 12-2 shows another example of the VBA InputBox function. The user is asked to fill in the missing word. This example also illustrates the use of named arguments. The prompt text is retrieved from a worksheet cell and is assigned to a variable (p).

475355-fg1202.eps

FIGURE 12-2: Using VBA's InputBox function with a long prompt.

Sub GetWord()

Dim TheWord As String

Dim p As String

Dim t As String

p = Range(“A1”)

t = “What's the missing word?”

TheWord = InputBox(prompt:=p, Title:=t)

If UCase(TheWord) = “BATTLEFIELD” Then

MsgBox “Correct.”

Else

MsgBox “That is incorrect.”

End If

End Sub

on_the_cd.eps The two examples in this section are available on the companion CD-ROM. The file is named VBA inputbox.xlsm.

The Excel InputBox method

Using Excel's InputBox method offers three advantages over VBA's InputBox function:

You can specify the data type returned.

The user can specify a worksheet range by dragging in the worksheet.

Input validation is performed automatically.

The syntax for the Excel InputBox method is

InputBox(Prompt [,Title][,Default][,Left][,Top][,HelpFile, HelpContextID][,Type])

Prompt: Required. The text displayed in the input box.

Title: Optional. The caption in the input box window.

Default: Optional. The default value to be returned by the function if the user enters nothing.

Left, Top: Optional. The screen coordinates of the upper-left corner of the window.

HelpFile, HelpContextID: Optional. The Help file and Help topic.

Type: Optional. A code for the data type returned, as listed in Table 12-1.

Table 12-1: Codes to Determine the Data Type Returned by Excel's Inputbox Method

Code

Meaning

0

A formula

1

A number

2

A string (text)

4

A logical value (True or False)

8

A cell reference, as a range object

16

An error value, such as #N/A

64

An array of values

Excel's InputBox method is quite versatile. To allow more than one data type to be returned, use the sum of the pertinent codes. For example, to display an input box that can accept text or numbers, set type equal to 3 (that is, 1 + 2, or number plus text). If you use 8 for the type argument, the user can enter a cell or range address (or a named cell or range) manually or point to a range in the worksheet.

The EraseRange procedure, which follows, uses the InputBox method to allow the user to select a range to erase (see Figure 12-3). The user can either type the range address manually or use the mouse to select the range in the sheet.

475355-fg1203.eps

FIGURE 12-3: Using the InputBox method to specify a range.

The InputBox method with a type argument of 8 returns a Range object (note the Set keyword). This range is then erased (by using the Clear method). The default value displayed in the input box is the current selection's address. The On Error statement ends the procedure if the input box is canceled.

Sub EraseRange()

Dim UserRange As Range

On Error GoTo Canceled

Set UserRange = Application.InputBox _

(Prompt:=”Range to erase:”, _

Title:=”Range Erase”, _

Default:=Selection.Address, _

Type:=8)

UserRange.Clear

UserRange.Select

Canceled:

End Sub

on_the_cd.eps This example is available on the companion CD-ROM in a file named inputbox method.xlsm.

Yet another advantage of using Excel's InputBox method is that Excel performs input validation automatically. In the GetRange example, if you enter something other than a range address, Excel displays an informative message and lets the user try again (see Figure 12-4).

475355-fg1204.eps

FIGURE 12-4: Excel's InputBox method performs validation automatically.

The VBA MsgBox Function

VBA's MsgBox function is an easy way to display a message to the user or to get a simple response (such as OK or Cancel). I use the MsgBox function in many of the examples in this book as a way to display a variable's value.

The official syntax for MsgBox is as follows:

MsgBox(prompt[,buttons][,title][,helpfile, context])

prompt: Required. The text displayed in the message box.

buttons: Optional. A numeric expression that determines which buttons and icon are displayed in the message box. See Table 12-2.

title: Optional. The caption in the message box window.

helpfile, context: Optional. The helpfile and Help topic.

You can easily customize your message boxes because of the flexibility of the buttons argument. (Table 12-2 lists the many constants that you can use for this argument.) You can specify which buttons to display, whether an icon appears, and which button is the default.

Table 12-2: Constants Used for Buttons in the Msgbox Function

Constant

Value

Description

vbOKOnly

0

Display OK button only.

vbOKCancel

1

Display OK and Cancel buttons.

vbAbortRetryIgnore

2

Display Abort, Retry, and Ignore buttons.

vbYesNoCancel

3

Display Yes, No, and Cancel buttons.

vbYesNo

4

Display Yes and No buttons.

vbRetryCancel

5

Display Retry and Cancel buttons.

vbCritical

16

Display Critical Message icon.

vbQuestion

32

Display Warning Query icon.

vbExclamation

48

Display Warning Message icon.

vbInformation

64

Display Information Message icon.

vbDefaultButton1

0

First button is default.

vbDefaultButton2

256

Second button is default.

vbDefaultButton3

512

Third button is default.

vbDefaultButton4

768

Fourth button is default.

vbSystemModal

4096

All applications are suspended until the user responds to the message box (might not work under all conditions).

vbMsgBoxHelpButton

16384

Display a Help button. However, there is no way to display any help if the button is clicked.

You can use the MsgBox function by itself (to simply display a message) or assign its result to a variable. When you use the MsgBox function to return a result, the value represents the button clicked by the user. The following example displays a message and an OK button, but doesn't return a result:

Sub MsgBoxDemo()

MsgBox “Macro finished with no errors.”

End Sub

To get a response from a message box, you can assign the results of the MsgBox function to a variable. In the following code, I use some built-in constants (described in Table 12-3) to make it easier to work with the values returned by MsgBox:

Sub GetAnswer()

Dim Ans As Integer

Ans = MsgBox(“Continue?”, vbYesNo)

Select Case Ans

Case vbYes

‘ ...[code if Ans is Yes]...

Case vbNo

‘ ...[code if Ans is No]...

End Select

End Sub

Table 12-3: Constants Used for Msgbox Return Value

Constant

Value

Button Clicked

vbOK

1

OK

vbCancel

2

Cancel

vbAbort

3

Abort

vbRetry

4

Retry

vbIgnore

5

Ignore

vbYes

6

Yes

vbNo

7

No

The variable returned by the MsgBox function is an Integer data type. Actually, you don't even need to use a variable to utilize the result of a message box. The following procedure is another way of coding the GetAnswer procedure:

Sub GetAnswer2()

If MsgBox(“Continue?”, vbYesNo) = vbYes Then

‘ ...[code if Ans is Yes]...

Else

‘ ...[code if Ans is No]...

End If

End Sub

The following function example uses a combination of constants to display a message box with a Yes button, a No button, and a question mark icon; the second button is designated as the default button (see Figure 12-5). For simplicity, I assigned these constants to the Config variable.

475355-fg1205.eps

FIGURE 12-5: The buttons argument of the MsgBox function determines which buttons appear.

Private Function ContinueProcedure() As Boolean

Dim Config As Integer

Dim Ans As Integer

Config = vbYesNo + vbQuestion + vbDefaultButton2

Ans = MsgBox(“An error occurred. Continue?”, Config)

If Ans = vbYes Then ContinueProcedure = True _

Else ContinueProcedure = False

End Function

You can call the ContinueProcedure function from another procedure. For example, the following statement calls the ContinueProcedure function (which displays the message box). If the function returns False (that is, the user selects No), the procedure ends. Otherwise, the next statement would be executed.

If Not ContinueProcedure() Then Exit Sub

The width of the message box depends on your video resolution. If you'd like to force a line break in the message, use the vbCrLf (or vbNewLine) constant in the text. The following example displays the message in three lines. Figure 12-6 shows how it looks.

475355-fg1206.eps

FIGURE 12-6: Splitting a message into multiple lines.

Sub MultiLine()

Dim Msg As String

Msg = “This is the first line.” & vbCrLf & vbCrLf

Msg = Msg & “This is the second line.” & vbCrLf

Msg = Msg & “And this is the last line.”

MsgBox Msg

End Sub

You can also insert a tab character by using the vbTab constant. The following procedure uses a message box to display the values in a 13 x 3 range of cells in A1:C13 (see Figure 12-7). It separates the columns by using a vbTab constant and inserts a new line by using the vbCrLf constant. The MsgBox function accepts a maximum string length of 1,023 characters, which will limit the number of cells that you can display. Also, note that the tab stops are fixed, so if a cell contains more than 11 characters, the columns won't be aligned.

475355-fg1207.tif

FIGURE 12-7: This message box displays text with tabs and line breaks.

Sub ShowRange()

Dim Msg As String

Dim r As Integer, c As Integer

Msg = “”

For r = 1 To 12

For c = 1 To 3

Msg = Msg & Cells(r, c).Text

If c <> 3 Then Msg = Msg & vbTab

Next c

Msg = Msg & vbCrLf

Next r

MsgBox Msg

End Sub

cross_ref.eps Chapter 15 includes a UserForm example that emulates the MsgBox function.

The Excel GetOpenFilename Method

If your application needs to ask the user for a filename, you can use the InputBox function. But this approach is tedious and error-prone because the user must type the filename (with no browsing ability). A better approach is to use the GetOpenFilename method of the Application object, which ensures that your application gets a valid filename (as well as its complete path).

This method displays the normal Open dialog box, but it does not actually open the file specified. Rather, the method returns a string that contains the path and filename selected by the user. Then you can write code to do whatever you want with the filename.

The syntax for the GetOpenFilename method is as follows (all arguments are optional):

ApplicationGetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

FileFilter: Optional. A string specifying file-filtering criteria.

FilterIndex: Optional. The index number of the default file-filtering criteria.

Title: Optional. The title of the dialog box. If omitted, the title is Open.

ButtonText: For Macintosh only.

MultiSelect: Optional. If True, you can select multiple filenames. The default value is False.

The FileFilter argument determines what file types appear in the dialog box's Files of Type drop-down list. The argument consists of pairs of file filter strings followed by the wildcard file filter specification, with each part and each pair separated by commas. If omitted, this argument defaults to the following:

“All Files (*.*),*.*”

Notice that the first part of this string (All Files (*.*)) is the text displayed in the Files of Type drop-down list. The second part (*.*) actually determines which files are displayed.

The following instruction assigns a string to a variable named Filt. You can then use this string as a FileFilter argument for the GetOpenFilename method. In this case, the dialog box will allow the user to select from four different file types (plus an All Files option). Notice that I used VBA's line continuation sequence to set up the Filt variable; doing so makes it much easier to work with this rather complicated argument.

Filt = “Text Files (*.txt),*.txt,” & _

“Lotus Files (*.prn),*.prn,” & _

“Comma Separated Files (*.csv),*.csv,” & _

“ASCII Files (*.asc),*.asc,” & _

“All Files (*.*),*.*”

The FilterIndex argument specifies which FileFilter is the default, and the Title argument is text that is displayed in the title bar. If the MultiSelect argument is True, the user can select multiple files, all of which are returned in an array.

The following example prompts the user for a filename. It defines five file filters.

Sub GetImportFileName()

Dim Filt As String

Dim FilterIndex As Integer

Dim Title As String

Dim FileName As Variant

‘ Set up list of file filters

Filt = “Text Files (*.txt),*.txt,” & _

“Lotus Files (*.prn),*.prn,” & _

“Comma Separated Files (*.csv),*.csv,” & _

“ASCII Files (*.asc),*.asc,” & _

“All Files (*.*),*.*”

‘ Display *.* by default

FilterIndex = 5

‘ Set the dialog box caption

Title = “Select a File to Import”

‘ Get the file name

FileName = Application.GetOpenFilename _

(FileFilter:=Filt, _

FilterIndex:=FilterIndex, _

Title:=Title)

‘ Exit if dialog box canceled

If FileName = False Then

MsgBox “No file was selected.”

Exit Sub

End If

‘ Display full path and name of the file

MsgBox “You selected “ & FileName

End Sub

Figure 12-8 shows the dialog box that appears when this procedure is executed and the user selects the Comma Separated Files filter.

475355-fg1208.eps

FIGURE 12-8: The GetOpenFilename method displays a dialog box used to specify a file.

The following example is similar to the previous example. The difference is that the user can press Ctrl or Shift and select multiple files when the dialog box is displayed. Notice that I check for the Cancel button click by determining whether FileName is an array. If the user doesn't click Cancel, the result is an array that consists of at least one element. In this example, a list of the selected files is displayed in a message box.

Sub GetImportFileName2()

Dim Filt As String

Dim FilterIndex As Integer

Dim FileName As Variant

Dim Title As String

Dim i As Integer

Dim Msg As String

‘ Set up list of file filters

Filt = “Text Files (*.txt),*.txt,” & _

“Lotus Files (*.prn),*.prn,” & _

“Comma Separated Files (*.csv),*.csv,” & _

“ASCII Files (*.asc),*.asc,” & _

“All Files (*.*),*.*”

‘ Display *.* by default

FilterIndex = 5

‘ Set the dialog box caption

Title = “Select a File to Import”

‘ Get the file name

FileName = Application.GetOpenFilename _

(FileFilter:=Filt, _

FilterIndex:=FilterIndex, _

Title:=Title, _

MultiSelect:=True)

‘ Exit if dialog box canceled

If Not IsArray(FileName) Then

MsgBox “No file was selected.”

Exit Sub

End If

‘ Display full path and name of the files

For i = LBound(FileName) To UBound(FileName)

Msg = Msg & FileName(i) & vbCrLf

Next i

MsgBox “You selected:” & vbCrLf & Msg

End Sub

The FileName variable is defined as a variant (not a string, as in the previous examples). I use variant because FileName can potentially hold an array rather than a single filename.

on_the_cd.eps The two examples in this section are available on the companion CD-ROM. The filename is prompt for file.xlsm.

The Excel GetSaveAsFilename Method

The GetSaveAsFilename method is very similar to the GetOpenFilename method. It displays a Save As dialog box and lets the user select (or specify) a file. It returns a filename and path but doesn't take any action. Like the GetOpenFilename method, all of the GetSaveAsFilename method's arguments are optional.

The syntax for this method is

Application.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)

The arguments are

InitialFilename: Optional. Specifies the suggested filename.

FileFilter: Optional. A string specifying file-filtering criteria.

FilterIndex: Optional. The index number of the default file-filtering criteria.

Title: Optional. The title of the dialog box.

ButtonText: For Macintosh only.

Prompting for a Directory

If you need to get a filename, the simplest solution is to use the GetOpenFileName method, as I describe earlier. But if you need to get a directory name only (no file), you can use Excel's FileDialog object.

The following procedure displays a dialog box (see Figure 12-9) that allows the user to select a directory. The selected directory name (or Canceled) is then displayed by using the MsgBox function.

475355-fg1209.eps

FIGURE 12-9: Using the FileDialog object to select a directory.

Sub GetAFolder ()

With Application.FileDialog(msoFileDialogFolderPicker)

.InitialFileName = Application.DefaultFilePath & “”

.Title = “Select a location for the backup”

.Show

If .SelectedItems.Count = 0 Then

MsgBox “Canceled”

Else

MsgBox .SelectedItems(1)

End If

End With

End Sub

The FileDialog object lets you specify the starting directory by specifying a value for the InitialFileName property. In this example, the code uses Excel's default file path as the starting directory.

Displaying Excel's Built-In Dialog Boxes

Code that you write in VBA can execute many of Excel's Ribbon commands. And, if the command normally leads to a dialog box, your code can “make choices” in the dialog box (although the dialog box itself isn't displayed). For example, the following VBA statement is equivalent to choosing the HomeEditingFind & SelectGo To command, specifying range A1:C3, and clicking OK. But the Go To dialog box never appears (which is what you want).

Application.Goto Reference:=Range(“A1:C3”)

In some cases, however, you may want to display one of Excel's built-in dialog boxes so that the end user can make the choices. You can do so by writing code that executes a Ribbon command.

note.eps Using the Dialogs collection of the Application object is another way to display an Excel dialog box. However, Microsoft has not kept this feature up-to-date, so I don't even discuss it. The method I describe in this section is a much better solution.

In previous versions of Excel, programmers created custom menus and toolbars by using the CommandBar object. In Excel 2007 and Excel 2010, the CommandBar object is still available, but it doesn't work like it has in the past.

cross_ref.eps Refer to Chapter 22 for more information about the CommandBar object.

The CommandBar object has also been enhanced, beginning with Excel 2007. You can use the CommandBar object to execute Ribbon commands using VBA. Many of the Ribbon commands display a dialog box. For example, the following statement displays the Unhide dialog box (see Figure 12-10):

Application.CommandBars.ExecuteMso(“SheetUnhide”)

475355-fg1210.tif

FIGURE 12-10: This dialog box was displayed with a VBA statement.

The ExecuteMso method accepts one argument, an idMso parameter that represents a Ribbon control. Unfortunately, these parameters aren't listed in the Help system.

on_the_cd.eps The companion CD-ROM contains a file, ribbon control names.xlsx, that lists all the Excel Ribbon command parameter names. You'll need to experiment with the items listed in this workbook. Many of them execute the command immediately (no dialog box). And most will generate an error if they're issued in an incorrect context. For example, Excel displays an error if your code executes the FunctionWizard command when a chart is selected.

Following is another example. This statement, when executed, displays the Font tab of the Format Cells dialog box (see Figure 12-11):

Application.CommandBars.ExecuteMso(“FormatCellsFontDialog”)

475355-fg1211.eps

FIGURE 12-11: Using the ExecuteMso method to display a dialog box.

Displaying a Data Form

Many people use Excel to manage lists in which the information is arranged in rows. Excel offers a simple way to work with this type of data through the use of a built-in data entry form that Excel can create automatically. This data form works with either a normal range of data or a range that has been designated as a table (by using the InsertTablesTable command). Figure 12-12 shows an example of a data form in use.

Making the data form accessible

For some reason, the command to access the data form isn't in the Excel Ribbon. To access the data form from Excel's user interface, you must add it to your Quick Access toolbar or to the Ribbon. Following are instructions to add this command to the Quick Access toolbar:

1. Right-click the Quick Access toolbar and select Customize Quick Access Toolbar.

The Quick Access Toolbar panel of the Excel Options dialog box appears.

2. In the Choose Commands From drop-down list, select Commands Not in the Ribbon.

3. In the list box on the left, select Form.

4. Click the Add button to add the selected command to your Quick Access toolbar.

5. Click OK to close the Excel Options dialog box.

After performing these steps, a new icon will appear on your Quick Access toolbar.

475355-fg1212.tif

FIGURE 12-12: Some users prefer to use Excel's built-in data form for data-entry tasks.

To use a data entry form, you must arrange your data so that Excel can recognize it as a table. Start by entering headings for the columns in the first row of your data entry range. Select any cell in the table and click the Form button on your Quick Access toolbar. Excel then displays a dialog box customized to your data. You can use the Tab key to move between the text boxes and supply information. If a cell contains a formula, the formula result appears as text (not as an edit box). In other words, you can't modify formulas from the data entry form.

When you complete the data form, click the New button. Excel enters the data into a row in the worksheet and clears the dialog box for the next row of data.

Displaying a data form by using VBA

Use the ShowDataForm method to display Excel's data form. The only requirement is that the active cell must be within a range. The following code activates cell A1 (which is in a table) and then displays the data form:

Sub DisplayDataForm()

Range(“A1”).Select

ActiveSheet.ShowDataForm

End Sub

on_the_cd.eps A workbook with this example is available on the companion CD-ROM. The file is named data form example.xlsm.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset