カテゴリ: Excel VBA 更新日: 2026/03/24

Excel VBAで複数シートを同時監視!Workbook_SheetChangeの使い方完全ガイド

Workbook_SheetChangeで複数シートを一括監視するテクニック
Workbook_SheetChangeで複数シートを一括監視するテクニック

先生と生徒の会話形式で理解しよう

生徒

「先生、Excelのたくさんのシート全部に、『文字を入力したら自動で色が変わる』みたいな仕掛けを作りたいんですけど、シート1枚ずつにコードを書かないとダメですか?」

先生

「それは大変な作業になりそうですね。でも大丈夫ですよ!VBAには『ブック全体を見守る』という便利な機能があるんです。」

生徒

「ブック全体を見守る?それを使えば、1箇所に書くだけで全部のシートを監視できるんですか?」

先生

「その通りです!Workbook_SheetChange というイベントを使えば、どのシートが変更されても自動的にプログラムを動かすことができます。今日はその魔法のようなテクニックを学びましょう!」

1. Workbook_SheetChangeとは?イベント処理の基本

1. Workbook_SheetChangeとは?イベント処理の基本
1. Workbook_SheetChangeとは?イベント処理の基本

Excel VBAには「イベント」という考え方があります。イベントとは、マウスでクリックした、セルの内容を書き換えた、シートを切り替えたといった「Excel上で行われた操作」のことです。プログラミング未経験の方には、「何かが起きた瞬間に作動するセンサー」のようなものだとイメージすると分かりやすいでしょう。

通常、シートごとの変化を監視する場合は、各シートの裏側にコードを書きます。しかし、シートが10枚、20枚と増えていくと、すべてのシートに同じコードを貼り付けるのは非常に効率が悪いですし、修正が必要になったときも手間がかかります。そこで登場するのが Workbook_SheetChange(ワークブック・シートチェンジ)です。

この機能は「ThisWorkbook」という場所に記述します。ここに一度コードを書くだけで、そのExcelファイル(ブック)に含まれるすべてのシートに対して、内容が書き換えられた瞬間にプログラムを実行させることができるのです。まさに「一括管理」のための強力なツールです。SEO対策としても、VBAの効率化や自動化において外せない重要なキーワードとなります。

2. コードを書く場所「ThisWorkbook」を確認しよう

2. コードを書く場所「ThisWorkbook」を確認しよう
2. コードを書く場所「ThisWorkbook」を確認しよう

VBAでプログラムを書くとき、多くの初心者は「標準モジュール」という場所を使います。しかし、今回の「ブック全体の監視」を行うには、決まった場所に書かなければいけません。それが ThisWorkbook です。

VBE(プログラムを書く画面)を開くと、左側に「プロジェクトエクスプローラー」というツリー状のメニューがあります。その中に、現在開いているExcelファイルの名前があり、そのすぐ下に「ThisWorkbook」という項目が見つかるはずです。ここをダブルクリックして開いた白い画面が、ブック全体のイベントを記述する専用の場所になります。ここに書かれたコードは、ブックが開いている間ずっと、あなたの操作を見守ってくれるようになります。

3. 基本的な書き方と引数「Sh」と「Target」の正体

3. 基本的な書き方と引数「Sh」と「Target」の正体
3. 基本的な書き方と引数「Sh」と「Target」の正体

まずは、最もシンプルな「どのシートのどのセルが変わったか」を教えてくれるプログラムを見てみましょう。このコードを記述することで、すべてのシートで入力が行われるたびにメッセージが表示されます。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    MsgBox "今変更されたシートの名前は " & Sh.Name & " です。" & vbCrLf & _
           "変更されたセルは " & Target.Address & " です。"
End Sub

ここで重要な単語が2つ出てきました。引数(ひきすう)と呼ばれる ShTarget です。

  • Sh(エスエイチ): 変更が行われた「シート」そのものを指します。Sh.Name と書くことで、そのシートの名前を取得できます。
  • Target(ターゲット): 変更が行われた「セル(範囲)」を指します。Target.Address と書けば、どこのセルが書き換えられたのかを知ることができます。

この2つの情報をVBAが自動的に受け取ってくれるので、私たちは「どのシートのどこが触られたか」を判別して、自由自在に処理を分けることができるのです。

4. 実践!入力したセルの色を自動で変えるテクニック

4. 実践!入力したセルの色を自動で変えるテクニック
4. 実践!入力したセルの色を自動で変えるテクニック

それでは、具体的な活用例を見てみましょう。すべてのシートにおいて、何か文字や数値が入力されたセルの背景色を「黄色」にするプログラムです。これを使えば、どこを編集したかが一目でわかるようになります。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' 変更されたセルの背景色を黄色(カラーインデックス6番)にする
    Target.Interior.ColorIndex = 6
End Sub

プログラムの中にある Interior(インテリア)は、セルの「内装」つまり「背景」を意味します。ColorIndex(カラーインデックス)は色に割り振られた番号のことです。たった1行の命令ですが、これがブック内のどのシートで入力しても作動します。これが一括監視の凄さです。初心者の方でも、身近なExcel操作が自動化される楽しさを実感できるはずです。

5. 特定のシートだけ除外したい場合の条件分岐

5. 特定のシートだけ除外したい場合の条件分岐
5. 特定のシートだけ除外したい場合の条件分岐

「全部のシートを監視したいけど、『設定』シートや『集計』シートだけは勝手に色が変わってほしくない」という場面も多いでしょう。その場合は、前述した Sh.Name を使って条件を付け加えます。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' もしシート名が「設定」じゃなかったら処理をする
    If Sh.Name <> "設定" Then
        ' 入力された文字を太字にする
        Target.Font.Bold = True
        MsgBox Sh.Name & " シートのデータを更新しました。"
    End If
End Sub

VBAの <> という記号は「~ではない」という意味です。このように If 文(もし~なら)を組み合わせることで、「基本は全シート対象、でも特定のシートだけは例外」という柔軟なシステムを構築できます。これは実際の業務でツールを作る際に非常によく使われるテクニックです。

6. 注意点!無限ループを防ぐ「EnableEvents」の設定

6. 注意点!無限ループを防ぐ「EnableEvents」の設定
6. 注意点!無限ループを防ぐ「EnableEvents」の設定

イベント処理を使うとき、プログラミング未経験者が必ずと言っていいほどハマる罠があります。それが「無限ループ」です。例えば、「セルを書き換えたら、そのセルに今日の日付を入れる」という処理を書くとします。すると、「日付が入る(=セルが書き換わる)」ことで再びイベントが発生し、また日付を入れようとして……と、プログラムが止まらなくなってしまいます。

これを防ぐために、一時的にセンサーをオフにする命令を入れます。Google検索でも「VBA イベント 停止」などでよく調べられる重要なポイントです。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' センサーを一時的にオフにする
    Application.EnableEvents = False
    
    ' セルに「更新済み」という文字を入れる(ここでイベントは発生しない)
    Target.Value = "更新済み"
    
    ' センサーを再びオンに戻す(これを忘れると二度と動かなくなる!)
    Application.EnableEvents = True
End Sub

Application.EnableEvents = False は、Excel全体のセンサーを一時的に切るスイッチです。処理が終わったら必ず True に戻してスイッチを入れ直すのが鉄則です。これを忘れると、他の便利な自動化機能も動かなくなってしまうので注意しましょう。

7. 応用編:複数セルが同時に変更されたときの対処

7. 応用編:複数セルが同時に変更されたときの対処
7. 応用編:複数セルが同時に変更されたときの対処

Excelでは、1つのセルだけでなく、範囲を選択して一気にデータを消したり、コピペしたりすることがあります。この時、Target には複数のセルが含まれることになります。初心者のうちは「1つのセルだけ」を想定してコードを書きがちですが、複数のセルが同時に変更された場合のエラー対策も知っておくと、より安定したプログラムになります。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' もし変更されたセルが2つ以上だったら、処理を中断する
    If Target.CountLarge > 1 Then Exit Sub
    
    ' 1つのセルだけが変更された場合のみ、以下の処理を実行
    MsgBox Target.Value & " と入力されましたね!"
End Sub

Target.CountLarge は、変更されたセルの数を数える命令です。これが1より大きい(つまり2つ以上のセルが同時に変わった)ときは、Exit Sub(ここで終わり)という命令で処理を終了させています。こうすることで、想定外の動きによるエラーを防ぐことができます。プログラミングにおいて、こうした「例外への備え」は、使いやすいツールを作るための第一歩です。

8. 複数の条件で監視をさらに高度化する

8. 複数の条件で監視をさらに高度化する
8. 複数の条件で監視をさらに高度化する

最後に、少し発展的な使い方をご紹介します。例えば、「特定の列(A列など)が入力された時だけ、隣のセルに時間を記録する」といった使い方です。これは「変更された場所」を限定するテクニックです。


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' 変更されたのが1列目(A列)で、かつ1行目より下(データ行)の場合
    If Target.Column = 1 And Target.Row > 1 Then
        ' センサーオフ
        Application.EnableEvents = False
        
        ' B列(隣の列)に入力時刻を記録する
        Target.Offset(0, 1).Value = Now
        
        ' センサーオン
        Application.EnableEvents = True
    End If
End Sub

Target.Column は列の番号、Target.Row は行の番号を表します。Offset(0, 1) は「今の場所から右に1つずれた場所」という意味です。このように条件を絞り込むことで、ブック全体の監視という広い網を使いつつ、ピンポイントで必要な時だけ作動するスマートな自動化が可能になります。Excel VBAを使いこなすことで、事務作業の効率は劇的に向上します。まずは簡単なコードから試して、その便利さを体感してみてくださいね。

カテゴリの一覧へ
新着記事
New1
Office Scripts
Office Scriptsの基本!企業環境で安全にExcel自動化を使うための利用制限と管理者設定
New2
Office Scripts
Office Scriptsの基本!TypeScriptの型注釈を理解してExcel自動化を安全に書く方法
New3
Office Scripts
Office Scriptsの基本!Excel自動化で使うgetValues・setValues完全ガイド【初心者向け】
New4
Office Scripts
Office Scriptsの基本!エラー表示とログ確認でExcel自動化を安全に進める方法
人気記事
No.1
Java&Spring記事人気No1
Excel VBA
Excel VBAモジュール共有術!複数のブックでマクロを使い回す最適構成
No.2
Java&Spring記事人気No2
Excel VBA
個人用マクロブック(PERSONAL.XLSB)で作る最強の共通ライブラリ化ガイド
No.3
Java&Spring記事人気No3
Excel VBA
Excel VBAのプロジェクト構成とモジュール管理!標準・シート・ThisWorkbookの違い
No.4
Java&Spring記事人気No4
Excel VBA
VBAモジュールを安全にエクスポート・インポートする方法と注意点
No.5
Java&Spring記事人気No5
Excel VBA
ThisWorkbookに書くべき処理とは?VBAプロジェクトの正しい構成方法
No.6
Java&Spring記事人気No6
Excel VBA
Excel VBAのループ処理を徹底解説!For文とDo Loopで繰り返しを自動化
No.7
Java&Spring記事人気No7
Excel VBA
Excel VBAのブレークポイント設定と使い方!初心者でも理解できるデバッグの基本
No.8
Java&Spring記事人気No8
Office Scripts
Office Scriptsの基本!関数分割で読みやすいExcel自動化コードを設計する方法