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音を設定し、視覚だけでなく聴覚でも通知可能。
この方法を使えば、関数の変更も自動的に検知してメッセージボックスを表示できるようになります!


コメント