Excel事件(二)工作表事件

2019-10-13 16:17:38 浏览数 (3)

大家好,上节介绍了excel事件的基础知识,后面就按照事件的分类来介绍,本节将首先介绍vba程序开发中最常用的工作表事件。

一、工作表事件基础

上节已经说明过工作表worksheet对象事件过程必须在需要的worksheet对象中编写,也只有过程所在的worksheet对象里的操作,才可能触发该事件。

所以首先要明确需要编写的代码工作表。左侧工程资源管理窗口中双击选中的工作表。右侧会出现对应工作表的代码窗口。

依次在左上角列表中选择worksheet对象,再从右上列表中选择对应的工作表事件。代码窗口中会自动生成事件过程的外部结构,在事件过程中编写响应该事件的代码即可。

二、工作表事件分类

上图介绍工作表事件代码编写位置时,可以看到工作表对象对应有多种事件类型,最常用的9中工作表事件如下图所示:

工作表事件发生在工作表被激活、用户修改,以及更新工作表上的单元格或数据透视表时。

还是要再提醒由于一个工作簿通常有多个工作表,一定要在选中的工作表中编写事件代码。比如在“sheet1”表中编写了事件代码,在“sheet2”中操作是不会触发该事件的。

工作表事件的代码相对简单,重点是在和代码搭配使用,挑选典型的事件,通过示例来介绍。

三、change事件

工作表change事件,当过程所在工作表的单元格发生改变(包括外部链接引起单元格的更改时)自动运行程序,程序也必须在响应的工作表对象里。(这点后面不再强调)

在选中的工作表的代码窗口中,选择worksheet对象change事件,后代码窗口会自动生成事件的过程如下图:

过程代码中ByVal Target As Range中是过程的参数,ByVal表示”按值传递“的意思,Target是参数名称,as Range是表示Target参数是单元格对象类型。

当Worksheet_Change事件执行时,会将操作的单元格Range对象传递到参数targe中,然后就用来对参数进行判断,来空值用户对参数的更改。

示例一

更改单元格的数据后,弹窗显示更改的单元格地址。(注意事件的代码不需要去运行)。

示例选中worksheet的change事件,系统自动生成结构代码,在过程中加入代码

MsgBox "更改的单元格地址是:" & Target.Address。即选中的工作表中单元格就触发change事件,此时将更改的单元格,作为参数传递给参数Target (target是单元格对象类型参数)。所以Target.Address即更改的单元格的地址,在弹窗中显示。

示例二

单元格数据发生更改时,在标注的内容前加上标识”内容已更改 “(这个示例主要是帮助理解什么时候需要禁用和启用事件)。

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

Target.Value = "内容已更改 " & Target.Value

Application.EnableEvents = True

End Sub

代码Target.Value = "内容已更改 " & Target.Value表示更改的单元格值为“内容已更改”加上原来单元格的值。

Application.EnableEvents 的表示事件的状态,false为禁止事件,true为开启事件。

(代码中为什么要先禁止事件再开启事件呢?假设不禁止事件。用户修改单元格内容时,触发一次change事件,中间代码也修改单元格内容中加入了“内容已更改”,这也会再一次触发了change事件,第二次在单元格值前加入”内容已更改“标识,循环触发下去。)

所以用户修改单元格的内容时,先触发了代码运行后。要先禁止事件。让中间的代码去添加“内容已更改”标识。此时因为禁止事件而不会触发,修改完之后再恢复事件开启即可。

四、selectchange事件

工作表的选定区域发生改变时触发此事件,自动运行程序,程序也必须在响应的工作表对象里。

其中ByVal Target As Range与上个事件相同,参数target也是单元格类型,触发事件时,选定的单元格会传递给参数target。

示例

平时使用excel如果多列数据,选某个单元格的数据时容易选错行。那么下么就通过selectchange事件来实现,选中一个单元格时,所在行的单元格填上颜色。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

cells.Interior.ColorIndex = xlNone

Target.EntireRow.Interior.ColorIndex = 15

End Sub

代码中,当选中一个单元格时,触发selectchange事件,首先cells.Interior.ColorIndex = xlNone表示取消所有单元格(cells)的底色,(如果没有这一句代码,触发事件后的颜色会保留。)。

更改的单元格值传递到参数target中,然后单元格所在的行的背景颜色改为灰色。Target.EntireRow.Interior.ColorIndex = 15,达到我们的要求。再更改别的单元格时,颜色也会跟着更改。

大家可以尝试下让选中的单元格所在的行和列都标注颜色。

五、activate事件

工作表事件,图表工作表或嵌入式图表时触发activate激活事件。

代码较简单,直接演示示例,在汇总表中加入activate事件代码,出发时弹窗提示工作名称。

与activate事件想对应的还有deactivate事件,即工作表由活动状态变为不活动状态时触发的事件。

比如示例当选中除汇总表之外的其他工作表时,弹窗提示不允许选择,同时选择的工作表变为sheet3汇总表。

Private Sub Worksheet_Deactivate()

MsgBox "不允许编辑汇总表之外的其他工作表"

Worksheets("汇总表").Select

End Sub

当选中其他工作表,汇总表编程不活动状态时,即触发事件弹窗,然后重新选择汇总表。(使用户无法选择汇总表以外的表格)

六、beforerightclick事件

在工作表上单击鼠标右键会触发此事件,此事件先于默认的单击鼠标右键的操作。所以该事件可以用于取代默认的右键快捷键菜单操作,

选择worksheet工作表的beforerightclick事件。

生成的结构代码中,有两个参数,其中Target参数形式这前面一样,表示鼠标右键发生时靠近鼠标指针的单元格,Cancel As Boolean,是将cancel参数定义为布尔型变量Boolean。当cancel事件发生时为false,如果事件过程将此参数设为true,则在完成此过程后,不执行默认的单价鼠标右键操作。

比如在工作表中禁用右键,只需要将cancel参数设置为true即可。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True

End Sub


本节主要介绍了最常用的工作表事件,了解事件的参数的使用,以及对关闭或开启事件如何使用。可以收藏方便后期查看。

后期可能会补充示例复习回顾,下节会介绍工作簿事件,祝大家学习快乐。


0 人点赞