初步理解和使用Excel对象模型 [摘要]本文介绍了Excel对象模型及相关知识的基本概念,告诉您如何在VBA代码中使用与处理对象和集合。主要包括Excel对象模型的介绍,对象(集合)的概念和如何引用,设置对象变量,对象的方法和属性,对象的事件,用With…End With语句和For Each…Next语句处理对象和集合,以及如何获得帮助等基础知识。 说明 对本文中的VBA语句和程序,您可以在将它们复制/粘贴或输入到您的VBE编辑器中的代码模块中后,进行测试。具体方法为:在Excel工具菜单中选择“工具——宏——Visual Basic编辑器”命令或按Alt+F11组合键,打开VBE编辑器;然后再VBE编辑器中选择菜单“插入——模块”,将代码输入或粘贴到模块程序中,选择“运行宏”命令或按F5快捷键运行测试代码。 本文中的提示是您在编写或使用VBA代码时要注意的地方或给您的建议。 Excel对象模型简介 在介绍Excel对象模型之前,让我们先来看一个简单的例子。大多数工厂都是按这样的结构进行设置的:最上层为工厂总部,第二层次分为各个车间,在车间下面又分各班组。就这样组织在一起,形成了一个工厂体系。Excel对象模型与此相似,看起来复杂但实质上很简单清晰。 提示 任何看起来复杂的东西其实都是由一些简单的部分组成的,或者其实它本身就比较简单。 Excel的对象模型是通过层次结构很有逻辑地组织在一起的,一个对象可以是其它对象的容器,可以包含其它的对象,而这些对象又包含其它的对象。位于顶层的是Application对象,也就是Excel应用程序本身,它包含Excel中的其它的对象,如Workbook对象;一个Workbook对象包含其它一些对象,如Worksheet对象;而一个Worksheet对象又可以包含其它对象,如Range对象,等等。这就是Excel的对象模型。 例如,Range对象在Excel对象模型中的位置为: Application对象 Workbook对象 Worksheet对象 Range对象 知道了某对象在对象模型层次结构中的位置,就可以用VBA代码方便地引用该对象,从而对该对象进行操作,并以特定的方式组织这些对象,使Excel能根据您的需要自动化地完成工作任务。因此,要熟练掌握Excel VBA编程,必须理解Excel的对象模型。 在VBA帮助系统中有Excel对象模型的层次结构图,您可以参阅。 集合 集合是对象,是一组属于同一类型的对象或相关的对象的集,作为它们的容器。例如,Workbooks对象是当前打开的所有Workbook对象的集合,Worksheets是包含在某个Workbook对象中的所有Worksheet对象的集合。 对象的引用 ■ 使用VBA可以处理某个对象的整个集合,或者某集合中的一个单独的对象。 语法:集合(“对象名”) 或 集合(对象索引号) 说明:引用集合中的某个对象,即对象名或对象索引号所代表的对象 例如,Worksheets(“Sheet1”)引用集合Worksheets中的工作表Sheet1;若Sheet1是集合中的第一个工作表对象,还可以写为Worksheets(1)。 特别地,”Sheets”集合由工作簿中的所有工作表(包括图表工作表)组成。若要引用工作簿中的第一个工作表,可采用语句Sheets(1)表示。 ■ 通过点运算引用某对象的成员 我们可以用句点连接对象名来限定是对某个对象成员的引用,同时也指定了该对象成员在对象层次结构中的位置。 语法:<对象名>.<对象名>. … 说明:后一对象是前一对象的成员,限定了对前一对象所包含的对象成员的引用 例如,Application.Workbooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1”) 表明是对工作簿Book1上的工作表Sheet1中单元格A1的引用,其中Application代表Excel应用程序本身,可省略。特别地,若Book1是当前活动工作簿,则上述语句可简写为 Worksheets(“Sheet1”).Range(“A1”) ;若Sheet1是当前活动工作表,则又可简写为 Range(“A1”) 。因此,若在引用中省略了工作簿对象,则表明是使用当前活动工作簿;若再省略了工作表对象,则表明是使用当前活动工作表。 设置对象变量 对象变量是代表一个完整对象的变量,如工作表或单元格区域。用Dim或Public语句来声明对象变量。 语法:Dim(或Public) <变量名> AS <对象名> 说明:将<变量名>声明为一个<对象名>对象。 一般可将对象名直接设为Object,即任意对象。但如果您知道变量将作用到的对象的话,最好将其设置为具体的对象。 例如,语句:Dim DataArea As Range,将变量DataArea声明为一个Range对象。 在将变量声明为一个对象变量后,用Set语句将某对象赋值给该变量。 语法:Dim(或Public) <变量名> AS <对象名> Set <变量名>=<某对象> 说明:将<变量名>声明为一个<对象名>对象,再将某对象赋值给该变量。 现在,让我们来看看下面两个简单的例子,其作用是在工作簿Book1的工作表Sheet1中的A1至B10单元格区域输入数值666,并将它们格式化为粗体和斜体。 Sub 没有设置对象变量() WorkBooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1:B10”).Value=666 WorkBooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1:B10”).Font.Bold=True WorkBooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1:B10”).Font.Italic=True End Sub *************************************** Sub 设置了对象变量() Dim DataArea As Range Set DataArea = WorkBooks(“Book1.xls”).Worksheets(“Sheet1”).Range(“A1:B10”) DataArea.Value=666 DataArea.Font.Bold=True DataArea.Font.Italic=True End Sub 比较这两个程序,其功能相同,但可以看出,当我们设置了对象变量后,不仅可减少手工输入重复的代码,而且使得代码得到了明显的简化。 此外,对于稍复杂一点的程序,设置对象变量后,由于减少了要处理的点运算符的数目,因此可使得代码的运行速度更快。 当设置的变量运行完毕后,应将该变量释放,以节省内存空间。其语法为: 语法:Set <变量名>=Nothing 对象的方法和属性 在引用了对象或者设置了对象变量后,我们就可以对该对象进行所需要的操作或设置了。这就需要使用对象的方法和属性。 ■ 对象的方法 对象都有方法,一个方法就是在对象上执行的某个动作。为对象指定方法时,应将对象和方法组合在一起,中间用句点分隔。 在引用了对象或者设置了对象变量后,我们就可以对该对象进行所需要的操作或设置了。这就需要使用对象的方法和属性。 ■ 对象的方法 对象都有方法,一个方法就是在对象上执行的某个动作。为对象指定方法时,应将对象和方法组合在一起,中间用句点分隔。 语法:<对象>.<方法> <参数> 说明:为某对象指定方法。若该方法带有参数或需要为带参数的方法指定参数时,则指定参数以执行进一步的动作;若该参数返回值,则应在参数两边加上括号。 例如,语句Worksheets(“Sheet1”).Range(“A1:B2”).ClearContents,执行Range对象的ClearContents方法,清除A1至B2单元格区域的内容,但保留该区域的格式设置;而语句 Worksheets(“Sheet1”).Range(“A1:B2”).Clear,执行Range对象的Clear方法,清除A1至B2单元格区域的内容,并删除所有的格式。 ■ 对象的属性 对象都有属性,用来描述或设置对象的特征。可以使用VBA来设置对象的属性,也可以对一个对象的某些属性进行修改,从而定义该对象,还可以引用某对象的属性值。使用属性时,应将对象和属性组合在一起,中间用句点分隔。 语法:<对象>.<属性> <参数> 说明:设置或引用某对象的属性。若该属性带有参数或需要为带参数的属性指定参数时,则指定参数以进一步描述该对象;若该参数返回值,则应在参数两边加上括号。 语法:<变量>=<对象>.<属性> 说明:将某对象的属性值赋值给一个变量,以便于在程序中使用。 例如,Range对象有一个Value属性,可以用VBA代码引用该对象的属性值,也可以修改该属性,如下面的语句: Worksheets(“Sheet1”).Range(“A1”).Value,该语句引用当前工作簿上工作表Sheet1中单元格A1的值。 Worksheets(“Sheet1”).Range(“A1”).Value=666,该语句将当前工作簿上工作表Sheet1中单元格A1的值改为666。 Dim Var As Variant Var=MyForm.Caption 上面两句将MyForm对象的Caption属性赋值给变量Var。 提示 (1) 大多数对象都有一个默认的属性,如Range对象的默认属性是Value属性。对于默认的属性可省略属性代号的书写,即Range(“A1”).Value与Range(“A1”)所表达的意思一样。即便如此,仍建议还是要将属性代号写全,以提高程序的可读性。 (2) 访问一个对象不存在的属性时,会返回一个错误。 ■ 方法和属性的参数 大多数方法都带有参数,从而能进一步定义动作。例如,Range对象的Copy方法带有一个参数,用来定义将单元格区域的内容复制到什么地方。语句 Worksheets(“sheet1”).Range(“A1”).Copy Worksheets(“sheet2”).Range(“A1”)表示将当前工作簿上工作表Sheet1中单元格A1的内容复制到当前工作簿上工作表Sheet2中单元格A1中。 在一些情况下,方法带有一个或多个可选的参数。如果方法使用了可选的参数,则应该为这些参数插入空白占位符。例如,工作簿对象的Protect方法有三个参数,即密码、结构和窗口,对应于“保护工作簿”对话框中的相应选项,其语法为: 语法:<工作簿对象>.Protect (Password,Structure,Windows) 说明:保护工作簿使其不至被修改。三个参数均为可选参数,其中Password指定密码,若省略该参数,则不用密码就可以取消对该工作簿保护;Structure参数指定是否保护工作簿结构;Windows参数指定是否保护工作簿窗口。 若要保护工作簿“Book1.xls”,可使用语句: Workbooks(“Book1.xls”).Protect “xYzRq”,True,False 其中,第一个参数指定了保户该工作簿的密码,注意密码区分大小写;第二个参数为True表明工作簿结构受到保护;第三个参数为False表明不保护窗口。 若不想指定密码,可使用语句: Workbooks(“Book1.xls”).Protect ,True,False 该语句省略了第一个参数,表明不指定保护密码,但必须在该参数出现的位置用一个逗号占位符代表该参数。 让我们再看看下面的语句: Workbooks(“Book1.xls”).Protect Structure:=True,Windows:=False 该语句的功能与上面语句相同,即对工作簿不指定保护密码,要保护工作簿结构,但不保护它的窗口。区别在于,该语句使用了命名的参数,对省略的参数没有使用空白占位符。因此,当某方法带有多个可选的参数,但在VBA语句中只需使用其中的一些参数时,使用命名的参数,可以不必对省略的参数使用空白占位符,且使代码更具可读性。注意,在参数名和参数值之间用“:=”连接。 还有一种情况,对象的属性(和方法)可能返回一个值。对于返回一个值的属性(和方法)来说,必须用括号将参数括起来。例如,Range对象的Address属性返回一个值即单元格区域的引用地址,该属性带有5个可选的参数。若写成下面的语句: Range(“A1”).Address False,由于参数缺少括号,所以会出现错误。正确的表达如下: Range(“A1”).Address(False) 或使用命名的参数Range(“A1”).Address(rowAbsolute:=False)。 ■ 集合的方法和属性 集合对象一般有特殊的属性和可以用来管理该对象的方法。通常,集合对象有Add方法、Item方法和Remove方法,总有一个Count属性用来返回集合中的对象个数。 对象小结 下面,对前面所描述的知识作一个简短的小结。 ■ 在Excel中,Application对象代表Excel应用程序本身,其它的对象都从它开始。每个对象都有自已的方法和属性,并且某些对象的一些方法和属性是相同的。 ■ 在通常情况下,我们认为先需要选择对象,然后再对所选对象进行处理,宏录制器就是这样的。事实上,在不进行选择的情况下,直接在对象上执行动作将会更有效且运行快速。 ■ 在大多数情况下,需要通过引用对象所在的集合间接地引用某个对象。例如,Workbooks(“Book1.xls”)在工作簿集合中引用名为Book1的Workbook对象。 ■ 属性可以返回对另一个对象的引用,一定要认识到这一点。例如,语句Range(“A1”).Font.Bold=True中,Font属性返回Range对象中所包含的一个Font对象。 ■ 要引用一个对象,可以使用很多不同的方法。您可以根据程序运行所处的实际环境,以方便和易于理解为原则,确定具体使用何种方法。 对象的事件 Excel对象模型带有面向对象编程的特点,但VBA也致力于事件驱动的编程模型。当某对象上的一个事件发生时,相应的程序运行。事件可以由应用程序触发,也可以是在进行某个操作时产生。 例如,在VBE编辑器的工程窗口中,双击Microsoft Excel对象模型下面的ThisWorkbook对象,在右侧代码窗口顶部有两个下拉列表框,其左侧为对象列表,右侧为过程列表。选择左侧对象列表中的对象,右侧列表中则相应列出响应该对象的事件。 可以利用对象的事件定制应用程序。例如,当打开工作簿时显示欢迎窗口,这需要选择ThisWorkbook对象的Open事件,在Private Sub Workbook_Open()过程中调用显示欢迎窗口的程序。
[此贴子已经被作者于2006-7-5 13:27:10编辑过] |