如何解决vba中的运行时错误11除以0?
Posted
技术标签:
【中文标题】如何解决vba中的运行时错误11除以0?【英文标题】:How to solve runtime error 11 division by 0 in vba? 【发布时间】:2016-11-09 19:57:26 【问题描述】:我有以下代码.....
private sub textbox1_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
private sub textbox2_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
只要 textbox2 有一个零值,就会有一个消息框提示运行时错误 11;被零除。我尝试按照用户 Scott Craner here
的建议使用 IIF 条件来解决它textbox3.value = cdbl(textbox1.value)/IIF(cdbl(textbox2.value) = 0 , 1 , cdbl(textbox2.value) )
如果分母为零,我想知道是否可以以某种方式将 textbox3 的值指定为“NULL”或“NA”或“-”。我在互联网上找不到任何可信的东西。
非常感谢!!
【问题讨论】:
【参考方案1】:最简单的方法是在进行计算之前检查分母值。那么一个简单的 If...else 就足够了。
If textbox2.value = 0 Or IsEmpty(textbox2.Value) Then
textbox3.Value = "Null" 'Or "NA" or whatever you'd like
Else
textbox3.Value = cDbl(textbox1.Value) / CDbl(textbox2.Value)
End If
【讨论】:
如果我这样做,我会得到编译错误“ Block If without end if ” 那么您的代码中还有另一个问题。你有没有没有下一个的For
循环?或者另一个没有相应End If
的If
语句?
@Vinaybilla 正如凯尔所说,这不是这段代码的问题。您一定在其他地方遇到了问题
@Vinaybilla 我刚刚调整了我的代码。我意识到问题是 textbox2.value 不是作为“0”传递的,而是作为空字符串“”传递的,这段代码现在应该可以工作了【参考方案2】:
你的线路在哪里:-
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
如果为以下更改:-
textbox3.value = iif(cdbl(textbox2.value)=0,"N\A", cdbl(textbox1.value) / cdbl(textbox2.value))
这说明如果textbox2
为零,则输出'N\A',否则正常除法(即textbox1
/ textbox2
)。
【讨论】:
并没有真正回答 OP 的问题,因为他们要求将值设为“Null”等,而不是 textbox1.value。当然,如果您将第一个条件更改为“Null”,那么这确实可以正常工作 我试过了,但运行时错误仍然出现,vba要求我调试 另外,如果 textbox1.value =0 那么我们会得到运行时 6 错误【参考方案3】:替换所有代码:-
private sub textbox1_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
private sub textbox2_change()
if textbox1.value = "" then exit sub
if textbox2.value = "" then exit sub
textbox3.value = cdbl(textbox1.value) / cdbl(textbox2.value)
end sub
使用此代码:-
Private Sub textbox1_change()
ShowResult
End Sub
Private Sub textbox2_change()
ShowResult
End Sub
Private Sub ShowResult()
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
Else
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
End If
End Sub
Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function
这将检查不能为 Double
数据类型(即字符串)和错误除法(即错误代码 6 和 11)的值。
编辑:- 下面是上述代码中发生的事情的演练。
程序textbox1_change
和textbox2_change
做同样的事情以避免代码重复;他们都调用了该代码的一个实例。
Private Sub textbox1_change()
ShowResult
End Sub
Private Sub textbox2_change()
ShowResult
End Sub
之后,有一个新的过程ShowResult
保存textbox1_change
和textbox2_change
调用的代码的单个实例。
Private Sub ShowResult()
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
If (Str1 = "") Or (Str2 = "") Then Exit Sub
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
Else
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
End If
End Sub
ShowResult
代码会进行多项检查。
首先它将textbox1
放入Str1
和textbox2
放入Str2
并在它们上使用trim
。修剪意味着删除了前导和尾随空格。例如,如果textbox1
的值为“”(可能由用户复制和粘贴完成),那么从技术上讲它不是空的,可能会导致错误。
Dim Str1 As String
Dim Str2 As String
Str1 = Trim(textbox1.Value)
Str2 = Trim(textbox2.Value)
下一个检查是如果任何一个值为空然后退出过程,就像你之前做的那样,但现在在一行。
If (Str1 = "") Or (Str2 = "") Then Exit Sub
下一个检查调用另一个过程,该过程进行检查以确保值可以转换为双精度值。例如 CDbl("Hello World!")
会失败,因为它不是一个开头的数字。所以这个检查绕过了这个潜在的问题,如果它不是一个可以除的数字,那么输出'N\A'。
If (IsDouble(Str1) = False) Or (IsDouble(Str2) = False) Then
textbox3.Value = "N\A"
最后的检查是,如果第二个值为零或两者都为零,则输出“N\A2,否则除法完成并输出。
If (CDbl(Str2) = 0) Or ((CDbl(Str2) + CDbl(Str1)) = 0) Then
textbox3.Value = "N\A"
Else
textbox3.Value = CDbl(Str1) / CDbl(Str2)
End If
这是ShowResult
调用的最后一个过程,用于检查值是否可以转换为Double
数据类型。它尝试进行转换,如果发生错误则清除错误并将false
(默认)返回给调用者,如果没有错误则输出true
。
Private Function IsDouble(ByVal StrValue As String) As Boolean
Dim DblTest As Double
On Error GoTo ErrorHandle
DblTest = CDbl(StrValue)
IsDouble = True
Exit Function
ErrorHandle:
Err.Clear
End Function
希望这会有所帮助。
【讨论】:
非常感谢 gary.. 这只是诀窍,但我不明白它是如何工作的。请引导我完成解决方案 我很高兴它有帮助,也很高兴您需要进一步的解释,而不是仅仅使用它就走开了!我已经编辑了答案,希望对您有所帮助。以上是关于如何解决vba中的运行时错误11除以0?的主要内容,如果未能解决你的问题,请参考以下文章