我对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
:(
如果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
这可能有助于
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