Microsoft VBAにおけるユーザーフォーム (UserForm)は、カスタマイズ可能なユーザーインターフェース (UI) を作成するための強力なツールです。本記事では、基本的な使い方からVBAと併せた実用的なコーディングまで、テキストボックスやリストボックスなどを例に紹介します。
結論
VBA上でのユーザーフォーム操作は下記のステップで実行可能です。詳しい解説については各セクションで行っています。
(クリックで該当セクションにジャンプします)
- ステップ1
- ステップ2
- ステップ3
- ステップ4
ユーザーフォームの作成
はじめに、VBAでユーザーフォームを作成する方法をご紹介します。
- VBAエディタの表示:
ExcelやWordなどのMicrosoft OfficeアプリケーションでAlt + F11キーを押すとVBAエディタが開きます。これはVBAの開発環境で、ここでプログラムの編集やデバッグを行います。 - ユーザーフォームの追加:
VBAエディタのメニューバーで[挿入]→[ユーザーフォーム]を選択します。これにより、新しいユーザーフォームがプロジェクトに追加され、デザイン画面が表示されます。
以上がユーザーフォームを作成する方法になります。ここで作成したユーザーフォームはVBAプロジェクト内に保存され、VBAコードから呼び出すことができるようになります。次のセクションでは、ユーザーフォームのカスタマイズ方法を解説します。
ユーザーフォームのカスタマイズ
こちらのセクションでは、作成したユーザーフォームのデザインや設定をカスタマイズする方法をご紹介します。ユーザーフォームの基本的な動作は下記を覚えておけば十分でしょう。
コントロールオブジェクトの追加
左のツールボックスからボタン、テキストボックス、ラベル、コンボボックスなどのコントロールをフォームにドラッグ&ドロップして追加できます。
コントロールのサイズ変更
コントロールオブジェクト及びユーザーフォーム自体のサイズを変更する場合は、オブジェクトの端をドラッグすることで任意の大きさに調整できます。薄い網掛けで表示されている部分までが各コントロールオブジェクトのサイズになりますので、デザインの際には気をつけてください。
プロパティの編集 (表示名やフォントなど)
UserForm自体または各オブジェクトのプロパティ(表示名やフォントなど)を編集する場合、プロパティウィンドウから編集することができます。
以下はよく使用するプロパティとその編集方法を示しています。
- (オブジェクト名): VBAでのコードなどで参照されるオブジェクトの名前となります。
{オブジェクト名}_Click()
などのイベントハンドラもこのオブジェクト名を使用して実行されるので変更の際は注意してください - Caption: オブジェクトの表示名を編集します。ボタンではラベル、UserFormでは左上に表示されるテキストになります
- Default: Trueに設定するとEnterキーを押した際のデフォルトアクションとして実行されるボタンなどとして設定できます
VBAからユーザーフォームへのアクセス
本セクションでは、ユーザーフォーム側での設定を完了させた後に、通常のVBA (関数・モジュール・クラス) を使用してユーザーフォームにアクセスし、フォームを表示したりフォーム上のアイテムを操作したりする方法について説明します。
ユーザーフォームの表示
VBAコードからユーザーフォームを表示するには、Show メソッドを使用します。
Sub ShowUserForm()
UserForm1.Show() ' UserForm1を表示
End Sub
このコードは、UserForm1 という名前のフォームを表示します。フォームの名前は、作成したユーザーフォームの名前に応じて変更してください。
ユーザーフォーム内のコントロールへのアクセス
フォーム内の各コントロール(テキストボックス、ラベル、ボタンなど)にアクセスして、そのプロパティを変更したり、値を取得したりすることができます。
例えば、テキストボックスにテキストを設定する場合は以下のようにします。
Sub ShowUserFormWithText()
UserForm1.TextBox1.Text = "Hello, World!" ' テキストボックスの入力値を設定
UserForm1.Show()
End Sub
このコードは、UserForm1 上の TextBox1 という名前のテキストボックスに文字列 “Hello, World!” を設定しています。その後、UseFormを表示しています。
また、コントロールのプロパティ (例えば、コントロールの可視性、色、フォントなど) もVBAコードから変更することができます。
下記のコードでは先程から、TextBox1の背景を赤色にするよう追記しています。
Sub ShowUserFormWithText()
UserForm1.TextBox1.Text = "Hello, World!"
UserForm1.TextBox1.BackColor = RGB(255, 0, 0) 'テキストボックスの背景を赤く
UserForm1.Show()
End Sub
ユーザーフォームのクローズ
ユーザーフォームをプログラム的に閉じるには、Hide メソッドまたは Unload ステートメントを使用します。
UserForm1.Hide
または
Unload UserForm1
上記2つのアプローチの違いは下記のとおりです。
- Hide メソッド: フォームを見た目上隠すだけで、フォームとその状態はメモリに残ります。
- Unload ステートメント: フォームをメモリから完全に削除します。
以上が、VBAからユーザーフォームにアクセスする方法解説になります。
ユーザーフォームからVBAへのアクセス
最後に、ユーザーフォームから通常のモジュールやクラス、関数へのアクセスについて解説します。
前提: なお、UserForm側でのコードの使用 (イベントハンドラなどの記述) はUserFormを右クリックし、[コードの表示]から行ってください。
イベントハンドラの使用
イベントハンドラは、ユーザーフォーム上のコントロール(例えばボタンやテキストボックス)に対する特定のイベント(例えばクリックやテキスト変更)が発生したときに実行されるプロシージャです。ここではボタンクリックイベントの例をご紹介します。
Private Sub CommandButton1_Click()
MsgBox "ボタンがクリックされました" ' ボタンのクリック時にメッセージを表示
End Sub
モジュールや関数の呼び出し
ユーザーフォームのイベントハンドラからモジュール内のサブルーチンや関数を呼び出すことができます。これにより、コードの再利用性が高まり、モジュール化されたロジックを使いまわすことが可能です。
例えば、Module1内に次のようなサブルーチンがあるとします。
Sub GreetUser()
MsgBox "こんにちは、ユーザー!"
End Sub
このサブルーチンはユーザーフォームのイベントハンドラから次のように呼び出せます。
Private Sub CommandButton1_Click()
' Module1のGreetUserサブルーチンを呼び出す
Module1.GreetUser
End Sub
データの授受
最後に、イベントハンドラから通常のモジュールやクラス、関数を呼び出す際に、UserForm上の値を受け渡す方法を解説します。ユーザーフォームとモジュール間でデータの授受を行うには、モジュールの関数やサブルーチンに引数を渡すか、モジュールから公開された変数やプロパティを利用します。ここではTextBox1の内容をモジュールのサブルーチンに渡し、処理する例を紹介します。
先程のコードを調整して、モジュール内のGreetUser
が引数を受け取るようにします。
Sub GreetUser(ByVal text As String)
MsgBox "こんにちは、" & text & "!"
End Sub
次に、UserForm内のイベントハンドラが実行時にTextBox1の値を受け渡すようにします。
Private Sub CommandButton1_Click()
' Module1のGreetUserサブルーチンを呼び出す
Module1.GreetUser TextBox1.Text
End Sub
おわりに
以上が、VBAでテキストやリストなどのユーザーフォームでUIをつける方法の解説になります。
ご質問やご不明点がある場合はお気軽にコメントお待ちしております。
ご精読いただきありがとうございました。
コメント