Excel-事件(Workbook、Worksheet、Range、
OnKeyOnTime)
⼀、Excel事件介绍
Excel事件就是⼀个能被对象识别的操作。
当某个事件发⽣后⾃动运⾏的过程称为事件过程。事件过程也是Sub过程。
mousemove是什么键实践过程必须写在特定对象所在的模块中,⽽且只有过程所在的模块⾥的对象才能触发这个事件。
事件过程名由Excel⾃动设置,以“对象名称_事件名称”的形式存在,不能更改。
⼆、Worksheet事件
Worksheet事件是发⽣在Worksheet对象⾥的事件。事件过程必须写在对应的Worksheet对象⾥,只有过程所在的Worksheet对象⾥的操作才能触发该事件。
1、Worksheet_Change事件:⾃动提⽰更改的内容
Private Sub Worksheet_Change(ByVal Target As Range)    '⼊参中Target代表被选中的单元格
Application.EnableEvents = False '禁⽤事件
If Target.Column = 1Then
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 <> 1Then
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 CommandButton1_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)
CommandButton1.Top = CommandButton1.Top + t '重新设置改按钮的top属性值
CommandButton1.Left = CommandButton1.Left + l '重新设置改按钮的left属性值
End Sub
如果按钮跑远了,可以通过另外按钮Click事件设置参数
Private Sub CommandButton2_Click()
CommandButton1.Top = 15
CommandButton1.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时退出程序
If Application.Intersect(Target, Range("C3:C65536")) Is Nothing Or Target.Count > 1Then
Exit Sub
End If
Dim i As Integer
i = 3'参照表中第1条记录在第3⾏,所以初始值设置为3
Do While Cells(i, "I").Value <> ""
If UCase(Target.Value) = Cells(i, "I").Value Then
Application.EnableEvents = False'禁⽤事件,防⽌将字母改为商品名称时,再次执⾏程序
Target.Value = Cells(i, "i").Offset(0, 1).Value '写⼊产品名称
Target.Offset(0, -1).Value = Date'设置销售⽇期
Target.Offset(0, 1) = Cells(i, "I").Offset(0, 2).Value '写⼊商品代码
Target.Offset(0, 2) = Cells(i, "I").Offset(0, 3).Value '写⼊商品单价
Target.Offset(0, 3).Select '选中销售数量列,等待输⼊销售数量
Application.EnableEvents = True'重新启⽤事件
Exit Sub
End If
i = i + 1
Loop
End Sub
功能:在C列录⼊内容对应I列内容时,⾃动匹配其相关信息,更新销售⽇期,并把光标选中F列,等待输⼊销售数量。
2、我该监考哪⼀场
逻辑说明:
1、使⽤SelectionChange事件。
2、清除B3:Q22区域内所有单元格底纹颜⾊。
3、如果同时选中多个单元格,将选中区域内的第⼀个单元格赋值给Targer。
4、当选中的单元格不在区域B3:Q22时,退出事件。
5、遍历区域B3:Q22如果有值等于选中的单元格值,则突出显⽰。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("B3:Q22").Interior.ColorIndex = xlNone '清除单元格⾥原有底纹颜⾊
'当选中的单元格个数⼤于1时,重新给Target赋值
If Target.Count > 1Then
Set Target = Target.Cells(1)
End If
'当选中的单元格不包含指定区域的单元格时,退出程序
'Intersect⽅法返回参数指定的多个单元格的公共区域。参数⾄少是两个Range对象
If Application.Intersect(Target, Range("B3:Q22")) Is Nothing Then
Exit Sub
End If
Dim rng As Range
For Each rng In Range("B3:Q22")
If rng.Value = Target.Value Then
rng.Interior.ColorIndex = 39
End If
Next
End Sub
功能:光标选中单元格时,区域内跟单元格值⼀样的都会突出显⽰。
逻辑说明:
1、使⽤SelectionChange事件。
2、清除B3:Q22区域内所有单元格底纹颜⾊。
3、如果同时选中多个单元格,将选中区域内的第⼀个单元格赋值给Targer。
4、当选中的单元格不在区域B3:Q22时,退出事件。
5、突出(底纹)标志选中的单元格的⾏和列
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("B3:Q22").Interior.ColorIndex = xlNone '清除单元格⾥原有底纹颜⾊
'当选中的单元格个数⼤于1时,重新给Target赋值
If Target.Count > 1Then
Set Target = Target.Cells(1)
End If
'当选中的单元格不包含指定区域的单元格时,退出程序
'Intersect⽅法返回参数指定的多个单元格的公共区域。参数⾄少是两个Range对象
If Application.Intersect(Target, Range("B3:Q22")) Is Nothing Then
Exit Sub
End If
'    Dim rng As Range
'    For Each rng In Range("B3:Q22")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。