在单元格更改上自动执行Excel宏
-
03-07-2019 - |
题
每当特定单元格中的值发生变化时,如何自动执行Excel宏?
现在,我的工作代码是:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
其中" H5"
是受监控的特定单元格, Macro
是宏的名称。
有更好的方法吗?
解决方案
你的代码看起来很不错。
但要注意,对范围(“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
希望这会有所帮助......
其他提示
处理 Worksheet_Change
事件或 Workbook_SheetChange
事件。
事件处理程序采用参数“Target As Range”,因此您可以检查正在更改的范围是否包含您感兴趣的单元格。
我更喜欢这种方式,不是使用单元格而是使用范围
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
我花了很多时间研究这个,并在真正搞乱事件触发器后学习它是如何工作的。由于有太多分散的信息,我决定在一个地方分享我发现的所有工作,一步一步如下:
1)打开VBA编辑器,在VBA项目(YourWorkBookName.xlsm)下打开Microsoft Excel对象,然后选择更改事件所属的工作表。
2)默认代码视图为“常规”。从顶部中间的下拉列表中,选择“工作表”。
3)Private Sub Worksheet_SelectionChange已经存在,应该是这样,不管它。从上面复制/粘贴Mike Rosenblum的代码并将.Range引用更改为您正在观察更改的单元格(在我的情况下为B3)。但是,请不要放置您的宏(我在“然后”之后删除了“宏”一词):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
或从左上角的下拉列表中选择“更改”按钮。在Private Sub和End Sub之间的空格中,粘贴 If Not Intersect(Target,Me.Range(" H5"))No Nothing Then
4)在“然后”之后的行上关闭事件,以便在调用宏时,它不会触发事件并尝试在永不停止的循环中再次运行此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
这会打开/关闭模块中的事件,这会产生问题并简单地让更改触发,关闭事件,运行宏并重新打开事件。
我有一个链接到在线库存数据库并经常更新的单元格。我想在更新单元格值时触发宏。
我认为这类似于程序或任何外部数据更新的单元格值更改,但上面的示例以某种方式对我不起作用。我认为问题是因为没有触发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