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

Worksheet A имеет диапазоны данных, которые собираются изWorksheet B. Worksheet A имеет макрос, который вычисляет, если данные превышают значение, а затем вызывает модуль электронной почты, чтобы отправить выбранных пользователей по электронной почте.

Когда данные вводятся вручнуюWorksheet A Макрос работает, однако, когда данные извлекаются изWorksheet 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)

х пользователя. Я думаю, что лучше всего было бы реализовать это как событие изменения рабочего листа на рабочем листе 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

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

 Kenan Fallon10 июл. 2012 г., 07:10
Есть 12 бланков B (на каждый месяц), поэтому мне будут интересны ваши другие предложения. Чтобы уточнить, рабочий лист А объединяет все месячные рабочие листы в легкий для чтения формат.
 Kenan Fallon10 июл. 2012 г., 07:23
каждый рабочий лист B имеет набор значений, а рабочий лист A просто извлекает их с помощью простого = «рабочий лист B»! B31 »; так далее
 10 июл. 2012 г., 09:14
@KenanFallon отредактировано. Дайте мне знать, если это хорошо.
 10 июл. 2012 г., 07:18
Таким образом, формула в Рабочем листе A выглядит примерно так: WorksheetJan! A1 + WorksheetFeb! A2 + WorksheetMar! A3 ... и т. Д.? Я скоро уйду с работы, должен ответить снова примерно через 1 час.
 Kenan Fallon10 июл. 2012 г., 14:11
выглядит хорошо, но как я могу вызвать модуль MailAlert, если значение в указанном диапазоне превышает целевое значение? Я не могу проверить до завтра.
Решение Вопроса

Чтобы зафиксировать изменения по формуле, вы должны использоватьWorksheet_Calculate() событие. Чтобы понять, как это работает, давайте возьмем пример.

Create a New Workbook. In Sheet1 Cell A1, put this formula =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

Закройте и сохраните книгу и снова откройте ее. Теперь внесите любые изменения в ячейку A1Sheet2, Вы заметите, что вы получите окно сообщенияMsgBox "Value Changed"

SNAPSHOTS

enter image description here

 17 авг. 2014 г., 22:47
Это решение работает отлично :)
 02 апр. 2015 г., 11:42
Как я могу использовать это на ряде клеток?

Ваш ответ на вопрос