本文将介绍在VBA中进行对象编程时经常用到的3个技巧使用对象变量、使用With结构、使用For Each结构,实际上它们也属于VBA的语言元素,只不过主要用在对象编程方面。下面列出了这3个技巧的详细介绍。
使用对象变量:简化对象引用,减少代码输入量,提高程序运行效率。
使用With结构:简化对象引用,减少代码输入量,提高程序运行效率。
使用For Each结构:遍历集合中的对象。
一、使用对象变量
在VBA中,对象也是一种数据类型,可以将变量声明为一般对象类型或特定对象类型。一般对象类型表示为Object,特定对象类型由对象所属的类决定,比如工作簿对象类型表示为Workbook,工作表对象类型表示为Worksheet。
无论将变量声明为哪种对象类型,在声明和使用对象变量时都需要遵循以下3个步骤:
声明对象变量→为对象变量赋值→释放对象变量占用的内存空间
声明对象变量的方法与声明普通变量类似。下面的代码声明了一个Worksheet类型的对象变量wks,该变量代表一个工作表:
Dim wks As Worksheet
在使用已经声明好的对象变量之前,需要使用Set关键字将某个具体的对象赋值给对象变量。就上面的代码而言,需要将一个实际的工作表赋值给wks对象变量。假设在当前的活动工作簿中存在一个名为“1月”的工作表,那么下面的代码将该工作表赋值给wks对象变量。
Set wks = Worksheets("1月")
为对象变量赋值后,之后就可以使用对象变量代替实际的对象引用,不但可以减少对象引用的代码输入量,还可以提高程序的运行效率。本例中可以使用wks变量代表名为“1月”的工作表,下面的代码显示名为“1月”的工作表的名称。
MsgBox wks.Name
当不再需要使用对象变量时,应该使用Set关键字将对象变量赋值为Nothing,以释放对象变量占用的内存空间,如下所示:
Set wks = Nothing
案例:使用对象变量引用特定的对象
下面的代码将上面几行分开的语句合并到一起,形成完整的使用对象变量的案例。为了避免由于指定的工作表不存在而导致的运行时错误,因此在代码中加入了防错机制。如果指定的工作表不存在,则会显示一条提示信息并退出程序,否则显示工作表的名称。
二、使用With结构
正常情况,当需要对同一个对象进行多种操作时,会在代码中多次引用该对象。下面的代码对活动工作簿中的第一个工作表的A1:C6单元格区域进行了一系列设置:
代码中的Worksheets(1).Range(“A1:C6”)部分重复出现了7次,VBA会对每次遇到的对象之间的英文句点进行解析,因此上面这段代码的运行效率会受到严重影响。
在VBA中,当需要在代码中反复引用同一个对象时,为了提高程序的运行效率,同时减少代码的输入量,可以使用With结构简化对象的引用。With结构的格式如下:
With 要引用的对象 要为对象执行的操作 End With
在With语句之后输入要引用的对象,按Enter键后VBA会自动添加End With语句。在With语句和End With语句之间放置要为对象执行的操作,通常是为了设置位于With语句之后的对象的属性和方法。这些属性和方法以英文句点开头,然后可从自动弹出的成员列表中选择所需的属性和方法。
案例:使用With结构简化对象的引用
下面的代码使用With结构对上一个案例进行了修改,在With和End With之间省略了Worksheets(1).Range(“A1:C6”)部分,代码看起来更简洁。
With结构也可以嵌套在另一个With结构中。上面代码中的第3~5行重复出现了3次Font,因此也可以使用With结构对该对象的引用进行简化。下面的代码使用了嵌套的With结构,外层的With结构处理的是Range对象,内层的With结构处理的是Font对象。

三、使用For Each结构
For Each结构主要用于处理集合中的对象,尤其适用于包含大量对象的集合,而且预先不知道对象的数量的情况。可以使用For Each结构对逐个对象进行处理,也可以只处理集合中符合特定条件的某些对象。
For Each结构的语法格式如下:
For Each element In group [statements] [Exit For] [statements] Next [element]
element:必选,用于遍历集合中的每一个对象或数组中的每一个元素的变量。
group:必选,要在其内部进行遍历的集合或数组。
statements:可选,For Each结构中包含的VBA代码,它们将被重复执行,直到处理完集合中的最后一个对象。
Exit For:可选,中途退出For Each循环。
For Each结构与For Next结构有些类似,都用于循环执行特定的代码,但是For Each结构是对集合中的每一个对象重复执行相同的代码,而不是重复执行指定次数的代码,For Each结构对代码进行重复执行的次数取决于集合中的对象总数。当处理完集合中的最后一个对象后,将会自动退出For Each结构,也可以使用If Then结构设置判断条件,只对符合条件的对象执行操作,并使用Exit For语句中途退出循环。
案例:使用For Each结构遍历集合中的对象
下面的代码显示了当前活动工作簿中的每个工作表的名称。由于运行代码前无法确定活动工作簿中包含的工作表数量,因此很适合使用For Each结构来进行处理。
For Each结构也可以嵌套使用,即在一个For Each结构中嵌套另一个For Each结构。下面的代码显示了当前打开的每一个工作簿中的每一个工作表的名称,由于运行代码前无法确定当前一共打开了多少个工作簿,以及每个工作簿中包含多少个工作表,因此使用两个嵌套的For Each结构,外层的For Each结构用于处理打开的每一个工作簿,内层的For Each结构用于处理工作簿中的每一个工作表。
评论前必须登录!
注册