2

私はグーグルで検索し、特定のセル D4 が変更された場合にのみ実行する次のコードを作成しました。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Static EmailSent As Boolean
    Dim Threshold As Integer
    Dim Cell As String, Email As String, Msg As String

    Cell = "D4"
    Threshold = 100
    Email = Range("E7").Value


    Set KeyCells = Range(Cell)

    If Not Application.Intersect(Range(Cell), Range(Target.Address)) Is Nothing Then
        Dim x As Integer
        x = Range(Cell).Value

        If x >= Threshold Then
            EmailSent = False
        ElseIf x < Threshold And Not EmailSent Then
            EmailSent = True
            Msg = "You only have " & x & " widgets remaining."
            MsgBox Msg
            SendMail Email, Msg
        End If
    End If
End Sub

これは機能し、ここには同様の質問がたくさんあることを知っています。しかし、ここで問題が発生します。これは、D4 を明示的な値、たとえば に設定した場合にのみ機能します"48"。D4 が数式であっても機能するようにしたいので、D4 が"=SUM(A4:C4)"その合計が 100 を下回った場合に電子メールを送信する必要がある場合、このコードはその場合に電子メールを送信しません :-(

これを修正する方法を知っている人はいますか?

4

2 に答える 2

4
Private Sub Worksheet_Calculate()
    CheckForMail
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    CheckForMail Target
End Sub


Sub CheckForMail(Optional rng As Range = Nothing)

    Static EmailSent As Boolean
    Dim KeyCells As Range
    Dim Threshold As Integer
    Dim Cell As String, Email As String, Msg As String
    Dim x As Integer

    Cell = "D4"
    Set KeyCells = Me.Range(Cell)

    'if called from worksheet_change, check the range
    If Not rng Is Nothing Then
        If Application.Intersect(KeyCells, rng) Is Nothing Then
            Exit Sub
        End If
    End If

    Threshold = 100
    Email = Me.Range("E7").Value
    x = KeyCells.Value

    If x >= Threshold Then
        EmailSent = False
    ElseIf x < Threshold And Not EmailSent Then
        EmailSent = True
        Msg = "You only have " & x & " widgets remaining."
        MsgBox Msg
        SendMail Email, Msg
    End If

End Sub
于 2012-07-17T21:31:37.533 に答える
0

次に、寄与するセルのいずれかが変更されたときにセルをチェックする必要があります。それらが同じシートにある場合、これは機能します:

これを試して:

Private Sub Worksheet_Change(ByVal Target As Range)

Static varD4_old As Variant ' 静的変数は呼び出し間で値を保持します

Dim varD4 As Variant

varD4 = Range("D4").Value

varD4 <> varD4_old の場合     Debug.Print "D4 が " & varD4_old & " から " & varD4 に変更されました     varD4_old = varD4   ' 変更コードを実行します 終了条件

サブ終了

于 2012-07-18T17:32:06.530 に答える