区分输入0和在application.inputbox

时间:2018-09-26 07:49:39

标签: excel vba excel-vba

我有一个宏,该宏从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

3 个答案:

答案 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