我想在VBA中計算atan2
,但我不確定該函數是否存在(或者甚至在哪裏查找內置VBA函數的規範列表)。我沒有使用Excel,因此工作表調用是不可能的。VBA是否具有ATan2功能?
我可以implementatan2
我自己,但我寧願避免這樣做,如果可能的話。
我想在VBA中計算atan2
,但我不確定該函數是否存在(或者甚至在哪裏查找內置VBA函數的規範列表)。我沒有使用Excel,因此工作表調用是不可能的。VBA是否具有ATan2功能?
我可以implementatan2
我自己,但我寧願避免這樣做,如果可能的話。
也許這個代碼將適合你:
Private Const Pi As Double = 3.14159265358979
Public Function Atn2(y As Double, x As Double) As Double
If x > 0 Then
Atn2 = Atn(y/x)
ElseIf x < 0 Then
Atn2 = Sgn(y) * (Pi - Atn(Abs(y/x)))
ElseIf y = 0 Then
Atn2 = 0
Else
Atn2 = Sgn(y) * Pi/2
End If
End Function
爲了得到一個列表,請鍵入到您的模塊
VBA.Math
或者使用對象瀏覽器。你會發現Atn和Tan等等,但是名單很短,並且不包括ATan2。
如果你想添加到一個Excel庫的引用,你可以使用:
Excel.WorksheetFunction.Atan2
編輯:您可以從任何Office應用程序,它允許你添加一個引用到Excel的庫Excel工作表函數。這並不意味着使用Excel或工作表,只是功能。
我沒有使用任何Office產品,我不能認爲Office將與託管我的VBA宏的產品一起安裝。 – 2011-02-25 13:01:31
在這種情況下,您可能僅限於VBA.Math函數,並且它們不包含ATan2。如果它不是機密的,你使用的是什麼,包括VBA,但不是Office系列的一部分?它可能會有一組擴展的功能,因爲每個MS應用程序都有所不同。 – Fionnuala 2011-02-25 13:09:56
正如MarkJ前面指出的,上面的代碼會失敗,當X < 0和y = 0。我相信下面的工作所有的時間:
Function ArcTan2(X As Double, Y As Double) As Double
Private Const PI As Double = 3.14159265358979
Private Const PI_2 As Double = 1.5707963267949
Select Case X
Case Is > 0
ArcTan2 = Atn(Y/X)
Case Is < 0
ArcTan2 = Atn(Y/X) + PI * Sgn(Y)
If Y = 0 Then ArcTan2 = ArcTan2 + PI
Case Is = 0
ArcTan2 = PI_2 * Sgn(Y)
End Select
End Function
它利用SGN(0)在x和y的情況下返回0 0
您可以嘗試
Application.Atan2
在VBA中'Sgn(0)'爲零。如果x <0且y = 0,不確定上面的代碼是否給出了正確的答案。它返回0. Sgn文檔http://msdn.microsoft.com/en-us/library/aa242074(v=vs.60).aspx – MarkJ 2012-02-07 21:18:00