关于WithEvents关键字,VBA的帮助非常简单,虽然翻阅了不少资料,但是对WithEvents的理解还是似懂非懂,理解的很不透彻。在这里我仅仅把这些天来的学习心得与大家分享,抛砖引玉,如果您对WithEvents有深层次的理解,也请您一同分享,向您学习。 废话少说,言归正传。 1.WithEvents关键字用于哪些语句? 通过VBA帮助,我们知道WithEvents只用于声明变量的语句: WithEvents 关键字用于下列上下文: Dim 语句 Private 语句 Public 语句 这三个语句都是用来声明变量的,我们知道了WithEvents关键字肯定是与定义变量有关。 2.WithEvents关键字是干什么用的? WithEvents,从这个单词本身上看,应该是“和事件有关”的意思(嘿嘿,我猜的啊)。一提到事件,我们就会联想到对象;既然WithEvents关键字用于Dim,Private,Public语句,那就肯定与变量有关系;以上两点结合到一起,肯定WithEvents关键字是和对象变量有关系啦。 我的理解是这样的: 当你需要使用某个对象的事件时,定义对象变量的时候,就要用到WithEvents关键字。 举个例子: Dim app as Application(无法使用application对象事件) Dim WithEvents app as Application(可以使用application对象事件) 3.使用 WithEvents 关键字的限制条件: (1)WithEvents 变量不能是派生对象变量。也就是说,不能把它声明为 As Object(当声明该变量时必须指定类名)。 举个例子 错误的写法:Dim WithEvents app as Object 正确的写法:Dim WithEvents app as Application (2)不能把 WithEvents 变量声明为 As New。必须明确地创建事件源对象,并将它赋给 WithEvents 变量。 举个例子 假设已经定义了一个叫做MyClass的类模块 错误的写法: Dim WithEvents cls as New MyClass 正确的写法:Dim WithEvents cls as MyClass Set cls=New MyClass (3)不能在标准模块中声明 WithEvents 变量。只能在类模块、窗体模块以及其它定义类的模块中声明。 VBA工程中包含的模块,除了标准模块,剩下的都可以看做是类模块(包括窗体模块,ThisWorkbook,Sheet,类模块等等)。所以说我们只要记住,在标准模块中,不能使用WithEvents关键字就行。 (4)虽然WithEvents是Dim,Public,Private语句的关键字,但是,一定要记住,不要在过程里面中用WithEvents关键字进行对象变量的声明,因为微软绝对不会同意,呵呵。 4.WithEvents应用范例1一显式使用对象事件 我们知道,Excel可以监视不少对象的事件,如Workbook,Worksheet,UserFrom等等,通常输入事件过程的代码时,首先从代码编辑器的左边下拉列表中选择对象,然后从代码编辑器右边下拉列表中选择事件,如下图所示。 但是有些对象,如Application对象,是无法这样输入事件过程的,只有使用了WithEvents定义了对象变量,然后将Application对象引用赋值给对象变量之后,才可以像上图一样使用。下面我们举个例子来说明一下。 例子说明:利用Application的WindowResize事件,当我们调整工作薄窗口大小的时候,弹出对话框。 代码编写位置:我们在Sheet1文档模块中编写(你也可以在Sheet2,Sheet3,ThisWorkbook等模块中编写,效果是一样的) 编写过程: (1)声明变量,定义对象变量app: Private WithEvents app As Application (2)声明过程,将Application对象的引用赋值给app: Sub test() Set app = ApplicationEnd Sub 这个时候,我们就可以通过代码编辑器的左右下拉列表框选择Application对象的事件过程啦(不过是以app对象变量的形式出现的),如下图所示: (3)编写事件过程代码: Private Sub app_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window) MsgBox "你改变了工作薄窗口的大小" End Sub 运行方法:运行test过程,然后改变工作簿的大小,就会弹出提示框。 代码: 5. WithEvents应用范例2一为多个模块编写通用事件 例子说明:建立一个窗体,里面放了四个CommandButton控件,点击控件,弹出CommandButton的Catpion名,本来应该为每个CommandButton事件编写一个事件过程,现在只要编写一个事件过程即可。 代码分为两部分,一个是窗体模块UserForm1的代码,一个是类模块MyClass的代码: (1)类模块代码与解释(类模块名:MyClass) (2)窗体模块代码与解释(窗体名UserForm1) 6. WithEvents应用范例2—在一个对象中为另一个对象编写事件 这一个实例个人感觉有些牵强,因为我也不知道什么地方会用到他。所以我也不解释太多,只贴出代码与大家共享。 例子说明:在Sheet2模块中编写Sheet1的Activate事件,运行Sheet2里面的过程后,再激活Sheet1表,弹出Msgbox消息框。 代码与简单解释如下(在Sheet2表中): Option Explicit 我们可以看出来,这些代码都是写在了Sheet2模块中,但确实实现了为Sheet1对象编写事件过程的功能。 |
|
来自: yuzhoushenling > 《VBA》