学会VBA事件:让宏代码从手动执行变为自动执行

张开发
2026/5/30 5:45:48 15 分钟阅读
学会VBA事件:让宏代码从手动执行变为自动执行
文章目录一、什么是 VBA 中的事件二、VBA 事件的整体分类2.1 工作簿事件Workbook Events详解2.2 工作表事件Worksheet Events详解2.3 应用程序级事件Application Events一、什么是 VBA 中的事件事件Event可以理解为某个对象发生了一个动作或状态变化比如用户点击了单元格修改了单元格内容打开或关闭了工作簿这些动作在 VBA 里都可以被捕获并触发对应的代码执行。也就是说事件 触发条件 自动执行的代码常见如下动作对应事件动作对应事件点击单元格SelectionChange修改单元格Change打开文件Workbook_Open关闭文件Workbook_BeforeClose这些事件不需要手动运行宏只要动作发生代码就会执行。二、VBA 事件的整体分类在 Excel VBA 中事件主要分为三大类应用程序级事件Application 级作用范围是整个 Excel 应用程序适合做全局监控、日志、统一控制工作簿事件Workbook 级作用范围是当前工作簿需要写在ThisWorkbook模块中不影响其他工作簿工作表事件Worksheet 级作用范围是某一张工作表需要写在具体工作表对象中可以参考如上图片工作簿事件直接写在ThisWorkbook模块而工作表需要下拉选择worksheet2.1 工作簿事件Workbook Events详解1. Workbook_Open —— 打开工作簿时触发当工作簿被打开完成后自动触发一般写在ThisWorkbook模块中常用于初始化变量自动登录等Private Sub Workbook_Open() MsgBox 欢迎使用本系统 End Sub2. Workbook_BeforeClose —— 关闭前触发用户关闭工作簿时在真正关闭之前触发此事件常用于防止误关闭、强制保存等Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox(确定要关闭吗, vbYesNo) vbNo Then Cancel True End If End Sub3. Workbook_SheetChange —— 任意工作表被修改Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Debug.Print 工作表 Sh.Name 被修改 End Sub需要注意的是真正的事件有很多可以在VBA编辑窗口下拉查看下面给大家总结一些列表如下事件名功能说明Workbook_Open打开工作簿时触发常用于初始化设置、欢迎提示、环境检查Workbook_BeforeClose关闭工作簿前触发可用于确认是否关闭、强制保存数据Workbook_Activate工作簿被激活时触发获得焦点Workbook_Deactivate工作簿失去焦点时触发Workbook_BeforeSave保存前触发可拦截保存或自定义保存逻辑Workbook_AfterSave保存完成后触发可用于提示或记录保存日志Workbook_NewSheet新建工作表时触发Workbook_SheetChange任意工作表的单元格内容发生改变时触发Workbook_SheetSelectionChange任意工作表的选中区域发生变化时触发Workbook_SheetActivate任意工作表被激活时触发Workbook_SheetDeactivate任意工作表被切换离开时触发Workbook_SheetBeforeDoubleClick任意工作表单元格被双击前触发可用于拦截默认编辑Workbook_SheetBeforeRightClick任意工作表右键单击前触发可自定义右键行为Workbook_WindowResize工作簿窗口大小发生改变时触发Workbook_WindowActivate工作簿窗口被激活时触发Workbook_WindowDeactivate工作簿窗口失去焦点时触发2.2 工作表事件Worksheet Events详解1. Worksheet_SelectionChange —— 选中单元格变化只要选中区域发生变化就触发常用于显示当前选中信息制作简易聚光灯等Private Sub Worksheet_SelectionChange(ByVal Target As Range) Me.Range(A1).Value Target.Address End Sub2. Worksheet_Change —— 单元格内容发生改变这是使用频率最高的事件之一常用于自动填充实时检验输入等Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column 1 Then Target.Offset(0, 1).Value Now End If End Sub但是需要注意一个问题事件递归如果你仅仅是想要响应用户的修改而不是事件自己的修改写法如下Application.EnableEvents False 修改单元格 Application.EnableEvents True这样在事件对单元格修改时不会再触发事件能够避免死循环触发事件。3. Worksheet_Activate / Deactivatesheet被激活或者失去焦点的时候触发常用于提示信息Private Sub Worksheet_Activate() MsgBox 进入该工作表 End Sub同样地我把主要的一些工作表事件总结如下事件名功能说明Worksheet_Activate工作表被激活切换到该表时触发Worksheet_Deactivate工作表被切换离开时触发Worksheet_SelectionChange工作表中选中单元格或区域发生变化时触发Worksheet_Change工作表中单元格内容发生改变时触发最常用Worksheet_BeforeDoubleClick单元格被双击前触发可拦截默认编辑行为Worksheet_BeforeRightClick单元格被右键单击前触发可自定义右键菜单Worksheet_Calculate工作表重新计算时触发公式结果变化Worksheet_FollowHyperlink单击工作表中的超链接时触发Worksheet_PivotTableUpdate该表中的数据透视表刷新完成后触发Worksheet_ChangeChart工作表中图表数据发生变化时触发较少使用2.3 应用程序级事件Application Events这是进阶玩法需要搭配类模块使用用的不多但是对于有些需求是不管哪个工作簿、哪个工作表只要发生某事就处理例如记录所有修改日志、监控用户操作、统一拦截打开文件等这个就能派上用场因此只做简单示范 类模块clsAppEvent Public WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) MsgBox 打开了 Wb.Name End Sub定义上述类模块后我们可以在普通模块中初始化实现应用级的监听Dim AppEvent As New clsAppEvent Sub StartListen() Set AppEvent.App Application End Sub学会VBA事件之后我们就可以 实现自动记录修改时间、限制用户输入等多样化的要求也就是说事件让 Excel 从“被动执行宏”变成“主动响应用户行为”。后续会继续分享更多VBA编程相关内容我是不懂代码的杰瑞学长我们下期再见如果觉得文章对你有帮助欢迎点赞 收藏 关注一起进步

更多文章