Код 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()
событие. Чтобы понять, как это работает, давайте рассмотрим пример.
- Создать новую книгу.
- В 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
Дайте мне знать, как это происходит.