【问题标题】:Differentiate between entering 0 and pressing cancel in application.inputbox区分在 application.inputbox 中输入 0 和按取消
【发布时间】:2018-09-26 16:42:18
【问题描述】:

我有一个宏,它从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 = FalseTest is a nonnumerical value。公平地说,第二个 if 语句对其他整数也是如此,但我认为使用 VarType 方法区分存储在变体中的整数和存储在其中的布尔值的可能性很小。

有什么方法可以区分 0 和 cancel 作为输入框的返回值,还是我必须制作自己的自定义表单?

尝试按照 cmets 中的建议使用 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

【问题讨论】:

  • 你真的需要使用Application.Inputbox而不是VBA的Inputbox吗?
  • @Rory 我喜欢能够在 application.inputbox 中强制使用 valuetype。从常规输入框中捕获取消值是否更简单?
  • 不是真的,只是方法不同。您可以使用If VarType(testvalue) = vbBoolean Then 来捕捉取消。

标签: vba excel


【解决方案1】:

显然double 也是一种数字类型>_> 将此归咎于我愚蠢,检查错误的事物并做出错误的假设。感谢 cmets 中的 rory 让我进一步检查各种函数返回的类型。

更明确地说,当在Application.InputBox 中输入一个数值时,它会返回一个Double,所以当我想要确保一个数值时,我应该检查这一点。

【讨论】:

  • 如果您希望代码对取消和空输入做出不同的反应,请确保将 LenStrPtr 保留在两个单独的 if 语句中,StrPtr 是第一个,因为它不是为空输入给出 0。
  • 您实际上是对的,它们的行为不同 - 在测试 StrPtr 时返回 528887244(在第二次测试中为 522748828),而 Len 在我按下取消时返回 5。无论如何,我都不能使用,所以我会删除那段。 @Taazar
【解决方案2】:

您可以使用StrPtr 而不是VarType,它只会在输入框被取消时给出0,尽管我不确定它对Application.InputBox() 有何反应。如果您只使用标准的InputBox(),但它可以完美运行,因此要检测已取消的InputBox,您可以将其添加到您的代码中:

If StrPtr(testvalue) = 0 Then
    Call MsgBox("Input cancelled.", "Cancelled")
End If

*使用此方法时需要注意的是它依赖于InputBox 中的错误行为。微软不会修复它,因为它会破坏很多人的代码,但需要注意。

【讨论】:

  • 这仅适用于VBA.Inputbox,不适用于此处使用的Application.Inputbox
  • @Rory 如果您查看他的第二个代码示例,他确实使用了VBA.InputBox。它们之间并没有任何区别可以阻止他更改那个输入框。
  • 道歉 - 我没有看到原始问题已被编辑以添加。
【解决方案3】:

您可以将类型调整为 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

【讨论】:

  • 您好,我不知道您是否在发布您自己的答案之前看到了我发布的答案,但我的问题基本上是我检查了错误的数字类型。即使输入框不接受它作为有效输入,检查类型是否为布尔值也将起作用。这对我来说更像是一个愚蠢的行为。
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 2015-12-14
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多