[TOC] > Thu Apr 29 2021 12:49:45 GMT+0800 (GMT+08:00) 自动化事件,其实就是自动触发的宏(不需要手动执行),响应一些特定操作之后自动触发执行。 ## 应用层 应用在工作表(Worksheet)上就用 `Application_SheetXXX`这些。 * Application_NewWorkbook(),创建新工作簿时做点什么 * Application_SheetActivate(Sh) ,工作表激活时做点什么 * Application_SheetBeforeDelete(Sh) , 工作表被删除之前做点什么 * Application_SheetBeforeDoubleClick(Sh, rg, cancel) ,双击工作表之前做点什么 * Application_SheetBeforeRightClick(Sh, rg, cancel) ,鼠标右键点击之前做点什么 * Application_SheetCalculate(Sh) ,工作表重新计算(按<kbd>F9</kbd>)时做点什么 * Application_SheetChange(Sh, rg),工作表发生变化时做点什么 * Application_SheetDeactivate(Sh),工作表失去激活状态时做点什么 * Application_SheetFollowHyperlink(Sh, Target), * Application_SheetSelectionChange(Sh, Target),主要是响应单元格 Select() 动作(点选单元格),可以理解为被点时做点什么 > 我这里只是简化描述,实际上跟我说的会有出入——因为事件是讲究触发时机的。具体大家可自行在开发文档中细看。 ## 文件层 针对工作簿( Workbook )的: * Workbook_Activate(),激活工作簿时做点什么 * Workbook_AfterSave(Success),工作簿保存之后做点 * Workbook_BeforeClose(Cancel),工作簿关闭之前做点什么 * Workbook_BeforePrint(Cancel),打印之前做点什么 * Workbook_BeforeSave(SaveAsUI, Cancel),保存之前做点什么 * Workbook_Deactivate(),工作簿失去激活状态时做点什么 * Workbook_NewChart(Ch),工作簿中插入Chart 对象时做点什么 * Workbook_NewSheet(Sh), 新增工作表时做点什么 * Workbook_Open(),工作簿打开时做点什么 * Workbook_SheetActivate(Sh),工作表激活时做点什么 > 我这里只是简化描述,实际上跟我说的会有出入——因为事件是讲究触发时机的。具体大家可自行在开发文档中细看。 ## 注意 这些事件几乎时刻都在发生,你使用的时候要明白: 1. 有时候不是异步的,你部署在事件函数中的代码执行完之后,事件才算结束。拿工作表激活事件来说,只有等你的代码全部执行完,才能显示工作表的内容。因此你可能会等待一段时间。多久取决于代码执行完成的花费的时间。 2. 对于发生十分频繁的事件,尽量少部署代码,否则你可能永远在等进度条的路上。比如 Application_SheetSelectionChange(Sh, Target) 事件,响应你的每一次点击!!!点完都会跑一遍。 ## 使用方法 1. 不带参数的事件,凡是触发必执行。 2. 带参数的事件,你可以根据参数返回值判断如何执行(它的参数不是要你填充的,而是提供给你在内部用的) > 准确地说不是参数,而是回调 例子: ```js // 改成别的变量名(不用默认值)的情况 function Application_SheetSelectionChange(a, r) { Console.log(a.Name) Console.log(r.Address()) } // 去掉参数 function Application_SheetSelectionChange() { Console.log(123) } // 省略参数的 function Application_SheetSelectionChange(undefined,r) { Console.log(r.Address()) } ``` 你可以直接把处理逻辑部署在事件函数内部,也可以事先准备好,然后在事件函数内部使用: ```js function Application_SheetSelectionChange(undefined,r) { Range("A1").Value2 = r.Value } // 推荐另外定义后调用、执行 ↓ function _fn_changeA1(selectRange){ Range("A1").Value2 = selectRange.Value } function Application_SheetSelectionChange(undefined,r) { _fn_changeA1(r) // 因为你可能有很多事情要部署在这个事件中 // _fn_x() // _fn_xxx() // …… // 太混乱的话就不好打理了。 } ```