Excel VBA 数学教室ではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】テキストボックス・ラベル・コマンドボタン

テキストボックス、ラベル、コマンドボタンの配置

二次方程式 ax2 + bx + c = 0 の解を求めるマクロを作ります。最初にユーザーフォームの作っておきます。慣れてしまえば難しい作業ではありませんが、見栄えを良くするために、フォントサイズを調整しておきましょう。 VBE 画面で [挿入] ⇒ [ユーザーフォーム] としてユーザーフォームを用意し、次のようなイメージでラベルやテキストボックスを配置します。
 
VBA2次方程式Userform

【VBA】ユーザーフォームの設定

デフォルトで「UserForm1」となっている [Caption] を「2次方程式の解を求めます」のように分かりやすいものに変えておきます(ウィンドウの左上隅に表示される名前です)。 [オブジェクト名] は「QuadEq」と変えておきましょう。 QuadEq は Quadratic equation(2次方程式)の略です。

【VBA】テキストボックスの設定

係数 a, b, c のところはテキストボックスにして、数値を入力できるようにしています。上図のように [Font] を選択して […] を押してフォントサイズを 14 前後に設定しておきます(入力される文字の大きさです)。テキストボックスを1つ作って残り2つはコピーを配置すれば、フォントサイズの設定はそのまま複製されます。プロパティ画面でそれぞれのオブジェクト名を

atxt, btxt, ctxt

に変えておきます。また同じようにコピーを右下隅に配置して、ドラッグしてボックスの大きさを横に伸ばしておきましょう。[オブジェクト名] は xtxt とします。この部分に解が表示されます。

【VBA】ラベルの設定

次にラベルを配置していきます。小文字の x は字が小さいので、フォントサイズは 24 ぐらいでちょうど良いと思います。 x の肩に乗っている数字の 2 も別のラベルとして作ってあります。フォントサイズは 14 です。

【VBA】コマンドボタン

コマンドボタンを1つ作って [Caption] を「解を求める」としておきます。フォントサイズは 16 ぐらいに設定しておきます。次回の記事ではこのコマンドボタンが押されたときに実行されるマクロを作成します。

判別式の符号による場合分け

ユーザーフォームのコマンドボタンを押すと、入力された係数に対応する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 の符号を反転させるので(つまり負の値を正にするので)、平方根を計算することができます(数値計算では負の値の平方根を計算させようとするとエラーになってしまいます)。

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

'[VBA] コマンドボタンのイベントプロシージャ

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

5行目のコードで

a = atxt

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

a = atxt.Text

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

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

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

のように書いて数値 p, q と文字列である +, -, i を「 & 」演算子で結んでいます。 i は虚数単位です。文字列はダブルクォーテーション「 “” 」で括っておかなくてはなりません。最後にユーザーフォームを呼び出すマクロを作っておきます。

'[VBA] ユーザーフォーム呼び出しプロシージャ

Sub Call_Form()
  QuadEq.Show (vbModeless)
End Sub

Call_Form() を実行するとフォームが現れるので、適当な係数を3つ入力して「解を求める」ボタンを押すと、以下のように出力されるはずです。
 
2次方程式マクロUserform実行

エクセルや数学に関するコメントをお寄せください