■ UserForm(ユーザーフォーム)を利用しよう
ExcelVBAの開発で、避けて通れないのがUserForm(ユーザーフォーム)の利用です。
Excelにはワークシートがあるため、ワークシートを入力フォーム代りに使用することも可能です。しかし、本格的なVBAアプリケーションを構築する場合、ワークシートの入力では限界があります。
ユーザーフォームのもつ、膨大なイベント処理、そして各コントロールのもつ多彩なメソッドとプロパティ。Excelのユーザーフォームは、VBのフォームに引けを取らない機能と拡張性を持っています。
今回から数回にわたって、ExcelVBAからユーザーフォームを利用する方法を解説したいと思います。入門編でも、ほんの少しユーザーフォームについて触れましたが、実際のアプリケーション開発には全然不足しています。
ここでは、各コントロールの機能を詳細にサンプルを用いて説明していきます。ぜひ、あなたのアプリケーション開発にお役立てください。
※ なおクラスモジュールを用いたコントロール配列については、ここではふれません。
■UserFormユーザーフォームの表示
ユーザーフォームの追加の仕方は、入門編を参考にしてください。
標準モジュールのプロシージャより"ユーザーフォーム名.Show"の形式で呼び出します。
(例)
UserForm1.Show
この例ではオブジェクト名"UserForm1"のフォームを表示させます。 |
■UserFormユーザーフォームを閉じる
ユーザーフォームを閉じるには、ユーザーフォーム右上の「X」ボタン押下でもよいですが、終了用のCommandButtonコントロールのClickイベントに終了処理を記述しても、終了できます。
(例)
Private Sub CommandButton1_Click()
Unload Me
End Sub
この例ではCommandButton1コントロールをクリックすると、自身のフォームを閉じます。 |
※ ここで、気をつけてほしいのが「Show」で呼び出しているのに「Unload」していることです。
実は、Showメソッドで呼び出したとき、UserForm1は自動的にメモリ上に「Load」されています。Unloadステートメントでメモリ上から削除する際には当然、画面上からも消えます。ですので「Hide」する必要がないのです。
(例)
Load UserForm1 'この時点で、UserForm1のインスタンスがメモリに読み込まれました。
UserForm1.Show 'この時点で、UserForm1が表示されました。
UserForm1.Hide 'この時点で、UserForm1が非表示になりました。
Unload UserForm1 'この時点で、UserForm1のインスタンスがメモリから解放されました。
この例では、UserForm1をメモリに読み込み、表示したのち、非表示にし、メモリから削除しています。
※ UserForm_Initializeイベントは、UserFormをロードした時点で実行されます。 |
■UserFormオブジェクトの表示方法
Showメソッドには引数があります。省略すると既定値である1-vbModalが適用され、モーダルでUserFormを表示します。0-vbModelessを指定すると、モードレスでUserFormを表示し、ワークシートの編集などが行えます。
モードレスで表示させた場合、モーダルと違ってコードの実行がShowメソッドのところで中断されずに、継続して実行されてしまいますので注意が必要です。これを回避するには、グローバル変数でUserFormの終了時にTRUEを返すようなBoolean型の変数を作成します。Showメソッド直下にDo〜Loopでループ処理をし、UserForm終了まで処理をウェイトさせることができます。
(例)
' モジュール宣言部に記述ここから −−−−−−−−−−−−−−−−−−−−−−−−−−
Public MyBln As Boolean
' モジュール宣言部に記述ここまで −−−−−−−−−−−−−−−−−−−−−−−−−−
' 標準モジュールに記述ここから −−−−−−−−−−−−−−−−−−−−−−−−−−−
Sub test()
MyBln = False
UserForm1.Show vbModeless
Do
DoEvents
Loop Until MyBln
MsgBox "UserForm1 Ended"
End Sub
' 標準モジュールに記述ここまで −−−−−−−−−−−−−−−−−−−−−−−−−−−
' フォームモジュールに記述ここから −−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub UserForm_Terminate()
MyBln = True
End Sub
' フォームモジュールに記述ここまで −−−−−−−−−−−−−−−−−−−−−−−−−
この例では、UserForm1をモードレスで表示させた後、Do〜Loopでループ処理を繰り返します。UserForm1を終了させた時点で、グローバル変数のMyBlnにTrueが返り、ループ処理を抜け、"UserForm1 Ended"のメッセージを表示します。
※ Excel97では、ユーザーフォームをモードレスで表示することはできません。 |
■UserFormユーザーフォームを印刷する
PrintFormメソッドを使用します。ユーザーフォームオブジェクトに表示している全てのオブジェクトのイメージをプリンタに送ります。
(例)
Private Sub UserForm_Click()
UserForm1.PrintForm
End Sub
この例では、UserForm1をClickすると、表示しているUserForm1のイメージをビット単位でプリンタより出力します。 |
■UserFormユーザーフォームとは異なるもの
Excelには、ユーザーフォームとよく似たダイアログシートというものがあります。ワークシートのタブを右クリックしたとき表示されるメニューの挿入(I)を選択すると、「MS Excel 5.0 ダイアログ」を選択して挿入することができます。
ダイアログシートはVBAから操作することも可能ですが、オブジェクト変数を設定したり扱いが結構面倒です。イベント処理もなく、表現力もユーザーフォームに劣るため、ダイアログシートを使用するメリットは特にありません。また、この講座でも特に取扱いません。
古いブックとの互換性のためだけに存在しているような機能ですが、もしダイアログシートを使用している場合はできる限りユーザーフォームに置換していくことをおすすめします。
次回から、ユーザーフォーム上に配置される各コントロールオブジェクトについて、より詳しく解説していきたいと思います。
|