确定是否在将InputBox变量声明为Double的情况下按下了Cancel Button

时间:2019-03-07 18:23:38

标签: excel vba

我将变量声明为double,以便可以对其执行数学运算。

我正在尝试确定何时按下取消按钮。

Dim thckmax As Double

thckmax = InputBox("What is the maximum nominal thickness?", "Enter Max Nominal Thickness Measurement")
If thckmax = 0 Then
     GoTo Line3
End If

thckmin = InputBox("What is the minimum nominal thickness?", "Enter Min Nominal Thickness Measurement")
If thckmin = 0 Then
     GoTo Line3
End If
thcknom = (thckmax + thckmin) / 2
Worksheets(1).Range("C" & cols + 2).Value = thcknom
.
.
.
Line3: ...

我知道我曾经使用过GoTo。这是一个快速轻松的修复程序,用于启动和运行代码。

我得到运行时错误13类型不匹配。我还尝试了CDbl(...)StrPtr(...)IsEmpty(...),并且也没有尝试将它们设置为等于零,

If thckmax = "" Then
    GoTo Line3
End If`

就确定是否按下取消键并转到Line3:而言,我什么也做不了。

我发现的所有帖子都将声明的变量表示为字符串,我的变量是双精度的。

3 个答案:

答案 0 :(得分:5)

您可以尝试执行以下操作来测试输入框是否已取消以及是否为数字。

Dim thckmaxTest As String
Dim thckmax As Double

thckmaxTest = InputBox("What is the maximum nominal thickness?", "Enter Max Nominal Thickness Measurement")
If thckmaxTest <> vbNullString and IsNumeric(thckmaxTest) then thckmax = CDbl(thckmaxTest)
If thckmax = 0 Then
     GoTo Line3
End If

Dim thckminTest As String
Dim thckmin As Double 

thckminTest = InputBox("What is the minimum nominal thickness?", "Enter Min Nominal Thickness Measurement")
If thckminTest <> vbNullString and IsNumeric(thckmibTest) then thckmin = CDbl(thckminTest)
If thckmin = 0 Then
     GoTo Line3
End If
thcknom = (thckmax + thckmin) / 2
Worksheets(1).Range("C" & cols + 2).Value = thcknom

答案 1 :(得分:4)

Microsoft's documentation中所述,InputBox函数返回一个字符串。

那么,您可能会问,有时能否将返回值从InputBox存储到整数值?因为隐性强制。基本上,如果您尝试将值存储在不兼容的变量中,则VBA会尝试将值强制转换为正确的数据类型。如果您尝试将string值存储到Double变量中,则VBA会尝试将字符串强制转换为正确的数据类型。无论您使用InputBox还是硬编码的字符串,都会发生这种情况。例如,以下代码段是等效的:

Dim x as Double
x = "5"
''''''''''''''''''''''''''''''''''''''
Dim x As Double
x = InputBox("Enter a number")
' user enters 5

使用InputBox时,您当然无法控制用户是否输入有效输入。这就是为什么(如@Dude_Scott所述),您应该将用户输入存储在字符串中,然后确保您具有正确的值。

如果用户在输入框中单击取消,则会返回空字符串(根据上述文档)。由于空字符串不能隐式强制为双精度,因此会产生错误。如果用户在InputBox中输入“苹果”,就会发生同样的事情。

如@Dude_Scott所述,您应该使用IsNumeric(或类似的名称)来确保用户输入是您所需要的。但是,您不需要检查是否为null或空字符串(因为IsNumeric对于这些值返回False)。所以您真的只需要这样的东西:

Public Sub foo()
    Dim xDouble As Double, xString As String

    xString = InputBox("Enter a number")

    If IsNumeric(xString) Then
        xDouble = CDbl(xString)
        MsgBox xDouble
    Else
        MsgBox "Invalid number"
    End If
End Sub

有关强制的更多信息,请参见以下Microsoft文章:

答案 2 :(得分:3)

  

我发现的所有其他参数都将声明的变量表示为字符串,我的变量是DOUBLE

您不能拥有Double。该函数返回一个String,并且您不能更改它。使用Double捕获结果 迟早会引起问题。

我之前试图在评论框中解释的是,0可能是有效输入,因此立即将输入转换为Double可能会阻止您告诉取消合法0的取消操作-不论何时只要非数字就保证会发生类型不匹配错误。

如其他答案所示,这涉及很多方面:足以保证被拉入其自己的专用包装函数中。

问题是函数返回一个一个值,因此您可以返回一个Double并选择一个特定的“魔术值”来表示“输入已取消”,但这是一个糟糕的做法

一种更好的方法是使包装函数返回Boolean,并利用ByRef参数返回结果-如果用户取消提示,则类似这样的函数返回FalseTrue(如果未取消提示),对于非数字输入,outResult将为0,或者将输入转换为Double

Public Function TryGetDoubleInput( _
    ByVal prompt As String, _
    ByVal title As String, _
    ByVal default As String, _
    ByRef outResult As Double) _
As Boolean
    Dim result As String
    result = VBA.Interaction.InputBox(prompt, title, default)
    TryGetDoubleInput = StrPtr(result) <> 0 'return false if cancelled
    If IsNumeric(result) Then outResult = CDbl(result)
End Function

可以这样使用:

Dim value As Double
If TryGetDoubleInput("Enter a numeric value:", "Prompt", "0.00", value) Then
    If value = 0 Then
        MsgBox "You entered either 0 or a non-numeric value"
    Else
        MsgBox "You entered " & CStr(value) ' note the irony
    End If
Else
    MsgBox "You cancelled the prompt"
End If

现在,如果您需要将无效值与0区别对待(即,如果0是合法输入),请考虑抛出错误:

Public Function TryGetDoubleInput( _
    ByVal prompt As String, _
    ByVal title As String, _
    ByVal default As String, _
    ByRef outResult As Double) _
As Boolean
    Dim result As String
    result = VBA.Interaction.InputBox(prompt, title, default)
    If StrPtr(result) = 0 Then Exit Function 'return false if cancelled

    If IsNumeric(result) Then 
        outResult = CDbl(result)
        TryGetDoubleInput = True
    Else
        Err.Raise 555, "TryGetDoubleInput", "Non-numeric input is invalid."
    End If
End Function

现在您可以使用错误处理来处理无效输入,并且现在可以从任意无效输入的取消的输入框中告诉合法的0

On Error GoTo ErrHandler
Dim value As Double
If TryGetDoubleInput("Enter a numeric value:", "Prompt", "0.00", value) Then
    MsgBox "You entered " & CStr(value) ' note the irony
Else
    MsgBox "You cancelled the prompt"
End If

Exit Sub
ErrHandler:
    MsgBox Err.Description ' "Non-numeric input is invalid."