Excel-事件(Workbook、Worksheet、Range、OnKey/OnTime)
2022-08-26 10:50阅读:
一、Excel事件介绍
Excel事件就是一个能被对象识别的操作。
当某个事件发生后自动运行的过程称为事件过程。事件过程也是Sub过程。
实践过程必须写在特定对象所在的模块中,而且只有过程所在的模块里的对象才能触发这个事件。
事件过程名由Excel自动设置,以“对象名称_事件名称”的形式存在,不能更改。
二、Worksheet事件
Worksheet事件是发生在Worksheet对象里的事件。事件过程必须写在对应的Worksheet对象里,只有过程所在的Worksheet对象里的操作才能触发该事件。
1、Worksheet_Change事件:自动提示更改的内容
Private Sub
Worksheet_Change(
ByVal Target
As Range)
'入参中Target代表被选中的单元格
Application.EnableEvents = False '禁用事件 If
Target.Column =
1
Then MsgBox Target.Address &
'单元格的值被修改为:' &
Target.Value End If
Application.EnableEvents = True '启用事件 End
Sub

2、Worksheet_SelectionChange事件:你选中了谁
可以用此事件来记录Excel单元格修改前的旧值。
Private Sub
Worksheet_SelectionChange(
ByVal Target
As
Range) Dim oldvalue
As
String MsgBox
'当前选中的单元格区域为:' &
Target.Address oldvalue =
Target.Value
If Target.Column <>
1
Then Cells(Target.Row,
'A').Select
End If End Sub

3、Worksheet_Activate事件:自动提示工作表名
Private Sub
Worksheet_Activate() MsgBox
'当前活动工作表为:' &
ActiveSheet.Name End Sub
4、Worksheet_Deactivate事件:禁止选中其他工作表
Private Sub
Worksheet_Deactivate() MsgBox
'不允许选中' &
ActiveSheet.Name &
'工作表外的其他工作表'
Worksheets('Sheet1').Select
End Sub
5、Worksheet事件列表
Worksheet对象一共有9个事件可供使用。
三、Workbook事件
Workbook事件是发生在Workbook对象里的事件,进入VBE后可以看到ThisWorkbook模块。这个模块专门用来保存Workbook对象的事件过程,Workbook对象的事件过程只有保存在这个模板里才能被Excel识别

1、OPen事件
Workbook_Open事件告诉Excel,当打开工作簿时自动运行程序。
Private Sub Workbook_Open()
Worksheets(1).Select End
Sub
2、BeforeClose事件
每次关闭工作簿都会自动运行程序
Private Sub Workbook_BeforeClose(Cancel
As Boolean)
'判断用户单击对话框中的哪个按钮,如果按下的是【否】,则修改参数的值为True
If
MsgBox(
'你确定要关闭工作簿吗?',
vbYesNo) = vbNo
Then
'变量Cancel是程序参数,如果为True,则取消关闭工作簿 Cancel =
True '取消关闭 End
If End Sub

3、Workbook_SheetChange事件
当工作簿里任意一个单元格被更改时,自动运行程序。
Private Sub
Workbook_SheetChange(
ByVal Sh
As
Object,
ByVal Target
As
Range)
'这里入参Sh代表发生更改的单元格所在的工作表,Target表示被更改的单元格
MsgBox
'当前更改的工作表为:' & Sh.Name
&
Chr(
13) &
_
'发生更改的单元格地址为:' &
Target.Address End Sub
4、Workbook事件列表
四、其他事件
1、MouseMove事件
当鼠标指针移动到按钮上时,按钮迅速闪开。鼠标和按钮就像老鹰捉小鸡游戏,这样的效果可以用MouseMove实现。
添加一个按钮:通过“视图”——“工具栏”——“控件工具箱”添加,或者通过“开发人员选项”——“插入”——“ActiveX控件”——“命令按钮”
右键按钮查看代码(修改按钮上文字通过Caption属性修改),编辑按钮和完成事件逻辑
'MouseMove事件告诉Excel,当鼠标指针在cmd按钮上移动是自动运行程序
Private Sub
Commanon1_MouseMove(
ByVal Button
As
Integer,
ByVal Shift
As
Integer,
ByVal X
As
Single,
ByVal Y
As
Single) Dim l
As Integer, t
As
Integer l =
Int(
Rnd() *
10 +
125) * (
Int(
Rnd() *
3 +
1) -
2)
'生成随机数 t =
Int(
Rnd() *
10 +
30) * (
Int(
Rnd() *
3 +
1) -
2)
Commanon1.Top = Commanon1.Top + t
'重新设置改按钮的top属性值 Commanon1.Left =
Commanon1.Left + l
'重新设置改按钮的left属性值
End Sub

如果按钮跑远了,可以通过另外按钮Click事件设置参数
Private Sub Commanon2_Click()
Commanon1.Top =
15 Commanon1.Left
=
160 End Sub

2、不是事件的事件-Application对象的OnKey方法
除了对象的事件,Application对象还有两种方法,可以像事件一样让程序自动运行,分别是OnKey和OnTime
OnKey方法告诉Excel,当在键盘上按下指定键或组合键时自动运行程序。
运行ok过程,返回工作表按下Shift+e组合键即可自动运行Test
Sub ok() Application.OnKey
'+e',
'test'
'当按下Shift+e组合键时,运行参test过程 End
Sub Sub Test() MsgBox
'你好,我在学习OnKey方法' End
Sub

3、不是事件的事件-Application对象的OnTime方法
OnTime方法告诉Excel,当到指定的时间时自动运行程序(可以是指定的某个时间,也可以是指定的某个时间之后)
Sub ot()
'一个小时后,自动运行Test过程 Application.OnTime
Now() +
TimeValue(
'01:00:00'),
'test' End Sub
Sub Test() MsgBox
'你好,你已经连续工作一个小时了,请注意休息!'
End Sub

无论是OnKey还是OnTime想要让指定程序自动运行,都必须先运行该方法所在的程序,如果不运行ok或ot过程,指定的Test都不会自动运行。
如果想省去手动执行ok和ot的步骤,可以在ThisWorkbook增加如下事件过程:
Private Sub Workbook_Open()
Call ok
'运行ok过程
Call ot
'运行ot过程 End
Sub
五、事件实例
1、一举多得,快速录入数据
逻辑说明:
1、通过工作表的Change事件触发
2、如果C3:C65536为空,或者修改单元格数量大于1,则退出事件
3、读取“I”列数据,从第3行开始循环,读取非空数值
4、如果输入的值等于I列里的值,则进入处理逻辑
5、禁止事件,防止将字母更改为商品名称时,再次执行程序
6、目标单元格写入“产品名称”
7、目标单元格向左移动一格,写入“销售日期”
8、目标单元格向右移动一格,写入“商品代码”
9、目标单元格向右移动二格,写入“商品单价”
10、目标单元格向右移动三个,获取焦点(选中),等待输入“销售数量”
11、重启事件并退出事件
12、循环递增
Private Sub
Worksheet_Change(
ByVal Target
As
Range)
'如果更改的单元格不是C列第3行以下的单元格或更改的单元格个数大于1时退出程序