2012-07-10 73 views
4

工作表A具有从收集的数据范围工作表B工作表A有一个宏,用于计算数据是否高于某个值,然后调用电子邮件模块向选定用户发送电子邮件。当公式更改单元格时,VBA代码不运行

当数据是人工输入的的Worksheet宏的作品,但是当数据从工作表乙它不火拉。

我不知道我需要在我的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 

回答

12

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

  1. 创建一个新的工作簿。
  2. 在Sheet 1中单元格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 

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

快照

enter image description here

+0

此解决方案完美无缺:) – Maxi 2014-08-17 20:47:50

+1

如何在一系列单元上使用此功能? – 2015-04-02 09:42:51

0

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 

让我知道那是怎么回事。

+0

有12个“工作表的B(每月),所以我很想在你的其他建议。为了澄清,工作表A将所有月份工作表都转换为易于阅读的格式。 – 2012-07-10 05:10:51

+0

因此,Worksheet A中的公式就像= WorksheetJan!A1 + WorksheetFeb!A2 + WorksheetMar!A3 ...等等?我很快就要离开工作,应该在大约1小时内再回答。 – mkingston 2012-07-10 05:18:38

+0

每个工作表B都有一组值,而工作表A只需简单地将它们拉入='WorksheetB'!B31'等 – 2012-07-10 05:23:43

相关问题