【VBA】ユーザーフォームの作り方

 VBA ではテキストボックスやチェックボックスなどをまとめた ユーザーフォーム (UserForm) を簡単に作ることができます。ユーザーフォームを扱うことができれば、ユーザーさんに値を入力してもらって簡単に実行できるユーザーフレンドリーなマクロを作るようになれます。今回と次回の記事を読んでユーザーフォームの基本をマスターしましょう。
 x の値を入力して実行ボタンを押すと、 y = x2 を計算してテキストボックスに出力される、というマクロを作ります。プログラム自体は次回の記事で書き込むことにして、今回はユーザーフォームの作り方を学びます。

ユーザーフォームを挿入します

 VBE 画面で [挿入] タブをクリックして [ユーザーフォーム] を選択します。すると次のような画面が現れます。

 VBAユーザーフォーム表示

 初期設定ではウィンドウに左上隅に表示される名前が「 UserForm1 」となっているので、プロパティウィンドウ の [Caption] を「平方計算」に変えておきます。同時に表示されているツールボックスからコントロール(ボタンやチェックボックスなど)を選んで、ユーザーフォーム上に配置していきます。それぞれのアイコンにカーソルを合わせると、コントロールの種類がポップアップするので、それを参考に選択します。下図のように、まずラベルを選択してフォームをクリックしましょう。すると「 Label1 」という文字が配置されるはずです。

 VBAラベルを貼ります

 フォーム上のラベルを選択した状態で、プロパティウィンドウで [Caption] を「 y = x^2 の計算」と変えると、それに応じてラベルの文字が変わります。しかし、このままでは文字が小さすぎるので、もっと大きな字に変えましょう。プロパティウィンドウの [Font] をクリックすると右側に […] というアイコンが現れるので、これを押してフォント調整画面を表示します。 [サイズ] を「 14 」に変更しておきましょう。

 VBA文字の大きさを変更
 
 同じ要領で、ツールボックスからラベル、テキストボックス、コマンドボタンを選択して下のようなユーザーフォームを完成させましょう。

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

 あとでマクロを作るときにわかりやすいオブジェクト名を設定しておきます。プロパティウィンドウで x を入力するテキストボックスの [オブジェクト名] を xtxt に変えておきます。同じように y を出力するテキストボックスの [オブジェクト名] を ytxt とします。一番下にあるコマンドボタンの [Caption] は「実行」という名前にしておきます。
 
 次はユーザーフォーム (UserForm) のコマンドボタン(実行ボタン)が押された時に実行されるマクロを書きます。VBE 画面のプロジェクトウィンドウから [フォーム] ⇒ [UserForm1] を選択し、作成したユーザーフォームを呼び出します。それから「実行ボタン」をダブルクリックしてください。

 VBA実行ボタンにマクロを設定

 すると、

 Private Sub CommandButton1_Click()

 End Sub

というコードだけ書かれた画面が現れます。ここに、コマンドボタンが押されたときに動作するマクロを書くことになります。y = x^2 を計算するマクロを作成してみましょう。

Private Sub CommandButton1_Click()

  Dim x As Double, y As Double

  x = xtxt.Text
  y = x ^ 2

  ytxt.Text = y

End Sub

 実行ボタンを押すとテキストボックスに入力された x の値から y = x^2 を計算してテキストボックスに出力します。書き方はサブルーチンとほとんど同じです。先ほど、2つのテキストボックスの [オブジェクト名] を「 xtxt 」、「 ytxt 」と設定しましたので、

x = xtxt.Text

と記述して、xtxt オブジェクトから Text プロパティで入力されたテキストの内容を取得しています。それから

y = x ^ 2

で x の2乗を計算し、

ytxt.Text = y

という記述でテキストボックスに y の値を入れます。
 
 再びユーザーフォームの設定画面に戻って [F5] キーを押してみましょう。するとユーザーフォームが現れるので、x の値を適当に入力して実行ボタンを押してみてください。

 VBAユーザーフォームの動作確認

 たとえば「 10 」と入力すると「 100 」と表示されるはずです。最後にもう1つだけ作業が残っています。それは「ユーザーフォームを呼び出すマクロ」を用意することです。これはたった3行書くだけで終わりです。

Sub Call_UserForm()
  UserForm1.Show (vbModeless)
End Sub

 Show メソッドで UserForm1 を表示させています。( )の中の vbModeless は「モードレス状態」のことで、このように設定しておくと、ユーザーフォームが表示されているときもワークシートを操作することができます。( )を省略すると「モーダル状態」、すなわちフォーム以外の操作はできなくなります。その時々で使い分けるようにしてください。

【次の記事】≫ テキストボタン、ラベル、コマンドボタンの配置

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