今回は、セルの内容が変更された時に処理を実行する方法を解説します。
「わざわざボタンを配置して…」ではなく、利用者がセルを触った場合に処理を実施したいこともあるかと思います。
本記事では、2パターンの方法を解説したうえ、使用の際の注意点やイベントの記述方法について詳しく解説していきます。
- セルの内容が変更された時に処理を実行する2パターンの方法が分かります。
- 「セルの内容が変更された」という定義について詳しく解説します。
- イベントを使用するための手順を画像付きで解説します。
- コピペで使える実践的なサンプルコードを掲載しています。
前提
「セルを変更する」という定義について
本記事で紹介するイベントは、「セルの値」が変更された場合に発生するイベントを紹介します。
以下に発生条件を記載いたしましたのでご参考としてください。
- セルに値が入力された場合(例:””(ブランク) → 100)
- セルに入力されている値が変更された場合(例:100 → 1000)
- セルに入力されている値がクリアされた場合(例:100 → “”(ブランク))
- 行や列が挿入された場合
- 行や列が削除された場合
- セルのコピー&ペースト(値が変更されなくても発生)
- セルに入力された値を編集したが、結果同じ値になった時
- セルの書式が変更となった場合(背景色や文字色、太字や取り消し線を設定した場合など)
- セルの結合
関連イベント
セルの内容が変更された場合にイベントをハンドリングする方法は、以下の2パターン存在します。
# | イベント | 説明 |
---|---|---|
1 | Workbook_SheetChange | ブック内のいずれかのシートのセルの内容が変更された時にイベントを発生させる |
2 | Worksheet_Change | 特定のシートのセルの内容が変更された時にイベントを発生させる |
基本情報
SheetChange
ブック内のいずれかのシートのセルの内容が変更された時に処理を実行するには、Workbook_SheetChangeイベント(以下「SheetChangeイベント」という)を使用します。
SheetChangeイベントは、Workbookモジュールに記載します。
構文
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
…(ソースコードを入力)
End Sub
「行の削除」や、「複数セルへのコピー&ペースト」で、複数セルが変更される場合があります。
その場合、引数「Target」は配列となります。
配列に対して、プロパティやメソッドにアクセスするとエラーの原因となるため、For Each等でループさせると安全です。
Changeイベント
構文
セルの値が変更になった時に処理を実行するには、Worksheet_Changeイベント(以下「Changeイベント」という)を使用します。
Changeイベントは、Worksheetモジュールに記載します。
Private Sub Worksheet_Change(ByVal Target As Range)
…(ソースコードを入力)
End Sub
イベントの記述手順
SheetChangeイベント
VBEより、「ThisWorkbook」>「Workbook」を選択する。
プルダウンより「SheetChange」を選択します。
その後、コード欄に「Workbook_SheetChange」イベントが記載されることを確認します。
Changeイベント
VBEより、「Worksheetモジュール」>「Worksheet」を選択する。
プルダウンより「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
最後に
今回は、セルの内容が変更された時に処理を実行する方法について解説しました。
このイベントは、利用者の操作に対して即時に反応するため使いこなせると使用感は向上します。
一方で、セルの内容を変更する度に常に実行されてしまうため、計画的にイベントを配置するようにしてください。
コメント