确定是否按下了取消按钮,其中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
,如果提示未被取消则返回True
,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."
以上是关于确定是否按下了取消按钮,其中InputBox变量声明为Double的主要内容,如果未能解决你的问题,请参考以下文章
vba inputBox:如何用空文本框区分“取消”和“确定”之间的区别