如何在vba中解决运行时错误11除以0?

时间:2016-07-07 13:15:10

标签: vba excel-vba runtime-error excel

我有以下代码.....

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;被零除。我尝试使用用户建议的IIF条件来解决它 Scott Craner here

textbox3.value = cdbl(textbox1.value)/IIF(cdbl(textbox2.value) = 0 , 1 , cdbl(textbox2.value) ) 

我想知道如果分母为零,我是否能以某种方式将textbox3的值指定为“NULL”或“NA”或“ - ”。我在互联网上找不到任何可信的东西。

非常感谢!!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你有这条线: -

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)。

答案 2 :(得分:1)

替换所有代码: -

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放入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

下一个检查会调用另一个执行检查的过程,以确保该值可以转换为double。例如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

希望这有帮助。