我将变量声明为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:
而言,我什么也做不了。
我发现的所有帖子都将声明的变量表示为字符串,我的变量是双精度的。
答案 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
参数返回结果-如果用户取消提示,则类似这样的函数返回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."