Attribute VB_Name = "Module4"
'******************************************************************************
'*                           シート関数                                       *
'******************************************************************************
'
'コンフィギュレーション識別番号：Sfn-Ver6.0
'  配布用として不要な関数削除
'　2018/11/27　　原作者
'
' ドライバによりシート関数としてＳＳＳＬＩＢ関数利用できるようにする
' （戻り値が単一のデータで、引数が複数個（構造型）のデータを含む関数）
' sXXXXXX  ：ＳＳＳＬＩＢ関数のドライバ
'   sAzimth     方位角を求める
'   sGrnLng     グリニッジ平均恒星時（春分点からのグリニッジの経度を求める）
'   sMx33Dt     マトリクスのデターミナント
'   sNrmVel     軌道面外速度
'   sPolyEx     多項式展開
'   sVctAng     ２つのベクトルの間の角度
'   sVctInp     ベクトルの内積
'   sVctMag     ベクトルの絶対値
'
' ドライバなしでシート関数として利用できるＳＳＳＬＩＢ関数（Module3の関数がそのまま利用できる）
' （全部の引数及び戻り値がそれぞれ単一のデータから成る関数）
'   Actand      逆正接　tan−１（s／c）　[0〜360deg]
'   Arcosd      逆余弦　cos−１（c）　[0〜180deg]
'   Arsind      逆正弦　sin−１（s）　[-90〜90deg]
'   Artand      逆正接　tan−１（s／c）　[-180〜180deg]
'   Cosd        角度（度）の余弦
'   Deg         ラジアンから度へ単位変換
'   Diff        差分
'   GeoDes      測地線に沿った距離の計算
'   Gmu         地球重力定数(m^3/s^2)
'   Rad         度からラジアンへ単位変換
'   Sind        角度（度）の正弦
'   Sqrt        平方根の計算
'   StdRnd      標準正規乱数の発生
'   Wer         地球自転レート(deg/s)
'
Option Explicit
Function sAzimth(a As Range, b As Range) As Double

'方位角を求める

' A      ：入力、地心半径ベクトル
' B      ：入力、方位角を求めるベクトル
' sAzimth：出力、方位角（-180〜180deg）

    Dim L As Boolean
    Dim d() As Double, r As Vector3D, v As Vector3D
    
    L = GetVector3DRange(r, a)
    L = GetVector3DRange(v, b)
    sAzimth = Azimth(r, v)

End Function
Function sGrnLng(a As Range, b As Range) As Double

'グリニッジ平均恒星時（春分点からのグリニッジの経度を求める）

    Dim L As Boolean
    Dim p() As Variant
    Dim d As yymmdd, t As hhmmss
    
    L = GetArrayRange(p, a)
    d.Yr = p(1)     '年
    d.Mn = p(2)     '月
    d.Dy = p(3)     '日

    L = GetArrayRange(p, b)
    t.hr = p(1)     '時
    t.min = p(2)    '分
    t.sec = p(3)    '秒

    sGrnLng = GrnLng(d, t)

End Function
Function sMx33Dt(a As Range) As Double

'マトリクスのデターミナント

' A      ：入力、マトリクス（３Ｘ３）
' sMx33Dt：出力、デターミナント

    Dim L As Boolean
    Dim m As Matrix3x3

    L = GetMatrix3x3Range(m, a)
    sMx33Dt = Mx33Dt(m)

End Function
Function sNrmVel(rR As Range, vR As Range, v As Range) As Double

'軌道面外速度

' Rr      ：入力、基準位置ベクトル
' Vr      ：入力、基準速度ベクトル
' V       ：入力、対象速度ベクトル
' sNrmVel ：出力、軌道面外速度

    Dim L As Boolean
    Dim a As Vector3D, b As Vector3D, c As Vector3D

    L = GetVector3DRange(a, rR)
    L = GetVector3DRange(b, vR)
    L = GetVector3DRange(c, v)
    sNrmVel = VctInp(VctNrm(VctCrp(a, b)), c)

End Function
Function sPolyEx(c As Range, n As Range, a As Range) As Double

'多項式展開

' C      ：入力、多項式係数
' n      ：入力、次数
' A      ：入力、引数
' sPolyEx：出力、多項式展開値

    Dim L As Boolean
    Dim d() As Double
    Dim cd() As Variant, nD As Variant, ad As Variant

    L = GetArrayRange(cd, c)
    L = CDblArray(cd, d)
    L = GetVariantRange(nD, n)
    L = GetVariantRange(ad, a)
    sPolyEx = PolyEx(d, CInt(nD), CDbl(ad))

End Function
Function sVctAng(a As Range, b As Range) As Double

'２つのベクトルの間の角度

' A      ：入力、３次元ベクトル
' B      ：入力、３次元ベクトル
' sVctAng：出力、角度 [0〜180deg]

    Dim L As Boolean
    Dim p As Vector3D, q As Vector3D

    L = GetVector3DRange(p, a)
    L = GetVector3DRange(q, b)
    sVctAng = VctAng(p, q)

End Function
Function sVctInp(a As Range, b As Range) As Double

'ベクトルの内積

' A      ：入力、３次元ベクトル
' B      ：入力、３次元ベクトル
' sVctInp：出力、内積

    Dim L As Boolean
    Dim p As Vector3D, q As Vector3D

    L = GetVector3DRange(p, a)
    L = GetVector3DRange(q, b)
    sVctInp = VctInp(p, q)

End Function
Function sVctMag(a As Range) As Double

'ベクトルの絶対値

' A      ：入力、３次元ベクトル
' sVctMag：出力、ベクトルの大きさ

    Dim L As Boolean
    Dim p As Vector3D

    L = GetVector3DRange(p, a)
    sVctMag = VctMag(p)

End Function

