VBA で逆三角関数 Arcsin と Arccos を計算します

 逆三角関数についてはエクセルに 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 を計算する ASN関数を作ります

 Arcsinx を計算するファンクションマクロ(ユーザー定義関数)を書いてみます。

 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 を計算する ACN関数を作ります

 Arccosx を計算するファンクションマクロ(ユーザー定義関数)もほとんど同じコードです。

 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(0.3)

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

Arcsinx + Arccosを計算させます

 それでは上の2つの関数をサブルーチンの中で呼び出してみましょう。
 次のようなマクロになります。

 Sub AsnPlusAcn()

  Dim x1 As Double, x2 As Double
  Dim y As Double

  On Error GoTo HandleErr

  x1 = InputBox("Arcsinの変数を入力してください")
  x2 = InputBox("Arccosの変数を入力してください")

  y = ASN(x1) + ACN(x2)
   MsgBox y
  Exit Sub

  HandleErr:
   MsgBox "-1から1の範囲で入力してください"

 End Sub

 InputBox からユーザーに x1, x2 の値を入力してもらいます。

On Error GoTo HandleErr

がエラーを処理するための命令文です。以降の処理でエラーが発生した(定義域以外の値が入力された)場合は、ただちに

HandleErr:

までとんで

「 -1 から 1 の値を入力してください」

というエラーメッセージを表示してプログラムを終了します。

Exit Sub

は、エラーがないときにこのメッセージを表示しないように、ルーチンから抜けるためのコードです。

スポンサーリンク
スポンサーリンク
末尾広告
末尾広告

コメント

  1. Toshihiro Ioi より:

    VBA初心者です。
    VBAでアークコサインの計算を行いたいのですが、
    ACN(x)関数定義の後、ACN(Cells(i,j))の計算はできますか?
    xとCellsの関係が分かりません。
    End Sub が必要ですというエラーが出ます。

    宜しくご検討をお願いします。

    • Blog Cat より:

       ACN 関数の引数 x は Double 型で定義されているので、セルの中に数値が入っていれば、ACN(Cells(i,j)) を計算できます。たとえば、セル A1 に 0.5 という値が入力されているとして、次のようなマクロで Arccos(0.5) を計算することができます。

       Sub Arccos()
        Dim a As Double
        a = ACN(Cells(1, 1))
        Debug.Print a
       End Sub

       実行すると、イミディエイトウィンドウに「1.0471975511966」という値が表示されるはずです。上のマクロではサブルーチンの中でファンクションマクロの ACN 関数を呼びだして、変数 a に計算結果を代入しています。

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください