当前位置: 首页 > news >正文

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中选择另存为,保存类型选择“加载宏”,然后删除相应位置的“加载宏”文件。

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


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

http://www.jsqmd.com/news/245006/

相关文章:

  • BUUCTF-[ACTF2020 新生赛]Upload
  • 发刊不用愁:paperxie 期刊论文功能,一键匹配普通刊 / 核心刊的学术标准
  • 幂等性设计指南:从数据库唯一索引到 Redis Token,如何防止用户“手抖”重复提交?
  • PointMAE的代码配环境+运行
  • CMake:现代C/C++项目的构建中枢
  • 【MIMO通信】基于matlab MIMO检测器(ZF、MMSE、SIC、ML)在瑞利衰落下的BER性能比较【含Matlab源码 14929期】含报告
  • 8 款 AI 毕业论文写作工具实测:拯救你的学术秃头季
  • 锁定Nature!小样本学习是真的好发
  • 智能体反思模式:让AI从“会做“到“做好“的关键技术
  • 基于改进鲸鱼优化算法的微网系统能量优化管理Matlab源码
  • 大模型智能体工程实践:Rock Roll训练系统的构建与优化【收藏学习】
  • MyBatis:注解开发
  • 2026年AI产品市场格局:多模态崛起,音乐生成爆发,程序员必看
  • 【PaperXie毕业论文】从零到一的智能写作革命:AI如何重塑你的学术创作全流程
  • 大模型工程师转型攻略:无需985学历,四大核心能力助你轻松入行
  • 短剧广告联盟APP开发:数据对接与播放量、广告曝光量、收益联动统计方案
  • GEO营销全链路方案:附近搜索引流 + 到店优惠 + 会员裂变
  • 羟基聚乙二醇多巴胺,HO-PEG-Do试剂的全能应用图解
  • AI 赋能学术:paperxie 毕业论文功能,如何让硕士论文写作效率提升 80%?
  • paperxie 科研绘图:从流程图到专业图表,一键搞定学术可视化的 “高效工具”
  • 【智能音频翻译系统】
  • Paperxie 毕业论文:从选题到定稿的一站式智能写作解决方案
  • 大数据集成性能测试:JMeter压测ETL任务,找出性能瓶颈
  • 通信原理篇---第一类部分响应的预编码和相关编码
  • android16 rk3576修改音量曲线
  • JSON文件中显示为 \uXXXX 字符 的解决办法
  • MyBatis处理模糊查询
  • 如何用纯 HTML 文件实现 Vue.js 应用,并通过 CDN 引入 Element UI
  • MyBatis处理批量删除
  • 私有化大模型部署:企业AI落地的关键技术方案