【问题标题】:How to solve runtime error 11 division by 0 in vba?如何解决vba中的运行时错误11除以0?
【发布时间】: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”或“-”。我在互联网上找不到任何可信的东西。

非常感谢!!

【问题讨论】:

    标签: vba excel runtime-error


    【解决方案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.. 这只是诀窍,但我不明白它是如何工作的。请引导我完成解决方案
    • 我很高兴它有帮助,也很高兴您需要进一步的解释,而不是仅仅使用它就走开了!我已经编辑了答案,希望对您有所帮助。
    猜你喜欢
    • 2021-09-11
    • 2016-11-08
    • 2015-11-18
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2019-12-15
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多