- 「ユーザーフォームを作ってみたけど、毎回コンボボックスのリストを手で選ぶのが面倒…」
- 「フォームを閉じたとき、最後に気の利いたメッセージが出せたらカッコいいのに。」
そんな風に思ったことはありませんか?
実は私も初心者の頃、フォームを開くたびに手動で日付を入力していて、「プログラミングしてるのになんでこんなにアナログなんだ」と感じたことがあります。
こうした「運用上のちょっとした不便」を解決するのが、VBAフォームに用意されている『Initialize(初期化)』と『Terminate(終了時)』という2つの重要なイベントになります。
Initialize(初期化)は「おもてなしの準備」
UserForm_Initializeは、オブジェクトとしてフォームがメモリに読み込まれた瞬間に自動で実行される処理になります。
例えるなら、「来客がある前に、会議室のテーブルを完璧に整頓し、必要な資料を並べておく準備」のようなイメージになります。
このイベント内にコードを記述しておくことで、画面が表示された瞬間に「今日の日付」を既定値として入力したり、「マスターの選択肢リスト」を自動で読み込ませたりすることが可能になります。
Terminate(終了時)は「最後のお片付け」
一方で、Terminate(終了時)は「処理を安全に終わらせるための最後のお片付け」を担当します。UserForm_Terminateは、ユーザーによってフォームが閉じられ、メモリから完全に消去される直前に実行されるイベントになります。
こちらは「イベントが終了した後の、忘れ物チェックや戸締まり」に相当する重要なステップになります。処理中に開いていた外部ファイルを安全に閉じたり、使用したオブジェクト変数を解放したり、あるいは「データの保存はお済みですか?」といった最終確認の注意喚起を行うために活用されます。
最後までユーザーの操作に寄り添い、システムの予期せぬエラーを防ぐ真摯な設計には、欠かせない処理となります。
今すぐ試せる!実践サンプルコード
今回は、フォームが立ち上がる際に「部署リスト」を自動セットし、閉じる際には「終了確認」を促す仕組みを構築してみましょう。
' --- フォームが開く時に自動で動く ---
Private Sub UserForm_Initialize()
' コンボボックス(ComboBox1)に部署名を追加します
With Me.ComboBox1
.AddItem "営業部"
.AddItem "総務部"
.AddItem "IT推進部"
End With
' テキストボックス(TextBox1)に今日の日付を自動入力
' これで「今日何日だっけ?」と考える必要がなくなります
Me.TextBox1.Value = Date
MsgBox "準備が整いました!入力をお願いします。", vbInformation, "入力画面"
End Sub
' --- フォームが閉じる時に自動で動く ---
Private Sub UserForm_Terminate()
MsgBox "データの登録漏れはありませんか?お疲れ様でした!", vbInformation, "終了確認"
' ※ここで変数やオブジェクトの解放を行うと、PCの動作が重くなるのを防げます
End Sub
エラーを防ぐ!「初期化」と「終了処理」の重要性
なぜ「初期化」と「終了処理」がそれほど重要なのでしょうか?
もし初期化の処理を怠ってしまうと、前に使ったデータや中途半端な値がフォームに残ったまま次の操作が始まってしまう原因になります。
その結果、意図しないデータが誤って上書き登録されてしまい、最終的なデータ集計の整合性が失われるリスクが生じることもあります。
また、「画面は消えているのに、実はExcelの裏側でフォームが起動したままメモリを消費していた」というバグも、Terminateイベントで適切に制御することで防ぐことができます。
そのため、単に「開発者のPCで正しく動く」だけでなく、「誰がどのような操作をしても間違えようがない設計にする」ことが大切です。
ユーザーの利便性を高め、エラーに強いシステム作りの第一歩として、ぜひ今回のイベントを活用してみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント