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)
希望这可以帮助...
处理Worksheet_Change活动或Workbook_SheetChange活动.
事件处理程序采用"目标作为范围"参数,因此您可以检查正在更改的范围是否包括您感兴趣的单元格.
小智 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)
这需要从模块中打开/关闭事件,这会产生问题,只需让更改触发,关闭事件,运行宏并重新打开事件。
| 归档时间: |
|
| 查看次数: |
467041 次 |
| 最近记录: |