对单元格更改自动执行Excel宏

对单元格更改自动执行Excel宏,excel,vba,automation,Excel,Vba,Automation,如何在特定单元格中的值每次更改时自动执行Excel宏 现在,我的工作代码是: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("H5")) Is Nothing Then Macro End Sub 其中H5是被监控的特定单元,宏是宏的名称 有更好的方法吗?处理工作表更改事件或工作簿更改事件 事件处理程序将参数目标作为范围,因此您可以检查正在更改的范围是否包括您感兴趣的

如何在特定单元格中的值每次更改时自动执行Excel宏

现在,我的工作代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
其中H5是被监控的特定单元,宏是宏的名称

有更好的方法吗?

处理工作表更改事件或工作簿更改事件


事件处理程序将参数目标作为范围,因此您可以检查正在更改的范围是否包括您感兴趣的单元格。

我更喜欢这种方式,不是使用单元格而是使用范围

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If

你的代码看起来不错


但是,请注意,对RangeH5的调用是对Application.RangeH5的快捷命令,它相当于Application.ActiveSheet.RangeH5。如果唯一的更改是用户更改(这是最典型的更改),则这可能很好,但当工作表不是活动工作表时,可以通过编程更改(例如VBA)更改工作表的单元格值

考虑到这一点,我将利用Target.Worksheet.RangeH5:

或者您可以使用Me.RangeH5,如果事件处理程序位于相关工作表的代码页上,则通常是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

希望这有帮助…

我有一个单元格,它链接到在线股票数据库并经常更新。我想在单元格值更新时触发宏

我相信这类似于程序或任何外部数据更新导致的单元格值更改,但上述示例不知何故并不适用于我。我认为问题是因为excel内部事件不会被触发,但这是我的猜测

我做了以下几件事

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub

我花了很多时间研究这一点,并了解它是如何工作的,在真正搞乱了事件触发器之后。由于有这么多分散的信息,我决定在一个地方分享我的发现,一步一步如下:

1打开VBA编辑器,在VBA项目YourWorkBookName.xlsm下打开Microsoft Excel对象并选择更改事件所属的工作表

2默认代码视图为“常规”。从中上部的下拉列表中,选择“工作表”

3私有子工作表\u选择更改已按其应有的方式存在,请别管它。从上面复制/粘贴Mike Rosenblum的代码,并将.Range引用更改为您正在监视更改的单元格B3(在我的例子中)。暂时不要放置宏,但之后我删除了单词Macro:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
或者从左上角的下拉列表中,选择“更改”,然后在“专用子对象”和“结束子对象”之间的空间中,粘贴“如果不相交目标对象,则Me.RangeH5为Nothing”

4然后关闭事件,这样当您调用宏时,它不会触发事件并尝试再次运行此工作表\u在一个无休止的循环中再次更改,该循环会使Excel崩溃和/或以其他方式将一切搞糟:

Application.EnableEvents = False
5调用你的宏

Call YourMacroName
6重新打开事件,以便下一次更改和任何/所有其他事件触发:

Application.EnableEvents = True
7结束If块和子模块:

    End If
End Sub
整个代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

这会使模块无法打开/关闭事件,从而产生问题,只需让更改触发、关闭事件、运行宏并重新打开事件。

谢谢,它可以正常工作。我用Target.Address=RangeH5.Address检查范围。有没有更简单的方法?另一种方法:不是目标,射程H5什么都不是。如果您的单元格只是更改范围的一部分,那么第一个注释Target.Address=RangeH5.Address将不起作用。第二条评论仍然存在Mike Rosenblum所描述的问题。出于某种原因,我无法让它起作用。当我告诉代码在VBA中运行时,它会弹出一个菜单,问我是否要运行宏而不是自动运行宏?如果单元格H5从另一个工作表(如sheet2)更改,则上述功能不起作用。请在此提供帮助。对于通过谷歌搜索来到这里的任何人,请确保您将此代码粘贴到vba的工作表中,而不是像我那样的模块中。查看Application.ActiveSheet.RangeH5.==>target.parent.rangeH5是偶数safer@WillEdiger当您未明确指定工作表引用时,Excel将采用活动工作表;当您未明确指定使用的是Excel时,Excel将采用应用程序。请注意,在工作表代码模块中,工作表更改事件必须位于该模块中,非限定范围不默认为ActiveSheet,而是指包含代码的工作表。因此,本答案中的代码实际上与问题中的代码相同。注意:早在2009年写下这个答案时,它可能有所不同,但我很确定它不是。FormulaDesk中的RunMacroWhenValue更改UDF是否满足您的要求?它可能与一个单元格相同。可以将范围设置为一个单元格、连续单元格范围,甚至可以将分散的单元格都设置为逗号分隔。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub