单元格由公式更改时VBA代码不会运行

工作表A具有从工作表B收集的数据范围。 工作表A有一个macros,用于计算数据是否高于某个值,然后调用电子邮件模块向选定的用户发送电子邮件。

工作表A上手动input数据时,macros工作,但是当从工作表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 

要通过公式捕获更改,必须使用Worksheet_Calculate()事件。 要理解它是如何工作的,我们举个例子。

  1. 创build一个新的工作簿。
  2. 在Sheet1单元格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 Code区域粘贴这个代码

 Private Sub Workbook_Open() PrevVal = Sheet1.Range("A1").Value End Sub 

closures并保存该工作簿并重新打开它。 现在对Sheet2的单元格A1进行任何更改。 你会注意到你会得到消息框MsgBox "Value Changed"

快照

在这里输入图像描述

worksheet_change事件只会在手动更改用户时触发。 我认为你最好的select就是将这个工作表变更事件作为你的工作表B,我假定用户input变化正在发生。

如果这真的不适合你,我会build议一些替代scheme,但我认为这可能是迄今为止最好的select。

编辑:每个后续评论的另一个build议

ThisWorkbook对象有一个事件SheetChange,当工作簿中的任何工作表被改变时,这个事件将被触发。 如果您可以确定数据将被input到每个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 

让我知道这是怎么回事。

Interesting Posts