VBA中事件的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VBA中事件的应用

在Excel VBA中,事件是指对象可以辨认的动作。用户可以指定VBA代码来对这些动作做出响应。Excel可以监视多种不同类型的事件,Excel中的工作表、工作簿、应用程序、图表工作表、透视表和控件等对象都可以响应事件,而且每个对象都有多种相关的事件。

48.1 事件过程

事件过程作为一种特殊的Sub过程,在满足特定条件时被触发执行,如果事件过程包含参数,系统会为相关参数赋值。事件过程必须写入相应的模块中才能发挥其作用,例如:工作簿事件过程须写入ThisWorkbook模块中,工作表事件过程则须写入相应的工作表模块中,且只有过程所在工作表的行为可以触发该事件。

事件过程作为一种特殊的Sub过程,在VBA中已经规定了每个事件过程的名称和参数,当然用户可以利用键盘在代码窗口中手工输入事件过程的全部代码,但是更方便快捷的方法是在代码窗口中选择相应的对象和事件,VBE将自动在代码窗口中添加事件过程的声明语句和过程结束语句。

在代码窗口上部左侧的对象下拉框中选中WorkSheet,在右侧的事件下拉框中选中Change,Excel将自动在代码窗口中写入如图48-1所示的工作表Change事件过程代码框架。

图48-1 代码窗口中快速添加事件代码框架

事件过程的代码需要写入在Sub和End Sub之间,在代码中可以使用事件过程参数,不

同的事件过程,其参数也不尽相同。

48.2 工作表事件

Worksheet对象是Excel的最常用的对象之一,因此实际应用中经常会用到Worksheet 对象事件。工作表事件发生在特定的Worksheet对象中。

48.2.1 Change事件

工作表中的单元格被用户或者VBA代码修改时,将触发工作表的Change事件。值得注意的是,虽然事件的名称是Change,但是并非工作表中单元格的任何变化都能够触发该事件。

下列工作表的变化不会触发工作表的Change事件:

◆ 工作表的公式计算产生新值

◆ 在工作表中添加或者删除一个的对象(控件、自选图形等)

◆ 改变工作表的单元格格式

◆ 某些导致单元格变化的Excel操作:排序、替换等

某些Excel中的操作将导致工作表的Change事件被意外触发:

◆ 在空单元格中按

◆ 单击选中已有内容的单元格,输入与原来内容相同的内容,然后按键结束输

Change事件的参数Target是一个Range变量,代表工作表中发生变化的单元格区域,它可以是一个单元格也可以是多个单元格组成的区域。在实际应用中,用户通常希望只有工作表中的某些特定单元格区域发生变化时,才激活change事件,这就需要在Change事件中对于Target参数进行判断。

步骤1 在Excel中打开示例工作簿文件,按组合键切换到VBE窗口。

步骤2 在工程资源浏览器中双击“示例49.1”,在右侧的代码窗口中写入如下代码,如图48-2所示。

#001 Private Sub Worksheet_Change(ByVal Target As Range)

#002 With Target

#003 If .Count = 1 Then

#004 If .Column = 1 Then

#005 Application.EnableEvents = False

#006 .Offset(0, 1) = IIf(.Value = "", "", Now)

#007 Range([A2], [B1048576].End(xlUp)). _

Borders.LineStyle = xlContinuous

#008 Application.EnableEvents = True

#009 End If

#010 End If

#011 End With

#012 End Sub

图48-2 输入Change事件代码

步骤3 返回Excel界面,在A9单元格中输入姓名“李刚”,并按【Enter】键。工作表的Change事件将自动在B列相应单元格中写入当前日期和时间,并添加单元格边框线,其结果如图48-3所示。

图48-3 自动记录日期与时间

代码解析:

第3行和第4行代码判断发生变化的单元格区域(即参数Target所代表的Range对象)是否位于第1列,并且是为单个单元格。如果如果不满足这两个条件,将不执行后续的事件代码。

第5行代码使用EnableEvent属性禁止事件被激活,具体用法请参考章节48.2.2。

第6行代码用于写入当前日期和时间,如果被修改单元格的值为空,也就是用户删除了A 列的姓名,那么代码将清除相应行B列单元格的内容。

第7行代码为数据区域添加单元格边框线,其中[B1048576].End(xlUp)为B列最后一个有数据的单元格。

第8行代码恢复EnableEvent属性的设置。

用户在工作表中除了A列之外的单元格输入时,工作表的Change事件同样会被触发,但是由于不满足第4行代码中的判断条件,所以不会执行写入当前日期和时间的代码。

48.2.2 如何禁止事件的激活

在上述代码中使用了Application.EnableEvents=False防止事件被意外多次激活。Application对象的EnabledEvents属性可以设置是否允许对象的事件被激活。上述代码中如果没有禁止事件激活的代码,在写入当前日期的代码执行后,工作表的Change事件被再次激活,事件代码被再次执行。某些情况下,这种事件的意外激活会重复多次发生,甚至造成死循环导致事件代码重复调用,无法结束运行。因此在可能意外触发事件的时候,需要设置Application.EnableEvents=False禁止事件激活。

注意:这个设置并不能阻止控件的事件被激活。

EnableEvents属性的值不会随着事件过程的执行结束而自动恢复为True,也就是说需要

相关文档
最新文档