2011-02-25 98 views
3

我想在VBA中計算atan2,但我不確定該函數是否存在(或者甚至在哪裏查找內置VBA函數的規範列表)。我沒有使用Excel,因此工作表調用是不可能的。VBA是否具有ATan2功能?

我可以implementatan2我自己,但我寧願避免這樣做,如果可能的話。

回答

2

也許這個代碼將適合你:

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 
+0

在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

6

爲了得到一個列表,請鍵入到您的模塊

VBA.Math 

或者使用對象瀏覽器。你會發現Atn和Tan等等,但是名單很短,並且不包括ATan2。

如果你想添加到一個Excel庫的引用,你可以使用:

Excel.WorksheetFunction.Atan2 

編輯:您可以從任何Office應用程序,它允許你添加一個引用到Excel的庫Excel工作表函數。這並不意味着使用Excel或工作表,只是功能。

+0

我沒有使用任何Office產品,我不能認爲Office將與託管我的VBA宏的產品一起安裝。 – 2011-02-25 13:01:31

+1

在這種情況下,您可能僅限於VBA.Math函數,並且它們不包含ATan2。如果它不是機密的,你使用的是什麼,包括VBA,但不是Office系列的一部分?它可能會有一組擴展的功能,因爲每個MS應用程序都有所不同。 – Fionnuala 2011-02-25 13:09:56

4

正如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

+1

上面假設標準訂單。某些語言似乎交換了X和Y的輸入。請參閱 Avi 2012-06-29 16:58:42

+0

Avi:我建議上述使用Excel順序而不是標準順序... – ChrisV 2014-05-26 14:26:42

0

您可以嘗試

Application.Atan2