如何解决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 IfIf 语句? @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_changetextbox2_change 做同样的事情以避免代码重复;他们都调用了该代码的一个实例。

Private Sub textbox1_change()
ShowResult
End Sub

Private Sub textbox2_change()
ShowResult
End Sub

之后,有一个新的过程ShowResult 保存textbox1_changetextbox2_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 放入Str1textbox2 放入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?的主要内容,如果未能解决你的问题,请参考以下文章

解决 Excel VBA 文本文件导出中的运行时 91 错误

错误处理中的 Excel VBA 运行时错误 1004

excel vba 运行时错误

VBA - 使用 DAO 对象的运行时错误 3271

除以零 - c 编程

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误