VBA 数学マクロ入門講座です。
今回のテーマはファンクションマクロ(ユーザー定義関数)です。
ヘロンの公式で三角形の面積を求める関数を作ります
3 辺の長さが与えられた場合、三角形の面積は ヘロンの公式
\[S=\sqrt{s(s-a)(s-b)(s-c)}\]によって与えられます。ここに $2s=a+b+c$ です。
ヘロンの公式を用いて三角形の面積を計算する HERON関数 を定義してみましょう。
'ヘロンの公式を使って三角形の面積を計算する関数
Function HERON(a As Double, b As Double, c As Double) As Variant
Dim s As Double, t As Double
s = (a + b + c) / 2
t = s * (s - a) * (s - b) * (s - c)
If t <= 0 Or a <= 0 Or b <= 0 Or c <= 0 Then
HERON = CVErr(xlErrNum)
Else
HERON = Sqr(t)
End If
End Function
ワークシートでセルに
=HERON(1,1,1)
と入力すると正三角形の面積 0.433 を返します。しかし
=HERON(2,1,1)
のような値で入力するとエラーとなります。このような三角形が存在しえないことは図を描いてみるとすぐにわかります。
HERON関数の戻り値のデータ型は Variant型で宣言しています。Variant はどんな型のデータでも格納できる便利なデータ型です。戻り値が数値でなくエラーメッセージとなる可能性があるので、この型を選んでいます。
面積 S ではなく、S の2乗を計算させて変数 t に入れています。三角形の各辺の長さは自由にとれるわけではなく、
2辺の長さを加えた値は他の一辺の長さより大きい
という条件で束縛されています。したがって (a, b, c) の値がおかしいと t が 0 になったり負になったりします。これを次の条件分枝で上手く使うのです。
入門講座では初めてとなる、条件分枝を記述する Ifステートメントが登場しています。
If 条件 Then
の下に [条件] を満たした場合の処理を記述し、
Else
の下に [条件] を満たさなかった場合の処理を記述します。最後に
End If
で結びます。
If t <= 0 Or a <= 0 Or b <= 0 Or c <= 0 Then
は「 t が 0 かまたは負である、あるいは a, b, c いずれかの値が 0 以下である」(ユーザーさんが変な値を入れたときの対応です)という条件文で、そのとき
HERON = CVErr(xlErrNum)
としています。CVErr はエラーメッセージを返す関数で、引数 [xlErrNum] によって「数式で使用される数値に問題があります」というメッセージが指定されています。 CVErr の詳細に関しては必要な時にヘルプを参照すればよいので、特に覚える必要はありません。t が正の値であるときに限って
HERON = Sqr(t)
によって三角形の面積を計算します。この Sqr は平方根を計算する VBA関数です。VBA関数はプロパティやメソッドと異なり、オブジェクトとは無関係に機能するステートメントです。
コメント