この記事では、VBA で三角関数と逆三角関数を計算する方法について解説します。ワークシートの三角関数および逆三角関数については、こちらの記事を参照してください。
【VBA】三角関数
VBA の 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」が返るはずです。
エクセルや数学に関するコメントをお寄せください