ユーザーフォームの起動と終了
準備編に続き、本編に入っていきます。
ここでは、少しづつ使うアイテム(コントロール)を増やしながら解説していきます。
今回はユーザーフォーム(土台)についてです。
ユーザーフォームだけ出しても、テキストボックスやボタンが無ければ無意味なものです。
ただメッセージボックス(MsgBox)と違い、ユーザーフォームの挙動に関してもプログラマーが面倒を見なければなりません。
具体的には、
「ユーザーフォームを開け」
「初期設定はこうしろ!」
「ボタンが押されたらこうしろ!」
などです。
ExcelVBAに限らず、Windowsのプログラムでは、「こうしたら」「こうしろ」という方式でプログラムを書いていきます。「こうしたら」の部分がイベントと呼ばれ、「ウインドウを開いた時」「閉じる前」など様々なイベントが決まっています。そのイベントごとにVBAではプロシージャが用意されているので、そこに「こうしろ」の部分のプログラムを書いていくことになります。
逆を言えばイベントのプロシージャ内に何も書かなければ、何も起こりません。
ユーザーフォームを使わないプログラムでは、標準モジュールにプログラムを書いておいて、それをボタンに登録するような形でプログラムを書いてきたと思います。
実はこれも「ボタンがクリックされたら」というイベントに自作のプロシージャをあてはめていたことになります。
当然ですが、自作のプロシージャを書いてもボタンに登録しなければ、実行はできませんね。プログラムには必ずそれを呼び出すきっかけが必要になります。そのきっかけがイベントという事になります。
どんなイベントがあるのか?
では、ユーザーフォームやコントロールにどのようなイベントがあるのか確認する方法を示します。
プロジェクトウインドウで、UserForm1を選択してください。

選択したら、右のドロップボックスからイベントを選択する事が出来るようになります。

このようにVBEの右側(コードを書く部分)の上部に2カ所のドロップボックスがあり、右側でオブジェクトを選ぶとそれに対するイベント(プロシージャ)を選ぶ事ができるようになっています。
ただ全てを覚える必要はなく、よく使うイベントというのは決まっています。
ユーザーフォームオブジェクトですと Initialize 以外はあまり使いません。
Initializeはユーザーフォームが開いてすぐに実行されることになっていて、ここに他のコントロールや変数などの初期化処理を行います。
実際の動作を試してみる
ではオブジェクトを配置するところから解説します。
1.オブジェクトウインドウから、右クリック>「挿入」から「ユーザーフォーム」と「標準モジュール」を追加します。

標準モジュールはユーザーフォームを呼び出すために使います。
2.UserForm1をクリックしてください。
画面にユーザーフォームが表示されていれば、コード画面に「F7」を押して切り替えます。
VBEの右側のコードウインドウの上にある右のドロップボックスでUserForm1を選択します。
すると勝手に「Private Sub UserForm_Click()」が追加されると思います。
普段なら削除するのですが、今回は試しに使ってみることにしましょう。
Private Sub UserForm_Click()
MsgBox "フォームがクリックされました。"
End Sub
3.Initializeを追加します。
同じく右側のドロップボックスから「Initialize」を選択すると追加されます。
今回は動作を確認したいだけなので、メッセージボックスを表示させてみます。
以下のようにプログラムを書いてください。
Private Sub UserForm_Initialize()
MsgBox "初期設定をします。"
End Sub
4.ユーザーフォームを表示する方法
UserForm1の書くコードは、ユーザーフォームに対する処理になりますが、実際に起動させるには、外から行うことになります。
Module1に書くことにしましょう。
UserForm1オブジェクトのShowメソッドで開くことができます。
Module1をクリックしてコードウインドウに以下のようなテストコードを書きます。
’/// Module1 に書きます///
Sub test()
UserForm1.Show
End Sub
5.実行して動作確認
test()の内部にカーソルを置いて、F5 を押して実行できます。
最初に「初期設定をします」というメッセージボックスが出た後に、ユーザーフォームが表示されたと思います。 このことから、UserForm1が表示される前に UserForm_Initialize() が実行されたのがわかります。
今度は、ユーザーフォーム内をクリックしてみましょう。
「クリックされました」と表示されたと思います。
ユーザーフォーム内をクリックするタイミングでは、UserForm_Click()が実行されます。
ユーザーフォームを閉じるコードは書いていませんので×印で終了しましょう。
6.ユーザーフォームを閉じる処理を追加
ユーザーフォームの起動は外から行いましたが、閉じる処理はユーザーフォームオブジェクト内に書きます。なぜなら、UserForm1が終了するまでExcelシートを操作できないようになっているからです。
試しにユーザーフォームが開いた状態で、Excelを操作してみてください。処理を受け付けません。このような状態をModalといいます。ユーザーフォームが表示されていてもExcelを操作できるようにすることもできます。これをModelessと言います。
初期値はModalですので何も書かなければModalになります。
では先ほどの UserForm_Click() にユーザーフォームを閉じる処理を書いてみます。
閉じるには、Unload Me または、Unload UserForm1 とすればOKです。
これは自分自身を終了しろという意味になります。
Private Sub UserForm_Click()
MsgBox "クリックされました。"
Unload Me 'または、Unload UserForm1
End Sub
フォーム内をクリックすると、「クリックされました。」とメッセージが出てフォームが終了します。
まとめ
今回は、ユーザーフォームを出して終了するまでを解説しました。最初はイベントというものが理解しずらいかもしれません。
イベントは沢山ありますが、使わないものは相手にする必要はなく、勝手に書き込まれた UserForm_Click() なども中に何も処理を書かなければ、何も起こりません。
よく使うイベントは限られていますので、それらを扱ううちに慣れてくると思います。
次回も単純な例を挙げてユーザーフォームのプログラムに慣れていきましょう。
ユーザーフォームの使い方
・ユーザーフォームのプログラミング(準備編)
・ユーザーフォーム 第1回(起動と終了)
・ユーザーフォーム 第2回(ボタン)
・ユーザーフォーム 第3回(ラベル)
・ユーザーフォーム 第4回(テキストボックス)
・ユーザーフォーム 第5回(モーダル・モードレス)
・ユーザーフォーム 第6回(チェックボックス)
・ユーザーフォーム 第7回(オプションボタン)
・ユーザーフォーム 第8回(コンボボックス)
・ユーザーフォーム 第9回(リストボックス)
・ユーザーフォーム 第10回(リストボックス複数選択)
・ユーザーフォーム 第11回(タブストップ)
・ユーザーフォーム 第12回(スピンボタン)