Excel VBAで関数によるデータ変更時にメッセージボックスを表示する方法

Office系ソフトウェア

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音を設定し、視覚だけでなく聴覚でも通知可能。

この方法を使えば、関数の変更も自動的に検知してメッセージボックスを表示できるようになります!

コメント

タイトルとURLをコピーしました