news 2026/5/1 10:18:38

Excel VBA 编程基础学习笔记 · 第四章:事件编程 - 打造智能交互的自动化引擎

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Excel VBA 编程基础学习笔记 · 第四章:事件编程 - 打造智能交互的自动化引擎

目录

第四课:Excel VBA事件过程

1、EXCEL事件程序定义与作用

2、事件程序基础

3、工作表事件实例1(自选计算与投票统计)

4、工作表事件实例2(状态栏地址与防工作表名更改)

5、工作表事件实例3(自动列出工作表名与单元格区域保护)

6、工作簿事件实例1(自动选择月份表、右键禁用、打印控制)

7、工作簿事件实例2(给工作表加密码)

8、应用程序事件基础与实例


本章将解锁VBA的真正威力:无需手动运行宏,让Excel自动响应你的每一个操作。

第四课:Excel VBA事件过程

1、EXCEL事件程序定义与作用

excel事件程序:因一个操作(动作)而触发一个程序,让程序发生运行

事件类型代码位置
工作表事件工作表
工作簿事件工作簿(ThisWorkbook)
程序事件工作簿(ThisWorkbook)或类模块
应用程序事件事件说明
NewWorkbook当新建一个工作簿时发生此事件。
SheetActivate当激活任何工作表时发生此事件。
SheetBeforeDoubleClick在双击任何工作表前发生此事件。
SheetBeforeRightClick在右键单击任何工作表前发生此事件。
SheetCalculate在重新计算工作表时发生此事件。
SheetChange更改任何工作表的单元格时发生此事件。
SheetDeactivate当工作表失去焦点时发生此事件(离开工作表时)。
SheetFollowHyperlink在单击工作簿中的任何超链接时发生。
SheetPivotTableUpdate在更新数据透视表的工作表后发生。
SheetSelectionChange所选内容在任何工作表上更改时发生。
WindowActivate在激活任何工作簿窗口时发生。
WindowDeactivate工作簿的窗口变为非活动状态时,将产生本事件。
WindowResize改变工作簿窗口大小时发生。
WorkbookActivate当激活任何工作簿时发生此事件。
WorkbookAddinInstall工作簿作为加载宏安装时发生此事件。
WorkbookAddinUninstall当任一工作簿作为加载宏卸载时发生。
WorkbookAfterXmlExport在保存或导出工作簿中的XML数据之后发生此事件。
WorkbookAfterXmlImport当刷新现有的XML数据链接或新的XML数据被导入任一打开的Excel工作簿之后时发生。
WorkbookBeforeClose关闭任何工作簿前发生此事件。
WorkbookBeforePrint在打印工作簿前发生此事件。
WorkbookBeforeSave在保存任何工作簿前发生此事件。
WorkbookBeforeXmlExport保存或导出XML数据前发生的事件。
WorkbookBeforeXmlImport当刷新现有的XML数据链接或新的XML数据被导入任一打开的Excel工作簿之前时发生。
WorkbookDeactivate当打开的工作簿转为非活动状态时发生此事件。
WorkbookNewSheet在任何打开的工作簿中新建工作表时发生此事件。
WorkbookOpen当打开一个工作簿时发生此事件。
WorkbookPivotTableCloseConnection在数据透视表的连接关闭之后发生此事件。
WorkbookPivotTableOpenConnection在数据透视表的连接打开之后发生此事件。
WorkbookRowsetComplete如果用户在OLAP数据透视表上深化记录集或调用行集操作,则会发生此事件。
WorkbookSync当作为“文档工作区”一部分的工作簿的本地副本与服务器上的副本进行同步时发生此事件。
工作簿事件事件说明
Activate激活工作簿、工作表、图表工作表或嵌入式图表时发生此事件。
AddinInstall当工作簿作为加载宏安装时,发生此事件。
AddinUninstall当工作簿作为加载宏卸载时,发生此事件。
AfterXmlExport在Excel保存或导出指定工作簿中的XML数据之后发生此事件。
AfterXmlImport在刷新现有的XML数据链接或将新的XML数据导入到指定的Excel工作簿之后,发生此事件。
BeforeClose在关闭工作簿之前,先产生此事件。如果该工作簿已经更改过,则本事件在询问用户是否保存更改之前产生。
BeforePrint在打印指定工作簿(或者其中的任何内容)之前,发生此事件。
BeforeSave保存工作簿之前发生此事件。
BeforeXmlExport在Excel保存或导出指定工作簿中的XML数据之前发生此事件。
BeforeXmlImport在刷新现有的XML数据链接或将新的XML数据导入到指定的Excel工作簿之前,发生此事件。
Deactivate图表、工作表或工作簿被停用时发生此事件。
NewSheet当在工作簿中新建工作表时发生此事件。
Open打开工作簿时,发生此事件。
PivotTableCloseConnection数据透视表关闭与其数据源的链接后发生此事件。
PivotTableOpenConnection数据透视表打开与其数据源的链接后发生此事件。
RowsetComplete如果用户在OLAP数据透视表上深化记录集或调用行集操作,则会引发此事件。
SheetActivate激活任何工作表时发生此事件。
SheetBeforeDoubleClick当双击任何工作表时发生此事件,此事件先于默认的双击操作发生。
SheetBeforeRightClick右键单击任一工作表时发生此事件,此事件先于默认的右键单击操作。
SheetCalculate在重新计算工作表时或在图表上绘制更改的数据之后发生此事件。
SheetChange当用户或外部链接更改了任何工作表中的单元格时发生此事件。
SheetDeactivate当任何工作表停用时发生此事件。
SheetFollowHyperlink单击Excel中的任何超链接时发生此事件。
SheetPivotTableUpdate在数据透视表的工作表更新之后发生此事件。
SheetSelectionChange任一工作表的选定区域发生更改时,将发生此事件。
Sync当作为“文档工作区”一部分的工作表的本地副本与服务器上的副本进行同步时,发生此事件。
WindowActivate工作簿窗口被停用时发生此事件。
WindowDeactivate任何工作簿窗口调整大小时发生此事件。
WindowResize任何工作簿窗口被停用时发生此事件。
工作表事件事件说明
Activate激活工作簿、工作表、图表等时发生的事件。
BeforeDoubleClick在工作表中双击前发生的事件。
BeforeRightClick在工作表中右键单击前发生的事件。
Calculate工作表重新计算之后发生的事件。
Change更改工作表中的单元格发生的事件。
Deactivate工作表、图表停用(焦点离开)时发生的事件。
FollowHyperlink单击工作表上的任意超链接时,发生此事件。
PivotTableUpdate工作簿中的数据透视表更新后发生此事件。
SelectionChange工作表上选定区域发生改变时发生的事件(点击单元格、拖动区域选择等都会发生)。

2、事件程序基础

'以下是sheet8中的事件程序

'Change这个事件非常有用

PrivateSubWorksheet_Change(ByVal TargetAsRange)'在单元格中输入新的内容,然后回车或者焦点离开这个单元格后发生的事件

IfTarget.Address = "$J$9"Then模块1代码之程序调用测试'$J$9不能写成$j$9,因为它区分大小写

EndSub

'以下是thisworkbook中的事件

PrivateSubWorkbook_NewSheet(ByVal ShAsObject)

On Error Resume Next

i = InputBox("请输入工作表的名称")

Sh.Name = i

EndSub

'以下是禁止操作工作表的代码

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

IfTarget.Address <> "$A$1"Then[a1].Activate

EndSub

代码保护:工具--VBAProject属性-保护,然后设置密码(“查看时锁定工程”要打上勾)

3、工作表事件实例1(自选计算与投票统计)

'以下是sheet5的选择变化事件:投票统计

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

On Error Resume Next

IfTarget.Address = "$I$4"OrTarget.Address = "$J$4"OrTarget.Address = "$K$4"Then

Target.Value = Target.Value + 1

EndIf

EndSub

'以下是sheet1的选择变化事件中(自动计算)

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

Dima%, b%

ForEachrngInTarget

a = rng.Row

b = rng.Column

Cells(a, b + 1) = "=" & rng

Next

EndSub

4、工作表事件实例2(状态栏地址与防工作表名更改)

'以下是sheet9中防止修改工作表名的代码

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

IfSheet9.Name <> "需要保存"ThenSheet9.Name = "需要保存"

EndSub

'以下是sheet1中SelectionChange代码的

'在状态栏上显示出当前所选单元格区域的地址:

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

Target.Address(0, 0)显示的是相对地址格式,如A1:C9

Application.StatusBar = "当前所选区域是:" & Target.Address(0, 0)

Target.Address显示的是绝对地址格式: 如$A$1:$C$9

Application.StatusBar = "当前所选区域是:" & Target.Address

EndSub

PrivateSubWorksheet_Deactivate()

Application.StatusBar = ""'离开这个工作表后,状态的信息清空

EndSub

'以上两段代码要配合使用,才完美!如果要让每个工作表都有以上功能则可以把它升级为工作簿事件,详见下段代码

'以下是thisworkbook中的事件程序

PrivateSubWorkbook_SheetSelectionChange(ByVal ShAsObject, ByVal TargetAsRange)

Application.StatusBar = "当前所选区域是:" & Target.Address(0, 0)

EndSub

PrivateSubWorkbook_SheetDeactivate(ByVal ShAsObject)

Application.StatusBar = ""

EndSub

5、工作表事件实例3(自动列出工作表名与单元格区域保护)

'以下是sheet2中事件程序(自动列出所有工作表名)

Private SubWorksheet_Activate()

ForEachShInSheets

k = k + 1

Cells(k, "m") = Sh.Name

Next

EndSub

'以下是sheet6中的事件程序(单元格区域保护)

PrivateSubWorksheet_SelectionChange(ByVal TargetAsRange)

IfIntersect(Target, [a1:d6])IsNothingThen

MsgBox "你只能在[a1:d6]区域中工作"

[A1].Select

EndIf

EndSub

'以上代码是不严谨的,只要所选区域跟[a1:d6]区域有交集,则上面代码不会被执行。

6、工作簿事件实例1(自动选择月份表、右键禁用、打印控制)

'以下是thisworkbook中事件程序(自动选择激活工作表)

'打开工作簿时自动选择激活工作表

PrivateSubWorkbook_Open()

mon = Format(Now(), "m")

Sheets(mon & "月").Select

EndSub

'以下是thisworkbook中事件程序(禁用右键)

PrivateSubWorkbook_SheetBeforeRightClick(ByVal ShAsObject, ByVal TargetAsRange, CancelAsBoolean)

Cancel =True

EndSub

'以下是thisworkbook中事件程序(禁止打印)

'禁止打印

PrivateSubWorkbook_BeforePrint(CancelAsBoolean)

IfMonth(Now()) & "月" <> ActiveSheet.NameThen

MsgBox "不能打印"

Cancel =True

Else

MsgBox "能打印"

Cancel =False

EndIf

EndSub

7、工作簿事件实例2(给工作表加密码)

'*************************以下是给工作表加密码的两段代码**********************

'1、下面是要加密的工作表的工作表事件

PrivateSubWorksheet_Activate()

a = InputBox("请输入密码")

Ifa = 123Then

Cells.Font.Color = RGB(0, 0, 0)

Application.EnableEvents =False'禁用当前的事件程序,以免每次激活此表都提示输入密码

Else

Sheet1.Activate

EndIf

EndSub

'2、下面是thisworkbook中的事件:

PrivateSubWorkbook_Open()

Application.EnableEvents =True'配合前面的Application.EnableEvents = False 使用

Sheet20.Cells.Font.Color= RGB(255, 255, 255)

EndSub

8、应用程序事件基础与实例

'应用程序事件:每个打开工作簿因操作所发生的事件

'应用程序事件代码位置:thisworkbook或者类模块

'应用程序事件代码在thisworkbook中存在的先决条件:

' 1、申明变量

' Public WithEvents app As Excel.Application

' 2、工作簿打开时运行:

PrivateSubWorkbook_Open()

Set app = Excel.Application

EndSub

'

' 3、将1、2中的代码写在thisworkbook中,并保存为“加载宏”文件(xlam)

' 4、在加载宏菜单中加载第3步保存的加载宏文件。目的:任何时候都能依附在excel文件中

'

'实例:禁止新增工作表

' 1、以下是thisworkbook中的代码:

Public WithEvents appAsExcel.Application'申明变量

PrivateSubWorkbook_Open()

Set app = Excel.Application

EndSub

PrivateSubapp_WorkbookNewSheet(ByVal WbAsWorkbook, ByVal ShAsObject)

Application.DisplayAlerts =False

MsgBox "你没有权限新增工作表"

Sh.Delete

Application.DisplayAlerts =True

EndSub

'删除“加载宏”文件的办法:在excel中选择另存为,保存类型选择“加载宏”,然后删除相应位置的“加载宏”文件。

'然后,在加载项中去掉相应“加载宏”文件前的勾


计算机科学与技术 & 计算机网络技术:双专业课程体系完全导航指南

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 9:32:32

JSON文件中显示为 \uXXXX 字符 的解决办法

在JSON文件中&#xff0c;有些字段值是直接使用汉字&#xff0c;而有些字段值则是以 \u 开头的字符&#xff0c;这是因为&#xff1a;✅ 正确显示的汉字&#xff1a;这些是正常编码的中文字符&#xff0c;文件保存格式为 UTF-8&#xff0c;浏览器或编辑器能正确识别并显示为中文…

作者头像 李华
网站建设 2026/5/1 9:30:50

私有化大模型部署:企业AI落地的关键技术方案

私有化大模型部署:企业AI落地的关键技术方案 引言:为什么企业需要私有化大模型? 1. 企业的「AI落地痛点」 当企业尝试用AI解决实际问题时,公有云大模型(如GPT-4、文心一言) 往往无法满足核心需求: 数据隐私风险:金融、医疗等行业的敏感数据(如客户交易记录、患者病…

作者头像 李华
网站建设 2026/5/1 9:30:45

救命神器8个AI论文工具,专科生搞定毕业论文+格式规范!

救命神器8个AI论文工具&#xff0c;专科生搞定毕业论文格式规范&#xff01; 专科生的毕业论文救星&#xff0c;AI 工具如何改变你的写作方式&#xff1f; 对于很多专科生来说&#xff0c;毕业论文不仅是一次学术训练&#xff0c;更是一场与时间、压力和知识盲区的较量。尤其是…

作者头像 李华
网站建设 2026/5/1 4:39:15

SRAM 芯片容量计算及常见型号速查表

IS62WV51216 SRAM 芯片容量计算及常见型号速查表 IS62WV51216 的总容量为 1MB&#xff08;字节&#xff09;&#xff0c;计算核心是拆解型号中的关键参数&#xff0c;结合 SRAM 容量计算公式推导。 一、型号参数拆解 ISSI 公司的 IS62WV 系列 SRAM 型号命名有明确规律&#xff…

作者头像 李华
网站建设 2026/4/29 2:06:03

单片机基础知识 -- HADDR

STM32中HADDR的完整解析 一、HADDR的基础定义&#xff08;必记核心&#xff09; HADDR AHB Peripheral Address Bus&#xff0c;中文全称&#xff1a;AHB外设地址总线。 它是STM32单片机内部 高速AHB总线&#xff08;Advanced High-performance Bus&#xff09; 的专属地址总线…

作者头像 李华