9

ワークシート 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
4

2 に答える 2

23

式によって変更をキャプチャするには、Worksheet_Calculate()イベントを使用する必要があります。それがどのように機能するかを理解するために、例を見てみましょう。

  1. 新しいワークブックを作成します。
  2. Sheet1 Cell A1に、この式を入れます=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

ワークブックを閉じて保存し、再度開きます。のセル A1 に変更を加えSheet2ます。メッセージボックスが表示されることに気付くでしょうMsgBox "Value Changed"

スナップショット

ここに画像の説明を入力

于 2012-07-10T08:39:19.733 に答える
0

ワークシート_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

それがどうなるか教えてください。

于 2012-07-10T05:02:22.957 に答える