确定是否按下了取消按钮,其中InputBox变量声明为Double

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定是否按下了取消按钮,其中InputBox变量声明为Double相关的知识,希望对你有一定的参考价值。

我将我的变量声明为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:而言,我无法得到任何工作。

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

答案

您可以尝试这样的方法来测试输入框是否被取消以及它是否为数字。

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

正如在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提到的),您应该将用户输入存储到字符串中,然后确保您具有正确的值。

如果用户在输入框中单击“取消”,则返回空字符串(根据上面的文档)。由于空字符串不能被隐式强制转换为double,因此会生成错误。如果用户在InputBox中输入“apples”,则会发生同样的事情。

正如@Dude_Scott所说,您应该使用IsNumeric(或类似的东西)来确保用户输入是您所需要的。但是,您不需要检查空字符串或空字符串(因为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文章:

另一答案

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

你不能有一个Double。该函数返回一个String,你无法改变它。使用Double捕获结果迟早会引起问题。

我之前在评论框中试图解释的是,有可能0可能是一个有效的输入,所以立即将输入转换为Double阻止你能够从合法的0告诉取消 - 无论是什么当resut不是数字时,保证会发生类型不匹配错误。

正如其他答案所示,这涉及相当多的管道:足以保证被拉入其自己的专用包装器功能。

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

更好的方法是使包装函数返回一个Boolean,并利用ByRef参数返回结果 - 如果用户取消提示,则返回False,如果提示未被取消则返回TrueoutResult将为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."

以上是关于确定是否按下了取消按钮,其中InputBox变量声明为Double的主要内容,如果未能解决你的问题,请参考以下文章

vba inputBox:如何用空文本框区分“取消”和“确定”之间的区别

如何检查PKAddPassesViewController中是否按下了取消或添加按钮

了解用户在应用内购买期间何时按下了取消按钮

VBA输入框(InputBox)

WPF inputbox的问题

确定用户按下了哪个按钮