【Excel VBA】セルの内容が変更された時に処理を実行する(SheetChange/Change)

はじめに

今回は、セルの内容が変更された時に処理を実行する方法を解説します。
「わざわざボタンを配置して…」ではなく、利用者がセルを触った場合に処理を実施したいこともあるかと思います。
本記事では、2パターンの方法を解説したうえ、使用の際の注意点やイベントの記述方法について詳しく解説していきます。

この記事を読むメリット
  • セルの内容が変更された時に処理を実行する2パターンの方法が分かります。
  • 「セルの内容が変更された」という定義について詳しく解説します。
  • イベントを使用するための手順を画像付きで解説します。
  • コピペで使える実践的なサンプルコードを掲載しています。

前提

「セルを変更する」という定義について

本記事で紹介するイベントは、「セルの値」が変更された場合に発生するイベントを紹介します。
以下に発生条件を記載いたしましたのでご参考としてください。

イベントの発生条件
  • セルに値が入力された場合(例:””(ブランク) → 100)
  • セルに入力されている値が変更された場合(例:100 → 1000)
  • セルに入力されている値がクリアされた場合(例:100 → “”(ブランク))
  • 行や列が挿入された場合
  • 行や列が削除された場合
  • セルのコピー&ペースト(値が変更されなくても発生)
  • セルに入力された値を編集したが、結果同じ値になった時
イベントが発生しない場合
  • セルの書式が変更となった場合(背景色や文字色、太字や取り消し線を設定した場合など)
  • セルの結合

関連イベント

セルの内容が変更された場合にイベントをハンドリングする方法は、以下の2パターン存在します。

#イベント説明
1Workbook_SheetChangeブック内のいずれかのシートのセルの内容が変更された時にイベントを発生させる
2Worksheet_Change特定のシートのセルの内容が変更された時にイベントを発生させる
セルの内容変更 – 関連イベント

セルの内容が変更される度に処理が実行されるため、環境によっては操作が遅く感じるかもしれません。
計画的にイベントを組み込むようにしてください。

基本情報

SheetChange

ブック内のいずれかのシートのセルの内容が変更された時に処理を実行するには、Workbook_SheetChangeイベント(以下「SheetChangeイベント」という)を使用します。
SheetChangeイベントは、Workbookモジュールに記載します。

構文

構文

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
…(ソースコードを入力)
End Sub

引数「sh」には、セルが変更された Worksheetオブジェクト が渡されます。
引数「Target」には、変更されたセルの Rangeオブジェクト が渡されます。

「行の削除」や、「複数セルへのコピー&ペースト」で、複数セルが変更される場合があります。
その場合、引数「Target」は配列となります。
配列に対して、プロパティやメソッドにアクセスするとエラーの原因となるため、For Each等でループさせると安全です。

Changeイベント

構文

セルの値が変更になった時に処理を実行するには、Worksheet_Changeイベント(以下「Changeイベント」という)を使用します。
Changeイベントは、Worksheetモジュールに記載します。

構文

Private Sub Worksheet_Change(ByVal Target As Range)
…(ソースコードを入力)
End Sub

イベントの記述手順

SheetChangeイベント

STEP
WorkBookイベントを選択する

VBEより、「ThisWorkbook」>「Workbook」を選択する。

Workbookイベントの選択
Workbookイベントの選択
STEP
イベントを選択する

プルダウンより「SheetChange」を選択します。
その後、コード欄に「Workbook_SheetChange」イベントが記載されることを確認します。

イベントの選択
イベントの選択

Changeイベント

STEP
Worksheetイベントを選択する

VBEより、「Worksheetモジュール」>「Worksheet」を選択する。

Worksheetイベントの選択

手順①では、イベントを設置するシートを選択してください。

STEP
イベントを選択する

プルダウンより「Change」を選択します。
その後、コード欄に「Workbook_SheetChange」イベントが記載されることを確認します。

イベントの選択

サンプルコード

ブック内のシートのセルの値が変更された場合に処理を実行する

サンプルコード
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim rng As Range    ' Rangeオブジェクト

    If Sh.Name = "Sheet3" Then

        ' [Sheet3]の場合は処理を終了する
        Exit Sub
    End If

    For Each rng In Target

        ' セルの背景色をハイライトする
        rng.Interior.Color = rgbYellow
    Next rng
End Sub

ブック内のすべてのシートに対してイベントを受け取ってしまうため、冒頭で特定のシート名の場合は終了する処理を入れています。

シート内のセルの値が変更された場合に処理を実行する

サンプルコード
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range    ' Rangeオブジェクト

    ' イベントを抑止する
    Application.EnableEvents = False

    For Each rng In Target

        ' 隣のセルに ÷ 100をした値を並べる
        Cells(rng.Row, rng.Column + 1).Value = rng.Value / 100
    Next rng

    ' イベントを抑止する
    Application.EnableEvents = True
End Sub

10行目にて、隣のセルに値を入力する処理が入っています。
この時、イベントの抑止を行わない場合は、更にイベントが発生してしまうため、イベントの抑止を一時的に実施しています。
イベントの抑止の方法について、詳細は以下を参考にしてください。
(参考:【Excel VBA】イベントを発生させないようにする(EnableEvents)

最後に

今回は、セルの内容が変更された時に処理を実行する方法について解説しました。

このイベントは、利用者の操作に対して即時に反応するため使いこなせると使用感は向上します。

一方で、セルの内容を変更する度に常に実行されてしまうため、計画的にイベントを配置するようにしてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA