我有一个宏,该宏从Application.InputBox
中获取一个值,然后尝试确保已将一个数值放入其中,并且没有按下取消键。
Sub test()
Dim testvalue As Variant
testvalue = Application.InputBox(Prompt:="Whatever", Title:="Whatever", Default:=10, Type:=1)
If testvalue <> False Then
MsgBox ("Test != False")
Else
MsgBox ("Test = False")
End If
If VarType(testvalue) = vbInteger Or VarType(testvalue) = vbLong Then
MsgBox ("Numerical value")
Else
MsgBox ("Nonnumerical value")
End If
End Sub
但是,在将0放入InputBox和取消按下之间似乎很难区分。在这两种情况下,if语句都将返回那个Test = False
和那个Test is a nonnumerical value
。公平地说,第二个if语句对其他整数也是如此,但是我认为使用VarType
方法区分存储在变量中的整数和存储在其中的布尔值的可能性很小。
有什么办法可以区分0和取消输入框的返回值,还是我必须制作自己的自定义表单?
无论注释中输入了什么值或按下了什么按钮,尝试按照注释中的建议使用VBA的InputBox
都会返回“字符串”:
Sub test2()
Dim testvalue As Variant
testvalue = InputBox("Test")
Select Case VarType(testvalue)
Case vbBoolean:
Debug.Print "Boolean"
Case vbInteger:
Debug.Print "Integer"
Case vbLong:
Debug.Print "Long"
Case vbString:
Debug.Print "String"
Case vbVariant:
Debug.Print "Variant"
End Select
End Sub
答案 0 :(得分:0)
您可以使用VarType
来代替StrPtr
,它仅在输入框被取消的情况下才会给出0,尽管我不确定它对Application.InputBox()
的反应如何。如果您仅使用标准的InputBox()
,但效果很好,因此要检测到已取消的InputBox
,可以将其添加到代码中:
If StrPtr(testvalue) = 0 Then
Call MsgBox("Input cancelled.", "Cancelled")
End If
*使用此方法时要注意的一点是,它依赖于InputBox
中的错误行为。微软不会修复它,因为它会破坏很多人的代码,但这是需要注意的事情。
答案 1 :(得分:0)
显然double
也是一种数字类型> _>愚弄我这个错误,检查错误的内容并做出错误的假设。感谢rory的注释,使我能够进一步检查各种函数返回的类型。
更明确地说,当在Application.InputBox
中输入数值时,它将返回Double
,因此这是我要确保数值时应检查的内容。
答案 2 :(得分:0)
您可以将类型调整为1 + 4,然后检查Vartype
Sub test()
Dim testvalue As Variant
testvalue = Application.InputBox(Prompt:="Whatever", Title:="Whatever", Default:=10, Type:=5)
If VarType(testvalue) <> vbBoolean Then
MsgBox ("Test != False")
Else
MsgBox ("Test = False")
End If
End Sub