Excelで、関数(XLOOKUPなど)によってセルの値が変更された際にメッセージボックスを表示させる方法について解説します。通常、Worksheet_Changeイベントは関数で変わったセルには反応しません。そのため、別の方法で変更を検知する必要があります。
関数の値変更を検知するには?
関数による値の変更を検知するには、Worksheet_Calculateイベントを使う方法が有効です。
① Worksheet_Calculateを使用する
「シート2」のセル A5:A15
にXLOOKUPの結果が入るため、前回の値と現在の値を比較して変化を検知します。
以下のコードを「シート2」のVBAに追加してください。
Option Explicit Dim 前回の値 As Variant Private Sub Worksheet_Calculate() Dim 現在の値 As Variant Dim i As Integer ' A5:A15の現在の値を取得 現在の値 = Me.Range("A5:A15").Value ' 初回の実行時は前回の値を設定 If IsEmpty(前回の値) Then 前回の値 = 現在の値 Exit Sub End If ' 値が変更された場合にメッセージを表示 If Not IsArrayEqual(前回の値, 現在の値) Then Dim 音の有無 As String, 音の回数 As Long 音の有無 = Me.Range("C2").Value 音の回数 = Me.Range("D2").Value If 音の有無 = "音を鳴らす" Then For i = 1 To 音の回数 Beep Application.Wait Now + TimeValue("0:00:01") Next i End If MsgBox "追加がありました。", vbInformation End If ' 現在の値を前回の値として保存 前回の値 = 現在の値 End Sub ' 配列比較のための関数 Function IsArrayEqual(arr1 As Variant, arr2 As Variant) As Boolean Dim r As Long, c As Long If Not IsArray(arr1) Or Not IsArray(arr2) Then IsArrayEqual = False Exit Function End If ' 配列サイズが違う場合は変更ありと判断 If UBound(arr1, 1) <> UBound(arr2, 1) Or UBound(arr1, 2) <> UBound(arr2, 2) Then IsArrayEqual = False Exit Function End If ' 各セルの値を比較 For r = LBound(arr1, 1) To UBound(arr1, 1) For c = LBound(arr1, 2) To UBound(arr1, 2) If arr1(r, c) <> arr2(r, c) Then IsArrayEqual = False Exit Function End If Next c Next r ' 変更なし IsArrayEqual = True End Function
② コードの仕組み
Worksheet_Calculate
は、ワークシートの再計算が行われた際に自動的に実行される。- 前回の値と現在の値を比較し、異なる場合のみメッセージボックスを表示。
- Beep音を鳴らす設定(C2セルで「音を鳴らす」場合、D2セルの回数だけBeep音を鳴らす)。
③ 期待される動作
このVBAを実装すると、XLOOKUPによってA5:A15の値が変わったときにメッセージボックスが表示されます。
- シート1でデータを変更 → シート2のA5:A15が変わる → メッセージが表示される
- 手動入力ではなくても、関数の変更を検知できる
まとめ
通常のWorksheet_Change
では関数の変更を検知できませんが、Worksheet_Calculate
を使えば、関数で変化したセルも検知可能です。
- 関数で変わるセルを監視するには、
Worksheet_Calculate
を使う。 - 前回の値と比較し、変更があった場合のみメッセージを表示。
- Beep音を設定し、視覚だけでなく聴覚でも通知可能。
この方法を使えば、関数の変更も自動的に検知してメッセージボックスを表示できるようになります!
コメント