首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对单元格更改自动执行Excel宏

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

Stack Overflow用户
提问于 2009-01-03 17:33:22
回答 5查看 514.8K关注 0票数 95

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

现在,我的工作代码是:

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

其中"H5"是被监视的特定单元,Macro是宏的名称。

有没有更好的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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

希望这能帮到你。

票数 116
EN

Stack Overflow用户

发布于 2009-01-03 17:36:36

处理Worksheet_Change事件或Workbook_SheetChange事件。

事件处理程序将参数"Target As Range“作为参数,这样您就可以检查正在更改的范围是否包括您感兴趣的单元格。

票数 7
EN

Stack Overflow用户

发布于 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

这将打开/关闭模块中的事件,这会产生问题,并简单地让更改触发、关闭事件、运行宏并重新打开事件。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/409434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档