Код VBA не запускается при изменении ячейки по формуле

Рабочий лист 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

2 ответа

Решение

Чтобы зафиксировать изменения по формуле, вы должны использовать 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"

SNAPSHOTS

Событие worksheet_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

Дайте мне знать, как это происходит.

Другие вопросы по тегам