はじめに
VBAで本格的なツールを作成する際、ユーザーフォームを使って対話的な操作画面を作ることがよくあります。その際、「フォーム上のボタンをクリックしたら、標準モジュールに書いてあるメインの処理を実行したい」という場面は必ず出てきます。
ユーザーフォームのコードと、メイン処理のコードをきちんと分離することで、プログラムの見通しが良くなり、メンテナンスもしやすくなります。
この記事では、ユーザーフォームに配置したコマンドボタンをクリックした際に、標準モジュールに記述されたマクロを呼び出すための基本的な方法を、具体的な手順を追って分かりやすく解説します。
全体像と作成手順
今回作成するものの全体像は以下の通りです。
- 標準モジュール: メインの処理を行うマクロ(例:
ProcessData
)を記述します。 - ユーザーフォーム: ツールの日操作画面となるフォームを作成し、「実行」ボタンを配置します。
- フォームのコード: 「実行」ボタンがクリックされたら、標準モジュールの
ProcessData
マクロを呼び出すコードを記述します。 - フォームの表示: 作成したユーザーフォームを表示するためのマクロを、別の標準モジュールに記述します。
VBAサンプルコード
手順1: メイン処理マクロを作成(標準モジュール)
まず、Module1
などの標準モジュールに、実行したいメインのマクロを記述します。ここでは、アクティブセルに現在の日時を入力するという簡単な処理を例にします。
【標準モジュール: Module1
】
' フォームから呼び出されるメインの処理
Sub ProcessData()
' アクティブセルに現在の日時を入力
ActiveCell.Value = "処理実行日時: " & Now()
MsgBox "処理が完了しました。"
End Sub
' ユーザーフォームを表示するためのマクロ
Sub ShowMainForm()
' MainForm をモードレスで表示
MainForm.Show vbModeless
End Sub
手順2: ユーザーフォームを作成
VBEで「挿入」→「ユーザーフォーム」を選択し、新しいフォームを作成します。プロパティウィンドウで、フォームの (Name)
を MainForm
に変更します。
次に、ツールボックスから「コマンドボタン」をフォーム上にドラッグ&ドロップで配置します。ボタンのプロパティを以下のように設定します。
- (Name):
ExecuteButton
- Caption:
処理実行
手順3: ボタンのクリックイベントを記述(ユーザーフォーム)
作成した「処理実行」ボタンをダブルクリックして、フォームのコードウィンドウを表示させます。そして、ボタンがクリックされたときに Module1
の ProcessData
を呼び出すコードを記述します。
【ユーザーフォーム: MainForm
】
' 「処理実行」ボタン(ExecuteButton)がクリックされたときの処理
Private Sub ExecuteButton_Click()
' Module1に記述されたProcessDataマクロを呼び出す
Call Module1.ProcessData
End Sub
コードの解説と実行方法
Call Module1.ProcessData
この一行が、フォームから標準モジュールのマクロを呼び出すための中心的な命令です。
Call
: 他のプロシージャ(マクロ)を呼び出すためのキーワードです(省略可能ですが、明示すると分かりやすいです)。Module1.
: どのモジュールに書かれているマクロかを指定します。これにより、同じ名前のマクロが複数のモジュールにあっても、正確に呼び分けることができます。ProcessData
: 呼び出したいマクロの名前です。
MainForm.Show vbModeless
作成したユーザーフォーム(MainForm
)を表示するための命令です。
vbModeless
: この引数を指定すると、フォームを表示したままでも、Excelのシートを操作できる「モードレス」状態でフォームが開きます。もしフォームを閉じないとシート操作ができない「モーダル」状態で開きたい場合は、vbModal
を指定するか、引数を省略します。
実行方法
- 標準モジュールに記述した
ShowMainForm
マクロを実行します。 MainForm
が表示されます。- Excelシートのどこかのセルを選択(アクティブに)します。
- フォーム上の「処理実行」ボタンをクリックします。
- 選択したセルに日時が入力され、「処理が完了しました。」というメッセージボックスが表示されれば成功です。
まとめ
今回は、VBAのユーザーフォームから標準モジュールのマクロを呼び出す、基本的かつ非常に重要な方法を解説しました。
- ボタンのクリックイベント内に
Call モジュール名.マクロ名
と記述する。 - フォームと処理を分離することで、構造化された分かりやすいプログラムになる。
フォーム名.Show
でフォームを表示し、引数でモーダル/モードレスを切り替える。
この基本構造をマスターすれば、より複雑でインタラクティブなVBAツールを作成するための第一歩となります。ぜひ、ご自身のツール開発にご活用ください。