VBAマクロの手動実行と自動実行の違い|Workbook_Open・Worksheet_Change・イベントの使い分け

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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール