【问题标题】:Problem with excel (vba) Division by zero (Error 11) debuggingexcel(vba)除以零(错误11)调试的问题
【发布时间】:2021-03-15 05:03:49
【问题描述】:

我是 VBA 的新手,我有一个 Excel 工作表,其中正在运行一些宏。在其中一个选项卡中,用户可以输入数据,并通过按下工作表上的命令按钮,他们可以获得答案。现在我想通过用户表单输入数据。我已经成功创建了一个用户表单,它可以完美地从 Excel 表中读取/写入数据。我现在面临的问题是,一旦我在用户表单中输入数据,命令按钮(连接到宏)就会给我“除以零”错误,它有点破坏 Excel 文件,我需要用我的备份文件替换它!我不明白为什么通过用户表单输入数据会导致这个问题。

当我在 Excel 表上输入数据(不是通过用户表单)时,一切都很好!!!这是我收到错误的部分:

Function ATn2(x As Variant, Y As Variant) As Double
    If x = 0 Then
        If Y = 0 Then
            ATn2 = 1 / 0
        ElseIf Y > 0 Then
            ATn2 = Pi / 2
        Else
            ATn2 = -Pi / 2
        End If
    ElseIf x > 0 Then
        If Y = 0 Then
            ATn2 = 0
        Else
            ATn2 = Atn(Y / x)
        End If
    Else
        If Y = 0 Then
            ATn2 = Pi
        Else
            ATn2 = (Pi - Atn(Abs(Y) / Abs(x))) * Sgn(Y)
        End If
    End If 
End Function

当然我可以看到错误来自ATn2 = 1 / 0 :)

【问题讨论】:

  • 1/0 在任何情况下都无法工作。该代码仅在 y 0 时有效。无论如何,尝试将 ATn2(x As Variant, Y As Variant) 更改为 ATn2(x As Double, Y As Double)。不是为了解决零误差除法...
  • And of course I can see that the error is coming from ATn2 = 1 / 0 - 所以你知道它发生是因为你打电话给ATn2(0, 0)。所以不要那样做。
  • FaneDuru 和 GSerg,谢谢你们的 cmets。是的,我知道这是问题所在,但是由于我没有编写代码,所以我无法完全按照代码进行操作,而且我也无法理解为什么在 Excel 表中输入数据时不会发生这种情况!仅按用户表单放置数据会导致此问题

标签: excel vba


【解决方案1】:

如果 x 和 Y 都为 0,则通过允许 ATn2 = 1 / 0 选项,您正在创建除以零错误。在 Y = 0 的其他实例中,您已指定 Pi 或 0 作为返回值。

也许您应该将 1 / 0 更改为不同的值。

Function ATn2(x As Variant, Y As Variant) As Double
If x = 0 Then
    If Y = 0 Then
        ' // BOTH ARGUMENTS ARE ZERO
        MsgBox ("Values are both zero and cannot be calculated")
        Exit Function
    ElseIf Y > 0 Then
        ATn2 = Pi / 2
    Else
        ATn2 = -Pi / 2
    End If
ElseIf x > 0 Then
    If Y = 0 Then
        ATn2 = 0
    Else
        ATn2 = Atn(Y / x)
    End If
Else
    If Y = 0 Then
        ATn2 = Pi
    Else
        ATn2 = (Pi - Atn(Abs(Y) / Abs(x))) * Sgn(Y)
    End If
End If
End Function

【讨论】:

  • 我相信当两个参数实际上都为零时,故意将除以零错误。
  • 从一个应该返回值的函数调用消息框是非常错误的。
  • 感谢您的回复皮特,但由于我需要该值,因此发送消息对我没有帮助:)
  • 任何值除以零都会出错-您说将值直接放入工作表不会导致错误。如果你在工作表上手动输入 x = 0 和 Y = 0,你会得到什么值?
  • 好吧,我不输入 X 和 Y 作为 inout !!!它真的很冗长,只是读取一些输入(并非都与 X 和 Y 相关)然后计算某事!但是 X 和 Y 是在 micro 本身中定义的,我不能完全遵循它。它是从我认为的另一个函数中读取的
【解决方案2】:

这可能会有所帮助

Public Function ATan2(ByVal ipY As Double, ByVal ipX As Double) As Double
    
    Dim myTheta As Double

    If (Abs(ipX) < 0.0000001) Then
    
        If (Abs(ipY) < 0.0000001) Then
        
            myTheta = 0#
            
        ElseIf (ipY > 0#) Then
        
            myTheta = 1.5707963267949

        Else
        
            myTheta = -1.5707963267949
            
        End If
        
    Else
    
        myTheta = Atn(ipY / ipX)
  
        If (ipX < 0) Then
        
            If (ipY >= 0#) Then
            
                myTheta = 3.14159265358979 + myTheta
                
            Else
            
                myTheta = myTheta - 3.14159265358979
                
            End If
            
        End If
        
    End If
    
    ATan2 = myTheta
    
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2022-06-16
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2019-03-29
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多