Worksheet.Change 事件
当用户更改工作表中的单元格,或外部链接引起单元格的更改时发生此事件。
语法:Change(Target)
Target 必选,代表更改的区域,可以是多个单元格。
当单元格在重新计算过程中更改时,将不会发生该事件。使用 Calculate 事件可以捕获工作表重新计算。
关于Change事件何时触发何时不触发,下面几种情况有必要了解:
设置单元格的格式不会触发,但是清除格式,粘贴格式,格式刷会触发。
合并单元格,取消合并单元格不会触发事件
针对单元格的批注操作是不会触发事件的,象新建,删除,修改批注。
双击单元格(或F2)后进入编辑模式后,不输入任何内容回车,或直接跳转到其他单元格均会触发
单元格内的公式自动重新计算(或者按F9手工重新计算)不会触发此事件
直接删除一个空的单元格也会触发事件
有的Excel命令操作单元格会触发,有的不会触发,象排序,合并不会触发,但清除格式会。
用VBA代码操作单元格时,是否会触发参考以上几条。
Worksheet.SelectionChange 事件
当工作表上的选定区域发生改变时发生此事件。
语法:SelectionChange(Target)
Target 必选,代表新选定的区域。
示例:
Private Sub Worksheet_SelectionChange(ByValTarget As Range)
With ActiveWindow
.ScrollRow = Target.Row
.ScrollColumn = Target.Column
End With
End Sub
本示例滚动工作簿窗口,让选定区域位于窗口的左上角。
Worksheet.FollowHyperlink 事件
当单击工作表上的任意超链接时,发生此事件。
对于应用程序级或工作簿级的事件,请参阅 SheetFollowHyperlink 事件和 SheetFollowHyperlink Event 事件。
语法:FollowHyperlink(Target)
Target 必选,代表超链接目标的 Hyperlink对象。
示例:
Private Sub Worksheet_FollowHyperlink(ByValTarget As Hyperlink)
With UserForm1
.ListBox1.AddItem Target.Address
.Show
End With
End Sub
本示例对在活动工作簿中访问过的所有链接保留一个列表或历史记录。
Worksheet.Calculate 事件
对于 Worksheet 对象,在对工作表进行重新计算之后发生此事件。
示例:
Private Sub Worksheet_Calculate()
Columns('A:F').AutoFit
End Sub
每当重新计算工作表后,此示例会调整 A 列到 F 列的宽度。
工作表事件基本上就这么多,常用的也就几个。
对于数透表来说,也有提供了相关的数据透视表事件,会数据透视表的童鞋没事可以去折腾下。
Worksheet.PivotTableAfterValueChange 事件
在编辑或重新计算(对于包含公式的单元格)数据透视表中的单元格或单元格区域后发生。
Worksheet.PivotTableBeforeAllocateChanges 事件
在将更改应用到数据透视表前发生。
Worksheet.PivotTableBeforeCommitChanges 事件
在向数据透视表的 OLAP 数据源提交更改之前发生。
Worksheet.PivotTableBeforeDiscardChanges 事件
在放弃对数据透视表所做的更改之前发生。
Worksheet.PivotTableChangeSync 事件
在更改数据透视表之后发生。
Worksheet.PivotTableUpdate 事件
工作簿中的数据透视表更新后发生此事件。
补充资料:
关于在事件过程代码内避免再次触发事件(事件循环)。
先看以下代码:
Private Sub Worksheet_Change(ByVal TargetAs Range)
If Len(Target.Value) Then
Target.Offset(1, 1) = Target.Value + 1
End If
End Sub
当在事件过程所在的工作表内的A1单元格内输入1回车后,会触发Change事件。
执行到事件代码后,先检测触事件的单元格内是否有输入任何内容。
如果有输入,就在单元格的右下角内填入2。
Target往下偏移一行,往右移一列所在的单元格,即A1的右下角为B2。
代码修改了A2单元格内的值,再次触发事件,如此反复运行。
我的是WIN7系统+OFFICE 2010,最后填充到了CR96单元格(单元格内的值为96).
此次事件循环触发了多少次已经尽显。
代码原有的本意是只运行一次,即在当前了数值的单元格右下角填入数据。
为了解决这个事件触发循环的问题,可以用Application对象的EnableEvents属性来解决。
通过修改EnableEvents属性为False,可以实现禁用事件。
以上面代码举例就是修改Target右下角的单元格不会再次触发Change事件,这样可以避免事件循环。
当代码操作完后,记得再次启用事件,否则事件代码是不会被触发的。
很多新手在用这个属性时,经常会忘了在代码结束前启用事件。
上面的代码改完后如下:
Private Sub Worksheet_Change(ByVal TargetAs Range)
If Target.Count > 1 Then Exit Sub
'当一次改变多个单元格的值时忽略
If Len(Target.Value) Then
'检测单元格内是否有输入内容
Application.EnableEvents = False
Target.Offset(1, 1) = Val(Target.Value) + 1
Application.EnableEvents = True
End If
End Sub
查看所有烟花VBA教程,点击“阅读原文”
联系客服