VBAのマクロには「自分で操作して動かす手動実行」と「特定のタイミングで自動的に動くイベント実行」の2種類があります。どちらをいつ使うかを理解しておくだけで、「クリックしたら動く」「開いたら動く」「保存前に動く」など、業務フローに合わせた自動化が実現できます。
この記事では、次の内容を順番に解説します。
- 手動実行の3つの方法(VBE・マクロ一覧・ボタン)
- 自動実行(イベント)の主要な種類と記述場所
- よく使うイベントのコード例
- 手動・自動それぞれの使い分けの基準
手動実行の方法を知るには?
手動実行は「自分で操作してマクロを動かす」方法です。主に3つのやり方があります。
| 方法 | 操作 | 向いている場面 |
|---|---|---|
| VBEから実行 | Alt+F11でVBEを開き、マクロ内にカーソルを置いてF5を押す | 開発・テスト中 |
| マクロ一覧から実行 | Alt+F8でマクロ一覧を開き、対象マクロを選んで「実行」を押す | シンプルな実行確認 |
| シートのボタンから実行 | シートにボタンを配置してマクロを割り当てる | 誰でも使える運用ツール |
'手動実行の例:A1セルに今日の日付を入力するマクロ
Sub AddDate()
Range("A1").Value = Date
MsgBox "今日の日付を入力しました:" & Date
End Sub
自動実行(イベント)の仕組みを理解するには?
自動実行はExcelの「イベント」と呼ばれる仕組みを使います。「ファイルを開いた」「セルを変更した」「シートを切り替えた」などのタイミングに処理を紐づけます。
重要:イベントマクロは標準モジュールではなく、専用のモジュールに書きます。
| イベントの場所 | 書く場所(VBE) | 主なイベント |
|---|---|---|
| ブック全体に関するイベント | ThisWorkbook モジュール | Workbook_Open・BeforeSave・BeforeClose |
| 特定シートに関するイベント | 対象のシートモジュール(Sheet1など) | Worksheet_Change・Activate・SelectionChange |
よく使うイベントのコードを知るには?
実務でよく使うイベントと具体的なコード例を紹介します。
ブックを開いたときに実行(Workbook_Open):
'ThisWorkbookモジュールに記述する
Private Sub Workbook_Open()
MsgBox "ファイルが開かれました。最終更新日を確認してください。"
End Sub
ブックを保存する前に実行(Workbook_BeforeSave):
'ThisWorkbookモジュールに記述する
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'保存前にA1セルに保存日時を記録する
Worksheets("ログ").Range("A1").Value = "最終保存:" & Format(Now, "yyyy/mm/dd hh:mm")
End Sub
ブックを閉じる前に実行(Workbook_BeforeClose):
'ThisWorkbookモジュールに記述する
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim answer As Integer
answer = MsgBox("閉じる前にバックアップを保存しますか?", vbYesNo)
If answer = vbYes Then
ThisWorkbook.SaveCopyAs "C:¥Backup¥backup_" & Format(Now, "yyyymmdd_hhmmss") & ".xlsm"
End If
End Sub
セルを変更したときに実行(Worksheet_Change):
'シートモジュール(Sheet1など)に記述する
Private Sub Worksheet_Change(ByVal Target As Range)
'B列が変更されたときだけ処理する
If Not Intersect(Target, Range("B:B")) Is Nothing Then
Application.EnableEvents = False
Target.Font.Bold = True '変更されたセルを太字にする
Application.EnableEvents = True
End If
End Sub
シートを切り替えたときに実行(Worksheet_Activate):
'シートモジュールに記述する
Private Sub Worksheet_Activate()
MsgBox "このシートは編集禁止です。閲覧のみでお使いください。"
End Sub
手動・自動を使い分けるには?
どちらの実行方法を選ぶかは、「いつ・誰が・どんな条件で動かしたいか」で決まります。
| 状況 | おすすめ | 理由 |
|---|---|---|
| 必要なときだけ処理したい | 手動実行 | 誤実行を防ぎやすい |
| ファイルを開いたときに必ず確認したい | Workbook_Open | 忘れずに実行される |
| 入力後に自動で書式を整えたい | Worksheet_Change | 入力の都度自動処理できる |
| 保存・閉じる前に後処理をしたい | BeforeSave・BeforeClose | 操作に連動させられる |
| 開発・テスト中で動作を確認したい | 手動実行 | ステップ実行で確認しやすい |
まとめ
- 手動実行は VBE・Alt+F8・シートボタン の3種類。必要なときだけ動かせる安全な方法
- 自動実行は イベント を使う。ブック操作には
ThisWorkbook、シート操作にはシートモジュールに記述する - よく使うイベントは Workbook_Open・BeforeSave・BeforeClose・Worksheet_Change
Worksheet_Changeを使う際はApplication.EnableEvents = False/Trueで無限ループを防ぐ- 「いつ・誰が・どんな条件で動かしたいか」で手動・自動を使い分けると業務フローに合った設計ができる
よくある質問
イベントマクロを標準モジュールに書いてしまいましたが動きません
イベントマクロは専用のモジュールに書く必要があります。ブック関連(Workbook_Openなど)は ThisWorkbook、シート関連(Worksheet_Changeなど)は対象のシートモジュールに記述してください。標準モジュールに書いても自動実行されません。
Workbook_Openが動かない場合はどうすればいいですか?
マクロが無効になっている可能性があります。ファイルを開いたときに「コンテンツの有効化」をクリックしているか確認してください。また、ThisWorkbookに記述されているか、プロシージャ名が正確に Workbook_Open になっているかも確認してみてください。
Worksheet_Changeが無限ループ(止まらなく)なってしまいます
このイベントは「セルの内容が変わった時」に動きます。そのため、マクロの中で「セルを書き換える」命令を書くと、その書き換えに反応してまたマクロが最初から動いてしまうという「自分自身を呼び出す連鎖(無限ループ)」が起きてしまいます。
これを防ぐには、処理の前に「今はイベントに反応しなくていいよ」という命令(Application.EnableEvents = False)を入れ、終わったら元に戻す対策が必須です。
複数のシートに同じWorksheet_Changeを設定したいです
各シートのモジュールに同じコードを書く方法か、ThisWorkbookの Workbook_SheetChange イベントを使う方法があります。後者はブック内のすべてのシートの変更に反応するため、1か所にまとめて書けます。
ショートカットキーでマクロを実行できますか?
できます。Alt+F8でマクロ一覧を開き、対象マクロを選んで「オプション」ボタンを押すと、ショートカットキーを割り当てられます。Ctrl+任意のキーで実行できるようになります。ただし既存のショートカット(Ctrl+C・Ctrl+Vなど)と競合しないよう注意してください。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



