ワークシートAには、ワークシートBから収集されたデータの範囲があります。 ワークシートAには、データが値を上回っているかどうかを計算するマクロがあり、選択したユーザーに電子メールを送信するために電子メールモジュールを呼び出します。
ワークシートAにデータを手動で入力するとマクロは機能しますが、ワークシートBからデータを取得すると起動しません。
VBAコードで何を変更する必要があるのかわかりません。
Private Sub Worksheet_Change(ByVal Target As Range)
Call MailAlert(Target, "B5:M5", 4)
Call MailAlert(Target, "B8:M8", 7)
Call MailAlert(Target, "B11:M11", 6)
Call MailAlert(Target, "B14:M14", 2)
Call MailAlert(Target, "B17:M17", 4)
Call MailAlert(Target, "B20:M20", 1)
Call MailAlert(Target, "B23:M23", 3)
Call MailAlert(Target, "B26:M26", 1)
Call MailAlert(Target, "B29:M29", 5)
Call MailAlert(Target, "B32:M32", 1)
Call MailAlert(Target, "B35:M35", 7)
Call MailAlert(Target, "B38:M38", 20)
Call MailAlert(Target, "B41:M41", 0)
End Sub
Private Sub MailAlert(ByVal Target As Range, ByVal Address As String, ByVal Value As Integer)
If Target.Cells.Count > 1 Then Exit Sub
If Not Application.Intersect(Range(Address), Target) Is Nothing Then
If IsNumeric(Target.Value) And Target.Value > Value Then
Call Mail_small_Text_Outlook
End If
Application.EnableEvents = True
End If
End Sub
数式で変更をキャプチャするには、Worksheet_Calculate()
イベントを使用する必要があります。それがどのように機能するかを理解するために、例を見てみましょう。
=Sheet2!A1+1
モジュールにこのコードを貼り付けます
Public PrevVal As Variant
これをシートコード領域に貼り付けます
Private Sub Worksheet_Calculate()
If Range("A1").Value <> PrevVal Then
MsgBox "Value Changed"
PrevVal = Range("A1").Value
End If
End Sub
そして最後に、ThisWorkbook
コード領域にこのコードを貼り付けます
Private Sub Workbook_Open()
PrevVal = Sheet1.Range("A1").Value
End Sub
ブックを閉じて保存し、再度開きます。次に、Sheet2
のセルA1に変更を加えます。メッセージボックスMsgBox "Value Changed"
が表示されます。
[〜#〜]スナップショット[〜#〜]
ワークシート_changeイベントは、ユーザーが手動で変更した場合にのみ発生します。これをワークシートBのワークシート変更イベントとして実装するのが最善の策だと思います。ここでは、ユーザー入力の変更が行われていると思います。
これが本当にあなたに合わない場合に私が提案するいくつかの選択肢がありますが、これはおそらく断然最良の選択肢だと思います。
編集:次のコメントごとの別の提案
ThisWorkbookオブジェクトにはイベントSheetChangeがあり、ワークブック内のシートが変更されるたびに発生します。各Bシートにデータが入力される範囲を特定できれば、元のコードと同じようにこれらの範囲を使用できます。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Sh Is Sheets("Worksheet A") Then
If Intersect(Sh.Range("B1:B5"), Target) Then
'Call MailAlert as required here
ElseIf Intersect(Sh.Range("B10:B20"), Target) Then
'Call MailAlert as required here
Else ' Etc...
'Call MailAlert as required here
End If
End If
End Sub
それがどうなるか教えてください。