InputBox函数显示一个信息提示用户输入数据,这个对话框有两个按钮——“确定”和“取消”,当你点击确定时,InputBox函数返回用户输入在信息框里的信息;当你点击取消时,函数则返回空字符串(” ”)。InputBox函数的语法显示如下:
InputBox(prompt [, title] [, default] [, xpos] [, ypos] _ [, helpfile, context])
第一个参数,prompt,是你想要显示在对话框上的信息,你可以使用函数Chr(13)或Chr(10)将长文本打断为几行(参见本章中使用MsgBox函数的例子)。剩下所有的参数都是可选的。
第二个参数,title,让你改变对话框的默认标题,默认的标题是Mictosoft Excel。InputBox函数的第三个参数,default,让你在文本框里显示一个默认值,如果你忽略这个参数的话,显示的将是空白编辑框。
接下来的两个参数,xpos和ypos,允许你设置该对话框在屏幕上出现的位置,如果你忽略这两个参数,对话框就会出现了当前窗口的中央,xpos参数决定对话框在屏幕上从左起的水平位置,忽略它时,对话框显示在水平中央,而ypos参数决定对话框在屏幕从上而下的竖直位置,忽略它,对话框就在竖直大约三分之一的位置。xpos和ypos都使用一个叫twips的专门单位衡量,1twip大约等于0.0007英寸。最后两个参数,helpfile和context,和在本章前期讨论的MsgBox函数相应的参数使用方法一样。
现在你知道了InputBox参数的意义了,我们来看看这个函数的使用示例:
1. 在MyFunctions (Chap04.xls)工程里添加一个新模块,重命名为Sample8
2. 激活Sample8模块,并且输入下列子程序:
Sub Informant()
InputBox prompt:="Enter your place of birth:" & Chr(13) _
& " (e.g., Boston, Great Falls, etc.) "
End Sub
上面的过程显示一个带两个按钮的对话框,输入提示显示在两行里。象MsgBox函数一样,如果你想要使用用户输入的数据,那么你应该使用一个变量来储存该对话框结果。下面显示的子程序Informant2将InputBox函数的结果赋值给变量town:
图4-10 Informant子程序产生的对话框
Sub Informant2()
Dim myPrompt As String
Dim town As String
Const myTitle = "Enter data"
myPrompt = "Enter your place of birth:" & Chr(13) _
& "(e.g., Boston, Great Falls, etc.)"
town = InputBox(myPrompt, myTitle)
MsgBox "You were born in " & town & ".", , "Your response"
End Sub
注意,这次,InputBox函数的参数列在了括号中间。如果你需要在稍后的程序中需要使用InputBox函数的结果,那么括号是必须的。Informant2子程序使用常数来确定显示在对话框标题上的文本。因为,这个值在过程执行过程中从始至终都是保持不变的,所以,可以将对话框的标题声明为一个常量,然而,如果你愿意,你也可以使用一变量。
当你运行使用了InputBox的过程时,使用该函数的对话框总是出现在屏幕的同一位置,你可以按前面解释的那样,提供xpos和ypos参数来改变对话框的位置。
3. 修改过程Informant2中的InputBox函数,让对话框显示在屏幕的左上角,例如:
town = InputBox(myPrompt, myTitle, , 1, 200)
注意,参数myTitle后面紧跟两个逗号,第二个逗号是忽略掉的默认值参数。下面两个参数决定对话框的水平和竖直位置。如果你忽略了参数myTitle后面的第二个逗号,VB将会使用数字1作为默认值。如果你使用了参数名称的话,(例如,prompt:=myPrompt, title:=myTitle, xpos:=1,ypos:=200),你就不必记住在每个忽略了参数的地方加逗号了。
如果你输入了一个数字,而不是一个城镇的名称,后果会怎样?因为,用户经常会在对话框里输入错误的数据,所以,你的程序必须验证用户输入的数据是否可以在将来的数据操作里使用。InputBox函数本身并没有提供验证数据的工具,要验证用户的输入,你必须使用其它的VBA指令,这将在接下来的章节里讲述。
InputBox函数的结果总是字符串,如果用户输入的是个数字,用户输入的字符串值必须转换成为数字值之后,才能用于你程序里的数学计算。VB转换数据类型轻而易举,不过,在早期的Excel版本里,这是不可能的。
1. 激活模块Sample8,并输入以下过程AddTwoNums:
Sub AddTwoNums()
Dim myPrompt As String
Dim value1 As String
Const myTitle = "Enter data"
Dim mySum As Single
myPrompt = "Enter a number:"
value1 = InputBox(myPrompt, myTitle, 0)
mySum = value1 + 2
MsgBox mySum & " (" & value1 & " + 2)"
End Sub
图4-11 要给用户提示数据的确切类型,你可以在编辑框里提供一个默认值
上面的程序显示如图4-11所示的对话框。注意,这个对话框使用了两个专门的功能,InputBox函数的可选参数标题和默认值。该对话框显示了有常量myTitle确定的文本字符串作为标题,而不是默认的“Microsoft Excel”。在编辑框里面的0提示用户输入数字,而不能输入文本。一旦用户输入了数据并点击确定时,用户的输入就被赋值给了变量value1
value1 = InputBox(myPrompt, myTitle, 0)
变量value1的数据类型是字符串,你可以在上面指令的下面加上如下语句,快速地查看它的数据类型:
MsgBox varType(value1)
当VB运行上面的代码时,将显示信息-数字8,你可以在本章的图4-4里查看该数字代表字符串类型。
技巧:定义常量
你可以将标题文本赋值到一个常量上,以确保某个VBA程序里所有的标题栏都显示相同的 文本。依照这个技巧,你可以在多次输入某标题文本时节省时间。
技巧:避免类型不匹配错误
如果你试图在Excel的早期版本里(2000以前版本)运行AddTwoNums过程,当VB试图执行下列代码行时,你将得到类型不匹配的错误:
mysum = value1 + 2
使用内置函数CSng将储存于value1的字符串转换为一个单精度浮点类型的数字,可以避免类型不匹配错误,代码写成:
mysum = CSng(value1) + 2
下一行,mySum = value1 + 2,在用户输入的数据上加上2,并且将计算结果赋值给变量mySum。因为变量value1的数据类型时字符串,在使用它计算之前,VB在后台进行数据类型的转换,VB知道转换的需要。没有它,两种不兼容的数据类型(文本和数字)将会产生类型不匹配错误。程序最后是一个MsgBox函数,显示计算的结果已经给用户显示总数是如何组成的。