在单元格更改上自动执行Excel宏

nam*_*min 89 excel automation vba

每当特定单元格中的值发生更改时,如何自动执行Excel宏?

现在,我的工作代码是:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
Run Code Online (Sandbox Code Playgroud)

"H5"被监视的特定单元格在哪里,是Macro宏的名称.

有没有更好的办法?

Mik*_*lum 106

你的代码看起来很不错.

但是,要小心,你的调用Range("H5")是一个快捷命令Application.Range("H5"),相当于Application.ActiveSheet.Range("H5").如果唯一的更改是用户更改(这是最典型的),这可能没问题,但是当工作表的单元格值不是通过程序更改(例如VBA)的活动工作表时,它可能会更改.

考虑到这一点,我会利用Target.Worksheet.Range("H5"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助...

  • 如果单元格'H5`从另一张表改变,比如说'sheet2`那么上面的函数不起作用.请帮忙. (4认同)
  • 对于通过谷歌搜索来到这里的任何人,请确保将此代码粘贴到vba中的表单中,而不是像我那样的模块.看看http://stackoverflow.com/questions/15337008/excel-vba-run-macro-automatically-whenever-a-cell-is-changed (2认同)

Joe*_*Joe 7

处理Worksheet_Change活动或Workbook_SheetChange活动.

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

  • 如果您的单元格只是更改范围的*部分*,则第一条注释(`Target.Address = Range("H5").Address`)将不起作用.第二条评论仍然存在Mike Rosenblum描述的问题. (2认同)

小智 6

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

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

2) 默认代码视图是“General”。从顶部中间的下拉列表中,选择“工作表”。

3) Private Sub Worksheet_SelectionChange 已经存在了,别管它。从上面复制/粘贴 Mike Rosenblum 的代码并将 .Range 引用更改为您正在观察更改的单元格(在我的情况下为 B3)。但是,不要放置您的宏(我在“Then”之后删除了“Macro”一词):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
Run Code Online (Sandbox Code Playgroud)

或从左上角的下拉列表中,选择“更改”,然后在 Private Sub 和 End Sub 之间的空间中粘贴 If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) 在“Then”之后的那一行关闭事件,这样当你调用你的宏时,它不会触发事件并尝试在一个永无止境的循环中再次运行这个 Worksheet_Change,这会导致 Excel 崩溃和/或以其他方式搞砸一切:

Application.EnableEvents = False
Run Code Online (Sandbox Code Playgroud)

5)调用你的宏

Call YourMacroName
Run Code Online (Sandbox Code Playgroud)

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

Application.EnableEvents = True
Run Code Online (Sandbox Code Playgroud)

7) 结束 If 块和 Sub:

    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

整个代码:

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
Run Code Online (Sandbox Code Playgroud)

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