[VBA] 三角関数 Sin, Cos, Tan

VBA で三角関数 (sin, cos, tan) を計算する

 Sin(数値) は数値の正弦 (サイン) を返します。
 Cos(数値) は数値の余弦 (コサイン) を返します。
 Tan(数値) は数値の正接 (タンジェント)を返します。

 戻り値は Double 型(倍精度浮動小数点数型)です。

 Sin関数を使って $\sin(\pi/6)$ の値を求めてみましょう。
 引数はラディアンで指定するので、
 
\[\pi=3.14159265\]
ぐらいの精度で円周率を定義しておきます。

'[VBA] sin30°を計算

Sub Sin_30_1()
  Dim pi As Double, x As Double
  pi = 3.14159265
  Debug.Print Sin(pi / 6)
End Sub

 Sin_30_1() を実行すると「 0.49999 … 」という数字となって、真値「 0.5 」に比べて少しだけ誤差があります。そこで、ワークシート関数PI() を呼び出すコードに変えてみましょう。

'[VBA] ワークシート関数を呼び出してsin30°を計算

Sub Sin_30_2()
  Dim pi As Double, x As Double
  pi = WorksheetFunction.Pi()
  Debug.Print Sin(pi / 6)
End Sub

 Sin_30_2() を実行すると「 0.5 」という値を得ることができます。
 
 場合によっては、ラディアンではなく、引数を度数 deg (degree の略。すなわち “°”)で入れたいこともあると思います。deg と rad の間には
 
\[180\,\mathrm{[deg]}=\pi\,\mathrm{[rad]}\]
の関係があるので、

\[x\,\mathrm{[deg]}=\frac{\pi x}{180\,\mathrm{[rad]}}\]
によって単位を変換できます。以下には引数を度数で指定する三角関数を載せておきます。いずれもファンクションマクロ(ユーザー定義関数)ですから、コードをそのまま標準モジュールに貼りつけるだけで、普通のワークシート関数と同じように使用することができます。

'[VBA] 引数を度数単位で受け取る正弦関数
Function DSIN(x As Double) As Double
  Dim pi As Double
  pi = WorksheetFunction.Pi()
  DSIN = Sin(x * pi / 180)
End Function

'[VBA] 引数を度数単位で受け取る余弦関数
Function DCOS(x As Double) As Double
  Dim pi As Double
  pi = WorksheetFunction.Pi()
  DCOS = Cos(x * pi / 180)
End Function

'[VBA] 引数を度数単位で受け取る正接関数
Function DTAN(x As Double) As Double
  Dim pi As Double
  pi = WorksheetFunction.Pi()
  DTAN = Tan(x * pi / 180)
End Function

 試しに $\sin 45^\circ$ を計算してみましょう。

'[VBA] SIN(45°)の計算
Sub DSIN_TEST()
  Debug.Print DSIN(45)
End Sub
0.707106781186547

 DSIN, DCOS, DTAN は Function プロシージャなので、ワークシートでも使えます。適当なセルに

=DSIN(数値)
=DCOS(数値)
=DTAN(数値)

と入力すると、それぞれ正弦 (サイン)、余弦 (コサイン)、正接 (タンジェント) の値を返してくれます。
 

VBA で逆三角関数を計算する

 逆三角関数についてはエクセルに ASIN や ACOS が用意されているので、マクロの中で使いたい場合は

Application.WorksheetFunction.ASIN(number)

のように書いてワークシート関数を呼び出す手もありますが、場合によってはユーザー定義関数としてマクロの内部に書いておいたほうが短い記述で済みます。複雑なサブルーチンを作る前に、予めこうしたユーザー定義関数をたくさん揃えておくことで、サブルーチン本体をすっきりした記述で表すことができます。
 
 VBA に用意されている逆三角関数は Atn(アークタンジェント)だけで、アークサインやアークコサインはありません。なので次の2つの公式を利用して計算することになります。
\[\begin{align*}\mathrm{Arcsin}x+\mathrm{Arccos}x=\frac{\pi}{2} \tag{1}\\[6pt]
\mathrm{Arcsin} x=\mathrm{Arctan} \frac{x}{\sqrt{1-x^2}}\tag{2}\end{align*}\] Arctanx の変数に制限はありませんが、Arcsinx, Arccosx ともに定義域は -1 ≦ x ≦ 1 であることに注意しましょう。上の公式では定義域内であっても x = ±1 の2点だけは分母が 0 になって計算できないので、条件分枝を使って処理する必要があります。また円周率は
\[\pi=4\mathrm{Arctan}(1)\]で計算することになります。
 
 Arcsinx を計算する Function プロシージャを実装してみます。

'[VBA] Arcsin(x)

Function ASN(x As Double) As Double

  Dim pi As Double
  pi = 4 * Atn(1)

  Select Case x
    Case Is = -1
    ASN = -pi / 2
    Case Is = 1
    ASN = pi / 2
    Case Else
    ASN = Atn(x / Sqr(1 - x ^ 2))
  End Select

End Function

 Selct Case ステートメントで条件分枝を処理しています。
 もちろん If ステートメントを使っても同じようなコードを書けます。
 x = ±1 のときだけ値を与えて、その他の場合では公式 (2) にしたがって計算させています。定義域以外の値が入った場合は、ここの計算で自動的にエラーが表示されるので、ワークシート上で使用するぶんには、このままで問題ありません。ただし後述するようにサブルーチンでこの関数を呼び出すときには適切なエラー処理文を書いておいたほうが良いと思います。
 
 Arccosx を計算する関数もほとんど同じコードです。

'[VBA] Arccos(x)

Function ACN(x As Double) As Double

  Dim pi As Double
  pi = 4 * Atn(1)

  Select Case x
    Case Is = -1
    ACN = pi
    Case Is = 1
    ACN = 0
    Case Else
    ACN = pi / 2 - Atn(x / Sqr(1 - x ^ 2))
  End Select

End Function

 ACN() をワークシート上で使いたい場合は

=ACN(0.3)

のように記述します。「 1.266 」が返るはずです。

コメント

タイトルとURLをコピーしました