ThisWorkbookに書くべき処理とは?VBAプロジェクトの正しい構成方法
生徒
「VBAの編集画面にある『ThisWorkbook』って、結局何のためにあるんですか?全部ここに書いちゃダメなんですか?」
先生
「実はそこ、ブック全体を見守る『管理人室』のような場所なんです。何でも書いてしまうと、後でどこに何があるか分からなくなってしまいますよ。」
生徒
「管理人室……。じゃあ、ここに書くべきことと、書かないほうがいいことの区別はどうつければいいんですか?」
先生
「判断の基準は『ブック全体の出来事に関わるかどうか』です。初心者の方でも迷わないように、具体的な例を出しながら解説しますね!」
1. ThisWorkbookの正体とは?
Excel VBAの世界では、開いているExcelファイル自体のことを「ブック(Workbook)」と呼びます。そして、そのファイル全体に関連する命令を書き込むための特別な場所が「ThisWorkbook」です。
プログラミングを全くやったことがない方でも、学校やマンションをイメージしてみてください。各教室(シート)で起きる細かいことではなく、「学校全体が開門したとき(ファイルを開いたとき)」や「学校が閉まるとき(ファイルを閉じるとき)」などの、全体行事を管理するのがこの場所の役割です。プロジェクト構成を考える上で、この場所の役割を理解することは、整理整頓された使いやすいマクロを作るための第一歩となります。
2. ここに書くべき処理:ブックの「イベント」
ThisWorkbookに書くべき処理の代表格は、Excelファイルに対して「何かが起きたとき」に自動で動き出すプログラムです。これを専門用語でイベント処理と呼びます。例えば、以下のような処理はThisWorkbookに書くのが正解です。
- Workbook_Open:ファイルを開いた瞬間に実行する(挨拶を出す、初期設定をするなど)
- Workbook_BeforeClose:ファイルを閉じる直前に実行する(入力漏れがないかチェックするなど)
- Workbook_BeforeSave:上書き保存する前に実行する(特定のセルの値をリセットするなど)
これらは「ファイル全体」に対する動作なので、特定のシート専用の場所に書くのではなく、ファイル全体の管理人であるThisWorkbookに任せるのがルールです。
' ファイルを開いたときに自動で挨拶を表示する例
Private Sub Workbook_Open()
MsgBox "ファイルが開かれました。最新のデータを入力してください。"
End Sub
3. 逆に書いてはいけない処理:一般的な「マクロ」
初心者の方がよくやってしまうのが、「計算をする」「データをコピーする」といった一般的なマクロをすべてThisWorkbookに書いてしまうことです。これは避けるべきです。
なぜなら、ThisWorkbookに書いたマクロは、Excelの「マクロ一覧(マクロの実行ボタン)」から見えにくかったり、他のプログラムから呼び出すのが少し面倒だったりするからです。計算や表の加工といった「作業」に関する命令は、標準モジュールという「作業部屋」に書くのがベストプラクティスです。管理人室でバリバリと事務作業(計算)をするのではなく、作業は作業部屋に任せましょう。
4. 判断基準は「きっかけ」がどこにあるか
「ThisWorkbookに書くべきか迷ったとき」の最強の判断基準は、そのプログラムが動き出す「きっかけ」は何か?を考えることです。以下の表を参考にしてみてください。
| きっかけ(イベント) | 書くべき場所 |
|---|---|
| ファイルを開く・閉じる・保存する | ThisWorkbook |
| 特定のシートのセルが変更された | シートモジュール |
| 実行ボタンを押して動かしたい | 標準モジュール |
| 複数の場所で何度も使う計算式 | 標準モジュール |
5. 実践!保存前に自動で日付を入力する
実際の活用例を見てみましょう。ファイルを保存するたびに、特定のセルに「最終更新日」を自動で入れたい場合があります。これは「保存」というブック全体のイベントなので、ThisWorkbookに記述します。
' 保存する直前に自動的に動くプログラム
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' Sheet1のA1セルに今日の日付を入れる
Sheets("Sheet1").Range("A1").Value = Date
MsgBox "更新日を記録して保存します。"
End Sub
このように、「ユーザーが意識しなくても勝手に動いてほしい全体ルール」を組み込むのがThisWorkbookの正しい使い方です。パソコンを触ったことがない方でも、このように自動化の仕組みを作ると、「VBAってすごい!」と実感できるはずです。
6. ThisWorkbookをスッキリ保つテクニック
ThisWorkbookにはイベント処理を書きますが、中身が何百行も長くなってしまうのは「整理整頓」の観点から良くありません。管理人室が書類で溢れかえっているようなものです。そこで、「呼び出し」だけを書くというテクニックを使いましょう。
実際の複雑な中身は標準モジュールに書いておき、ThisWorkbookからは「あっちの作業をやって!」と命令を飛ばすだけにするのです。これを専門用語でCall(コール)と呼びます。
' ThisWorkbookにはこれだけ書く
Private Sub Workbook_Open()
' 標準モジュールにある「初期設定」というマクロを呼ぶ
Call InitialSetting
End Sub
こうすることで、ThisWorkbookは常にスッキリとした状態に保たれ、プロジェクト全体の保守性(メンテナンスのしやすさ)が劇的に向上します。
7. 共有マクロや設定値の管理について
もし、あなたの作ったマクロを他の人も使う場合、ThisWorkbookに色々な設定を詰め込みすぎると、他の人が混乱してしまいます。例えば、「保存先フォルダのアドレス」や「消費税率」といった設定値をThisWorkbookの中にバラバラに書くのはやめましょう。
そういった「設定情報」は、専用の定数や、あるいはExcelのシート上に「設定シート」を作って管理するのが一般的です。ThisWorkbookはあくまで「タイミングを計る場所」に徹し、データ管理や複雑なロジックは別の場所に持たせる。この役割分担こそが、初心者が中級者へステップアップするための重要な考え方です。
8. エラーを未然に防ぐための注意点
ThisWorkbookに処理を書く際、特に注意が必要なのが「対象のシートが存在しない」などのエラーです。例えば、ファイルを開いたときに Sheet1 を操作するマクロを書いたとします。もし誰かがそのシートの名前を変えてしまっていたら、プログラムは止まってしまいます。
こうしたエラーを防ぐために、ThisWorkbookに書く処理はできるだけ「どの環境でも動く安全なもの」にするか、エラーが起きても大丈夫なように対策を施す必要があります。最初は難しいかもしれませんが、「ここは大事な場所だから、壊れにくい命令を書こう」という意識を持つだけで、プロジェクトの質は大きく変わります。
9. 実行結果のイメージを確認しよう
実際にThisWorkbookを正しく活用すると、Excelの使い勝手はどう変わるでしょうか。実行結果のイメージをまとめてみました。
【正しく設定できている場合】
1. ファイルをダブルクリックして開く
2. 「おはようございます!」と挨拶が出る(Workbook_Open)
3. データを入力して保存ボタンを押す
4. 「管理台帳に記録しました」と表示される(Workbook_BeforeSave)
【悪い例(標準モジュールに書くべきことをここに書いた場合)】
1. 「マクロ実行」画面を開く
2. マクロ名が出てこない、またはたくさんありすぎてどれが全体用か不明
3. ファイルを閉じるときにエラーが出てExcelが固まる
いかがでしょうか。正しい場所にコードを書くだけで、Excelがまるで生きているかのようにスムーズに動作してくれます。まずは「Workbook_Open」を使って、自分に挨拶するだけの簡単なマクロから試してみてください。それだけで、あなたはもう立派なVBA開発者の仲間入りです!