我目前正在使用MS Access VBA中的InputBoxes。我正在检查验证和处理用户如何通过按OK或取消按钮与InputBox交互。
纠正我,如果我错了,但InputBoxes可以返回任何数据类型,默认情况下返回一个字符串?例如:
Dim userInputValue As String
'Text to display, Title, Default Value
userInputValue = InputBox("Please enter a #", "Determine Limit", 10000)
If userInputValue = "" Then
MsgBox ("You pressed the cancel button...")
End If
如果用户按下取消按钮,则运行正常。
但当我交换这个整数值时,如下所示:
Dim userInputValue As Integer
'Text to display, Title, Default Value
userInputValue = InputBox("Please enter a #", "Determine Limit", 10000)
If userInputValue = 0 Then
MsgBox ("You pressed the cancel button...")
End If
我收到了Type Mismatch: Runtime Error '13'
为什么会这样?当我调试代码并查看返回的内容时,我发现userInputValue
实际上是0,这正是我正在检查的内容。那么InputBox实际上返回一个字符串的问题是什么?
如有疑问,请检查内置的VBA帮助;)
InputBox()
返回一个字符串
您可以尝试使用Integers
Sub Sample()
Dim Ret As String, userInputValue As Integer
'Text to display, Title, Default Value
Ret = InputBox("Please enter a #", "Determine Limit", 10000)
If Ret = "" Then
MsgBox ("You pressed the cancel button... or you pressed OK without entering anything")
Else
If IsNumeric(Ret) Then
userInputValue = Val(Ret)
Else
MsgBox ("Incorrect Value")
End If
End If
End Sub
这是一种捕捉与对话交互的大多数结果的方法;
Dim value As String
value = InputBox("Please enter a #", "Determine Limit", 10000)
If (StrPtr(value) = 0) Then
MsgBox "You pressed cancel or [X]"
ElseIf (value = "") Then
MsgBox "You did not enter anything"
ElseIf (Val(value) = 0 And value <> "0") Then
MsgBox "Invalid number"
Else
MsgBox "You entered " & value
End If
无论用户输入的数字是多少,InputBox
都会返回一个字符串。如果他们单击“取消”,则返回空字符串。
在立即窗口中尝试此操作。
? TypeName(InputBox("Please enter a #", "Determine Limit", 10000))
String
对于代码中的测试,检查userInputValue
的数值等价是否等于零。
If Val(userInputValue) = 0 Then
MsgBox ("You pressed the cancel button...")
End If
注意,比InputBox
不允许您区分用户是单击取消还是删除起始值(10000)并单击确定。无论哪种方式,InputBox
返回一个空字符串(“”)。并且Val("")
也返回零。如果这将是一个问题,请替换自定义表单来收集用户输入...这不像InputBox
那样受限制。
注意:以下内容仅适用于Excel。 Application.InputBox函数在Access中不可用:
如果用户单击“取消”,Application.InputBox将返回“False”。
Dim userInputString As String
Dim userInputValue As Integer
'Text to display, Title, Default Value
userInputString = Application.InputBox("Please enter a #", "Determine Limit", 10000)
If userInputString = "False" Then
MsgBox ("You pressed the cancel button...")
Else
userInputValue = CInt(Trim(userInputString))
End If
而不是从InputString返回一个数字,而是将默认字符串设置为“___________”。然后我可以测试是否输入了任何内容,取消“键将返回一个空字符串。
我还添加了一个测试值“Allow_Empty_String”(True / False),因为有时我想要一个空字符串。
“Flag_Msg_Err”必须重置为False,因为“Msg_Err”将其设置为true以捕获来自循环的调用。
例程需要以3种方式之一响应:1。如果按下“取消”按钮,程序结束。 2.如果按下“确定”按钮,则IF ALLOW_EMPTY_STRING然后给出消息并再次开始输入ELSE返回空字符串END IF 3.输入该字符串。然后返回TRIM(STRING)。
`Function Input_String(Prog,Message,Optional Allow_Empty_String = False)'返回一个字符串或单词“Cancal'”。 '2/28/19创建。 WML
If Trace Then Prog = Prog & "(*)"
Call Name_Put("Flag_Msg_Err", False)
Do
Test_String = "_____________"
Input_String = InputBox(Prompt:=Message, _
Default:=Test_String, Title:=Prog)
Select Case Input_String
Case "TRACE"
' for Debugging
Old_Trace = Named("Flag_Trace")
New_Trace = Not Old_Trace
Call Name_Put("Flag_Trace", New_Trace)
Msg = "TRACE is now set to " & New_Trace & "."
Call Name_Put("Flag_Msg_Err", False)
Case Test_String
If Allow_Empty_String Then
Msg = "You must enter something,|" & _
" or select CANCEL."
Call Msg_Err(Prog, Msg, , True)
Call Name_Put("Flag_Msg_Err", False)
Else
Input_String = ""
Finished = True
End If
Case ""
If Trace Then
Stop: Exit Function
Else
End
End
Case Else
' If entered a space or clicked "Ok".
Input_String = Trim(Input_String)
Finished = True
End Select
Loop
结束函数'Input_String`