VBA講座19 2次方程式を解くマクロ
(判別式の符号による場合分け)

 前回の記事で作ったユーザーフォームのコマンドボタンを押すと、入力された係数に対応する2次方程式の解を求めるマクロを作ります。

解の公式を用います

 2次方程式 \(ax^2+bx+c=0\) の解は
 
\[x=\frac{-b \pm \sqrt{D}}{2a}\]
と表されます。ここに D は判別式で
 
\[D=b^2-4ac\]
と定義されています。これをプログラムで書きすいように、もう少し形を変えておきましょう。
 
\[p=-\frac{b}{2a},\quad q=\frac{\sqrt{|D|}}{2a}\]
とおくと、判別式 D の符号によって
 
\[\begin{align*}D=0& \qquad x=p\\[6pt]
D \gt 0& \qquad x=p+q\,,\quad p-q\\[6pt]
D \lt 0& \qquad x=p+qi\,, \quad p-qi\end{align*}\]
のように書くことができます。 D に絶対値をつけると、重解と実数解では符号はそのままですし、虚数解のときは D の符号を反転させるので(つまり負の値を正にするので)、平方根を計算することができます(数値計算では負の値の平方根を計算させようとするとエラーになってしまいます)。
 

2次方程式を解くマクロ

 コマンドボタン(「解を求める」ボタン)をダブルクリックして現れた画面に次のようなコードを書きます。

 Private Sub CommandButton1_Click()

 Dim a As Double, b As Double, c As Double
 Dim d As Double, sd As Double, x As Double
 Dim p As Double, q As Double

 a = atxt
 b = btxt
 c = ctxt

 '判別式 D を計算
 d = b ^ 2 - 4 * a * c

 D の絶対値の平方根をとります
 sd = Sqr(Abs(d))

 p と q の値を小数点以下2桁に丸めておきます
 p = WorksheetFunction.Round(-b / (2 * a), 2)
 q = WorksheetFunction.Round(sd / (2 * a), 2)

 D の符号によって場合分けします
 Select Case d

  Case Is = 0
   xtxt = p

  Case Is > 0
   xtxt = p + q & "," & p - q

  Case Else
   xtxt = p & "+" & q & "i" & ", " & p & "-" & q & "i"

 End Select

 End Sub

係数 a, b, c を取得します

 5行目のコードで

a = atxt

として、前回の記事で名前を付けた atxt などのオブジェクトから値を得て、新たな変数 a, b, c に入れています。以前の記事では Text プロパティを使って

a = atxt.Text

と書くように説明しましたが、Text プロパティは省略しても値を取ってくれます。このあたりは好みに応じて選択してください。

判別式 D の平方根

 Abs は絶対値を、Sqr は平方根を計算する VBA関数です。

sd = Sqr(Abs(d))

という記述で D の絶対値の平方根をとって変数 sd に入れています。

ワークシート関数を呼び出します

 解によっては p と q が小数点以下何桁も並ぶようなこともありえるので、小数点以下2桁で四捨五入しますが、VBA の Round関数は「銀行丸め」という特殊な丸め方をするので、普通の四捨五入に使えません。そこで

p = WorksheetFunction.Round(-b / (2 * a), 2)

と書いて、ワークシートの ROUND関数を呼び出します。このように

WorksheetFunction.ワークシート関数

と記述すれば、WorksheetFunctionオブジェクトから普段使っているエクセル関数を呼び出すことができるのです。

D の符号で場合分けします

 判別式 D の符号による場合分けのコードです。Ifステートメントよりも Selectステートメントで書いたほうがスマートな記述になります。それぞれの場合に応じてテキストボックスに x の値を出力しますが、たとえば D が負の場合、

xtxt = p & "+" & q & "i" & ", " & p & "-" & q & "i"

のように書いて数値 p, q と文字列である +, -, i を「 & 」演算子で結んでいます。 i は虚数単位です。文字列はダブルクォーテーション「 "" 」で括っておかなくてはなりません。

フォームを呼び出すマクロ

 最後にユーザーフォームを呼び出すマクロを作っておきます。

 Sub 二次方程式フォーム呼び出し()
  QuadEq.Show (vbModeless)
 End Sub

 このマクロを実行するとフォームが現れるので、適当な係数を3つ入力して「解を求める」ボタンを押してください。すると ......

 2次方程式マクロUserform実行

 このように解が出力されるはずです。

 ≫ 配列変数の基本を学びます
 ≫ 数学マクロ講座トップページへ戻る

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

コメントをどうぞ

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