如何在每次更改特定单元格中的值时自动执行Excel宏?
现在,我的工作代码是:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
其中"H5"
是被监视的特定单元,Macro
是宏的名称。
有没有更好的方法?
发布于 2009-01-06 01:59:23
你的代码看起来很不错。
但是要小心,因为对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
或者,如果事件处理程序位于相关工作表的代码页上(通常是这样),则可以使用Me.Range("H5")
:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub
希望这能帮到你。
发布于 2009-01-03 17:36:36
处理Worksheet_Change
事件或Workbook_SheetChange
事件。
事件处理程序将参数"Target As Range“作为参数,这样您就可以检查正在更改的范围是否包括您感兴趣的单元格。
发布于 2018-07-12 06:51:51
我花了很多时间研究这一切,并了解它是如何工作的,在真正弄乱了事件触发器之后。由于有这么多零散的信息,我决定将我发现的所有工作都分享在一个地方,一步一步地如下:
1)打开VBA编辑器,在VBA工程(YourWorkBookName.xlsm)下,打开Microsoft Excel对象,然后选择更改事件所属的工作表。
2)默认的代码视图是“General”。从顶部中间的下拉列表中,选择“工作表”。
3)私有子Worksheet_SelectionChange已经存在,就不要管它了。从上面复制/粘贴Mike Rosenblum的代码,并将.Range引用更改为您正在等待更改的单元格(在我的示例中为B3)。不过,现在还不要放置你的宏(我在“Then”后面去掉了“宏”):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
或者,从左上角的下拉列表中选择"Change“,然后在私有子和结束子之间的空白处粘贴If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
4)在"Then“之后的行上关闭事件,以便在调用宏时,它不会触发事件,并尝试在一个永无止境的循环中再次运行此Worksheet_Change,这会导致Excel崩溃和/或以其他方式搞乱一切:
Application.EnableEvents = False
5)调用你的宏
Call YourMacroName
6)重新打开事件,以便下一次更改(以及任何/所有其他事件)触发:
Application.EnableEvents = True
7)结束If块和Sub:
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
这将打开/关闭模块中的事件,这会产生问题,并简单地让更改触发、关闭事件、运行宏并重新打开事件。
https://stackoverflow.com/questions/409434
复制相似问题