今回の講座では三角形の面積を求めるヘロンの公式を VBA で実装してみます。一見すると簡単に実装できそうに思えますが、とりうる引数について制限があるので、完璧な実装には色々と考えなければならない点も多く、プログラミング入門用としてなかなか良い題材です。単純な実装から始めて、少しずつ問題点を改善しながらマクロを完成させていきます。
【VBA】ヘロンの公式で三角形の面積を計算する
三辺の長さが与えられている場合、三角形の面積はヘロンの公式
によって計算できます。ここに
なので、面積は
と計算できます。ヘロンの公式の証明は記事の後半に載せてあるので、気になる人は確認しておいてください。それではさっそく、ヘロンの公式を VBA で実装してみましょう。
'[VBA] ヘロンの公式(1)
Function HERON_1(a As Double, b As Double, c As Double) As Double
Dim s As Double, t As Double
s = (a + b + c) / 2
HERON_1 = Sqr(s * (s - a) * (s - b) * (s - c))
End Function
Sqr は渡された数値の平方根をとる関数です。辺の長さが
=HERON_1(1,1,1)
と入力すると 0.433 の値が返ります。これで特に問題なさそうですが、実はこのままでは不十分です。たとえば、
=HERON_1(1,1,2)
と入力すると 0 を返してしまいます。何かコードにミスがあったのでしょうか? 手計算で確かめてみましょう。
となるので、これをヘロンの公式に代入してみると…
よく知られているように、三角形の各辺の長さは自由にとれるわけではなく、「二辺の長さを加えた値は他の一辺の長さより大きい」という条件で束縛されています。
=HERON(1,1,3)
と入力すると、#VALUE! エラーが発生します。VBA の Sqr 関数に負の値が渡されたことに起因します。
このように、ヘロンの公式に「三角形として成立しない辺の組」を入れると
が 0 や負の場合に、エラーを返すように実装すればよいことになります。
VBA では CVErr() にエラー番号またはエラー定数を渡して、特定のエラーを発生させられます。ここではエラーについては深入りしません。とりあえず、次の関数をワークシートで実行して、CVErr(XlErrNum) が #NUM! エラーを返すことだけ確認してください。
'[VBA] エラーテスト関数
Function error_test()
error_test = CVErr(xlErrNum)
End Function
さきほどのコードを改良してみましょう。
'[VBA] ヘロンの公式(2)
Function HERON_2(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 Then
HERON_2 = CVErr(xlErrNum)
Else
HERON_2 = Sqr(t)
End If
End Function
HERON_2 関数の戻り値のデータ型は Variant型で宣言しています。Variant はどのような型のデータでも格納できる便利なデータ型です。戻り値が数値でなくエラーメッセージとなる可能性があるので、この型を選んでいます。
入門講座では初めてとなる、条件分枝を記述する If ステートメントが登場しています。If ステートメントは
If [条件] Then [条件]を満たした場合の処理 Else [条件]を満たさなかった場合の処理 End
のような形で記述します。上のコードの
If t <= 0 Then HERON = CVErr(xlErrNum) Else HERON = Sqr(t) End If
の部分では、t が 0 以下なら #NUM! を返し、それ以外の場合は t の平方根をとって面積を返すようにしています。ワークシートの適当なセルに
=HERON_2(1,1,2)
と入力して、0 ではなく #NUM! を返すことを確認してください。
これで完成 … と思いきや、まだ問題があります。
=HERON_2(-1,-1,-1)
と入力すると、0.433 が返ります。実はヘロンの公式は、辺の長さが負であっても計算結果が正の実数になることがあります。数学の問題を解く時に、わざわざ負の長さを代入することはまずないので、公式に
'[VBA] ヘロンの公式(3)
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)
と入力すると、#NUM! エラーを返すことを確認してください。
ヘロンの公式の証明
ヘロンの公式を証明しておきます。下図のような三角形を考えます。
頂点
と表せます。三角関数の公式
となります。さらに余弦定理
と表せるので、これを式 (2) に代入して整理すると、
を得ます。ここで、
とおくと、
と表せるので、これを (4) に入れて式を整理すれば、
となって、ヘロンの公式が得られました。■
エクセルや数学に関するコメントをお寄せください