英文中书名号:第11章 对象概述

来源:百度文库 编辑:九乡新闻网 时间:2024/05/09 15:33:37
 第三部分 Excel对象模型   对象模型用来描述对象之间的关系。使用VBA在Excel环境下开发应用程序,实质就是访问控制Excel各对象的过程。使用VBA在Excel中进行编程时,必须先了解Excel的对象模型。  Excel 2007有200多个对象,如果这些对象之间没有任何逻辑联系的话,这些对象疳非常难于掌握和使用。事实上,Excel中所有对象都处于一个完整的体系中,每个对象都不是孤立的。  本部分共5章,详细介绍了Excel中常用对象的使用方法。 第11章 对象概述   现实世界是由各种各样的对象组成的,对象之间通过一定的渠道相互联系。计算机程序设计中也引入了对象这个概念。面向对象方法是一种非常实用的软件开发方法,由于以客观世界中的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与宏观世界的实际比较接近,因此容易被人们所接受。  11.1 对象和类的概念  Excel中包括了非常多的对象,Excel窗口、工作簿、工作表、单元格和图表等都是对象。Excel含有上百种可以通过不同方式操作的对象,所有的VBA对象都是通过层次组织起来的,一些对象可能包含其他对象。例如,Excel是一个Application对象,该对象包含其他对象,诸如工作簿对象或命令条对象;工作簿对象又包含其他对象,诸如工作表对象或图表对象。  11.1.1 什么是对象  在现实生活中,每个实体都是对象,例如,汽车、电视机等都是现实世界中的对象。每个对象都有它的属性和操作,例如电视机有外形、颜色、音量、频道等属性;有切换频道、改变音量等操作。电视机的属性值表示了电视机所处的状态,而状态只能通过对电视机属性的操作来改变。  在Excel中,对象是指一组属性及这组属性上的专用操作的封装体。属性可以是一些数据,也可以是另一个对象。例如,Excel工作簿为一个对象,它的属性有工作簿名称、保存位置、作者、工作表等;而工作表又可以是一个对象,还可以有自己的属性。每个对象都有它自己的属性值,属性值表示该对象的状态。对象中的属性只能通过该对象所提供的操作来存取和修改。操作也称为方法或服务,它规定了对象的行为,表示对象所能提供的服务。一个对象通常可由对象名、属性和操作三部分组成。  11.1.2 类的概念  人们习惯于把具有相似特征的事物归为一类。在面向对象程序设计中,类是创建对象的模板。对象按照实现的共性分组为“类”,类定义了对象的属性及用来控制对象行为的方法。  类的定义可以看作是建立对象的原型。建立类之后,就可用它来建立许多需要的对象。与其他面向对象的程序设计语言(如C++、Java)不同的是,在使用VBA的大多数时间里,开发者都不会接触到类的相关知识。如果开发者准备创建自己的对象类,可以使用VBA的类模块来完成该任务。  11.2 对象的属性、事件和方法  在应用程序中创建对象后,可通过设置对象的属性改变其外观。在程序运行过程中,随着外部条件的改变(如单击鼠标、输入数据等),将触发对应的事件。执行事件过程,可以达到与用户交互的目的。  11.2.1 对象属性  属性决定了一个对象的外观和行为。要改变一个对象的外观和行为,可以通过改变对象的属性来实现。大多数对象属性是在对象生成时自动设置的,用户可以在设计时通过属性窗口或运行时通过代码改变。在运行时可以设置并可获得值的属性叫做读写属性;在运行时只能读取的属性叫做只读属性。  属性定义了对象的特征,诸如大小、颜色或屏幕位置;或某一方面的行为,诸如对象是否激活或可见。可以通过修改对象的属性来改变对象的特性。  例如,工作簿对象有名称属性;区域对象有列、字体、公式、名称、行、样式和值等属性。这些对象属性是可以设置的。通过设置对象的属性可以控制对象的外观和行为。对象属性一次只能设置为一个特定的值。例如,当前工作簿不可能同时有两个不同的名称。  VBA中最难理解的部分是有些属性同时又可以是对象。如区域(Range)对象,可以通过设置字体颜色来改变选定单元格的外观。但是,字体(Font)可以有不同的名称(Times New Roman,Arial,……),不同的字号(10,12,14……)和不同的样式(粗体,斜体,下画线,……)。这些都是字体的属性。如果字体有属性,那么字体也是对象。  1. 设置属性值  设置属性值可通过Visual Basic编辑器中的“属性”窗口进行,也可在程序中使用代码对其进行改变,具体格式如下:  object.property = expression  其中,object为对象名,property为对象的某个属性。  例如,下面的过程通过设置窗体中的Caption属性来更改Visual Basic窗体的标题。  Sub ChangeName(newTitle)    myForm.Caption = newTitle  End Sub  2. 读取属性值  可以通过属性的返回值来检索对象的信息。读取属性值可以用以下语法:   variable = object.property  下列过程使用一个消息框来显示标题,它显示在当前活动窗体顶部。    End Sub  属性值也可以作为较复杂表达式的一部分,而不必将属性赋予变量。下面的代码计算工作表“Sheet1”两单元格数据之和。  intSum = Sheet1.Cells(2,1).Value + Sheet1.Cells(2,2).Value  工作表Sheet1对象中又包含很多对象,其中的Cells对象为工作表单元格集合对象,父对象引用子对象时通过点运算符进行连接。  11.2.2 对象事件  事件是某个特定的时刻所发生的事情,它是对象状态转换过程的描述。事件没有持续时间,是瞬间完成的。  事件是由对象识别的一个动作。开发人员可以编写相应的VBA代码来响应该动作。在VBA中,可以激发事件的用户动作包括:切换工作表、选择单元格、单击鼠标等几十种事件。当事件发生时,将执行包含在事件过程中的代码。如果用户没有定义某事件所调用的过程,那么当发生该事件时就不会产生任何响应。  事件既可以由用户动作(如单击鼠标、按键等)产生,也可以由程序代码或系统产生(如计时器定时产生的事件)。  编写事件响应代码是在“代码编辑器”中进行的,“代码编辑器”的右边有一个事件列表,这个事件列表从属于左边的控件对象,当左边控件列表中的控件改变后,右边的事件列表也会发生变化,如图11-1所示。               11.2.3 对象方法  方法指的是对象能执行的动作。例如,可以使用Add方法添加一个新工作簿或者工作表。下面的程序使用Add方法给当前工作簿增加一个新的工作表。  Sub AddSheet()    ActiveWorkbook.Sheets.Add  End Sub  对象可以使用不同的方法。例如,区域(Range)对象有清除单元格内容的ClearCoutents方法,清除格式的ClearFormats方法,以及同时清除内容和格式的Clear方法;另外还有选择、复制或移动对象的方法等。  部分对象的方法有可选参数,用来确定方法执行的具体方式。例如,工作簿(WorkBook)对象有一个Close(关闭)方法,可以使用它关闭任何打开了的工作簿。如果工作簿有改动,Excel分弹出一个信息,询问用户是否要保存变化。这时开发人员可以设定Close方法的SaveChanges参数为“假”(False)来关闭这个工作簿并且不管它的任何变化。  在调用方法时使用点操作符引用对象,如果有参数,在方法后加上参数值,参数间用空格隔开。在代码中使用方法的格式如下:  object.method  例如,下面的代码选中工作表Sheet1的单元格“A1”,然后清除其中的内容:  Sheet1.Range("A1").Select  Sheet1.Range("A1").Clear  11.3 对象变量和对象数组  本书前面章节介绍了变量和数组的知识。在VBA中,变量和数组除了能保存简单数据类型外,还可以保存和引用对象。在程序中使用变量时引用一个反复使用的对象可加快程序的执行速度。  11.3.1 对象变量  对象变量是代表一个完整对象的变量,该变量中实际保存着具体对象的引用指针。与普通变量类似的是,使用对象变量也需要两个步骤:声明对象变量和指定对象变量到某一对象。  1. 引用对象的成员  可以用点操作符连接对象名来限定对某个对象成员的引用,同时也指定了该对象成员在对象层次结构中的位置。其语法格式如下:  <对象名>.<对象名>.……  后一对象是前一对象的成员,它限定了对前一对象所包含的对象成员的引用。如以下语句:  Application.Workbooks("Book1.Xlsm").Worksheets("Sheet1").Range(“A1”)表明是对工作簿Book1上的工作表Sheet1中单元格A1的引用,其中Application代表Excel应用程序本身,可省略。若Book1是当前活动工作簿,则上述语句可简写为:  Worksheets("Sheet1").Range("A1")  若Sheet1是当前活动工作表,则又可简写为:  Ranet("A1")  因此,若在引用中省略了工作簿对象,则表明使用当前活动工作表;若再省略了工作表对象,则表明使用当前活动工作表。  2. 声明对象变量  可以使用Dim语句或其他的声明语句之一(Public,Private或Static)声明对象变量。引用对象的变量必须是Variant、Object,或是一个对象的指定类型。例如,下列声明是有效的:    注意:如果使用对象变量前没有声明数据类型,则对象变量默认的数据类型是Variant类型。  在有的情况下,只有等到程序运行时才知道对象变量引用的对象类型,这时可将对象变量声明为Object数据类型。使用Object数据类型可以创建任何对象的一般的引用。  如果知道对象变量引用的对象类型,最好将其声明为所知道的对象类型。声明指定的对象类型提供自动的类型检查,更快的代码生成,并增加可读性。例如,如果对象变量MyObject指定为Range对象类型,则可以用下列的语句来声明:  Dim MyObject As object                                  '声明为一般的对象  Dim Myobject As Range         '只声明为Range对象  3. 给对象变量赋值  与普通变量的赋值不同,给对象变量赋值必须使用Set语句。例如,下面的代码给对象变量MyCell赋值:  Set MyCell = Worksheets(1).Range("C2")  可以同时使用New关键字和Set语句来声明对象变量,并赋值一对象给它。例如,下面的代码首先声明一个集合对象,然后使用New关键字来新建一个集合对象:  Dim MyCollection As Collection  Set MyCollection = New Collection  设置一个对象变量等于“Nothing”会中断此对象变量与任何特定对象的关联,如此可预防因意外改变变量而更改对象。在关闭关联对象后,对象变量总是设置为“Nothing”,所以可以检测对象变量是否指向有效的对象。例如:  If Not Myobject Is Nothing Then        '变量引用有效的对象  ……  End If  当然,该检测不能绝对地决定用户是否已关闭包含对象变量所引用对象的应用程序。  4. 引用对象的当前实例  “Me”关键字可用来对象的当前实例,即代码正在执行的对象。所有与当前对象关联的过程都可以通过“Me”来引用。使用“Me”来传递关于对象的当前实例信息到其他模块中的过程显得特别有用。例如,假设在模块中有以下过程:  Sub ShangeobjectColor(MyobjectName As object)    MyobjectName.BackColor = RGB(Rnd*256,Rnd*256,Rnd*256)  End Sub  使用以下语句,可以调用过程并将对象的当前的实例当做参数来传递:  ChangeobjectColor Me  使用对象变量可简化代码,并提高代码的执行速度。例如,如果在某段代码中需要反复使用单元格C2,那么完整的引用代码如下:  Worksheets(1).Range("C2").Value = “地址”  Worksheeta(1).Range("C2").Font.Name = “黑体”  Worksheets(1).Range("C2").Font.Bold = True  使用对象变量后,代码修改如下:  Dim MyCell As Range  Set MyCell = Worksheets(1).Range("C2")  MyCell.Value = “地址”  MyCell.Font.Name = “黑体”  MyCell.Font.Bold = True  这段代码更易读,并且执行效率更高。仅从这段代码上还不易觉察速度的提高,如果是在一个需要重复执行几百上千次的循环中执行这段代码,其执行效率明显提高。  11.3.2 对象数组  如果在程序中需要处理大量相同类型的对象,这时可使用对象数组来指定这些对象。对象数组的定义与普通类型数据的数组相同,对象数组元素的使用与对象变量的使用类似。下面以实例形式介绍对象数组的定义和使用。  例如,如果要引用工作表中A列的前10个单元格,可使用以下代码:    程序首先定义一个具有10个元素的对象组,接着使用一个循环将各单元格的引用赋值给对象数组,最后再使用一个循环调用对象数组各元素。本例只显示各单元格的值,另外可通过对象数组中的元素MyRange(i)来控制各单元格的字体等各种忏悔,例如:    11.4 集合概念  在使用Excel开发应用程序时,需要大量使用到集合。通过对集合的操作可简化代码。下面介绍集合的概念及处理集合的方法。  11.4.1 集合的概念  在Excel中新建一个工作簿,可以发现每个工作表都是相同的。像这样一组相似的对象就称为“集合”,集合也是对象。Excel中使用得最频繁的集合是代表所有的工作表和图表工作表的Sheets集合、Workbooks集合、Worksheets集合及Windows集合。当使用集合时,可以在该集合中所有的对象上执行相同的操作。  集合是一种特定类型的对象,代表一组相同的对象。例如,一部电话是一个对象,多部电话就组成电话集合。  一个集合也可能是另一个对象的属性。例如,电话中的按键集合是电话对象的属性,是单个按钮对象的集合。因此,它们之间的关系是:电话集合是多部单个电话对象组成的集合,每个电话对象有一个称作按键集合的属性,而按键集合是单个按钮对象组成的集合。  11.4.2 集合的方法和属性  所有的集合都有方法和属性,可用来访问集合中的单个对象。其中,最重要的方法和属性中有三个,即Count属性、Item方法和Add方法。  1. Count属性  该属性指出在集合中有多少个单个对象。例如:  Dim numWorsheets  numWorksheets=ActiveWorkbook.Worksheets.Count其中,numWorksheets是一个变量,存储ActiveWorkbook对象的数量(即工作簿中工作表的数量)。  注意:若一个集合为空,该集合的Count属性值为0。  2. Item方法  该方法访问集合中一个特定的对象。例如:  Set myWorksheet=ActiveWorkbook.WorkSheets.Item(2)括号中的数字表明访问的是哪个工作表,即在Worksheets集合中的第2个Worksheet对象,并将它赋给myWorksheet变量。  也可以在括号中使用变量,例如:  上面的代码首先用变量numWorksheets来存储在Worsheets集合中Worksheet对象的数量,然后访问最后的工作表。因此,如果工作簿中共有5个工作表,则能指定最后项目为“5”来访问最后的工作表,故下面的代码与上面代码最后一行等价:  Set theLastWorksheet=ActiveWorkbook.Worksheets.Item(5)  3. Add方法  该方法允许向集合中添加对象。例如:  Set anotherWorksheet=ActiveWorkbook.WorkSheets.Add("Sheet6")  如何使用Add方法取决于想要添加项目的集合对象。在多数情况下,能为新的对象指定一个名字,如上面代码中的“Sheet6”。  11.4.3 访问集合中的对象  一个集合包含着具有相同类型的多个对象,除了使用上面介绍的方法向集合中增加对象外,还可通过集合的属性访问集合中的单个对象。  1. Excel中的集合  Excel中有很多系统定义的集合,如以下代码可在当前工作簿中增加一张工作表(工作表集合中增加一个对象):  Set ws = ActiveWorkbook.Worksheets.Add  Worksheets是Worksheet(工作表)对象的集合,也是ActiveWorkbook对象的一个属性。在这是也可以得出集合的用处:一个工作簿可以包含任意多个工作表,而Worksheets集合提供了管理这些工作表的简单的方法。  Excel中的常用的集合对象还有以下几类:  ●Sheets,工作簿中所有工作表的集合;  ●Workbooks,所有打开的工作簿的集合;  ●Charts,工作簿中图表工作表的集合。  2. 引用集合中的对象  使用VBA可以处理某个对象的整个集合,或者某集合中的一个单独的对象。引用集合中的对象的方法是:  集合(“对象名”)或集合(对象索引号)  引用集合中的某个对象,即引用对象名或对象索引号所打赌对象。例如,以下代码引用集合Worksheets中的工作表Sheet1:  Worksheets("Sheet1")  若Sheet1是集合中的第一个工作表对象,还可以写为以下形式:  Worksheets(1)  注意:“Sheets”集合由工作簿中的所有工作表(包括图表工作表)组成。若要引用工作稍事 的第一个工作表,可采用语句Sheet(1)表示。  11.5 处理对象和集合  在Excel编程过程中,需要大量地处理对象和集合。VBA提供了两个非常有用的结构,用于处理对象和集合。  11.5.1 使用With……End With语句  很多时候,需要对同一个对象进行多个操作(即编写多行代码),这时若重复输入相同的对象引用代码,会增加了录入量,从而可能造成更多的输入错误。同时,这些重复输入的代码,也降低了程序执行效率。  使用With……End With语句可以对某个对象执行一系列的操作,而不必重复指出该对象的名称。其语法格式如下:  With <对象>    [语句代码]  End With  其中,<对象>表示With语句要执行操作的具体对象;[语句代码]为对某对象执行操作的一条或多条语句,前面以点操作符开头。  下面的代码对当前工作簿中的工作表Sheet1上的单元格区域A1:C10进行操作,设置该区域的字体样式、字体大小、下画线及字体颜色等属性。    将该代码使用With……End With语句重新编写,得到下面的代码:  该代码执行与前面的代码完全一样的操作。  不能用一个With……End With语句来设置多个不同的对象,但可以将With块放在另一个之中而产生嵌套的With语句,使用时必须在内层的With块中使用完整的对象引用来指出在外层的With块中的对象的成员,例如:  使用With语句,不仅能避免反复输入相同的代码,使程序代码更简洁,而且更重要的是,能使程序运行得更快。在上面的“设置格式”程序中,可稍微感觉到两个程序之间速度的差异,若数据量再加大,则这种运行速度之间的差异将更明显。  在录制宏时,Excel将大量使用With……End With结构,可参见本书第2章的内容。  11.5.2 使用For Each……Next语句  上一节介绍了集合的概念,其包含的是一组相关的对象。如果需要对集合中的每个对象执行相同的操作,首先需通过集合对象的Count属性获取集合中包含的对象数量,然后通过循环语句对集合中的每个对象执行相同的操作。例如,以下代码将选中区域单元格中的英文字母转换为大写:  Dim i As Long  j = Selection.Count  For i =1 To j   Selection.Cells(i) = UCase(Selection.Cells(i))  Next   在VBA中提供了一个For Each……Next语句,该循环语句可以逐个处理集合中每个对象。使用该语句处理集合时,不必知道集合中有多个元素。其语法结构如下:  For Each 元素 In 集合    [语句系列1]    [Exit For]    [语句系列2]  Next [element]  使用For Each……Next语句或将前面例子中的代码改写为以下形式:  Dim MyCell As Range  For Each MyCell In Selection    MyCell = UCase(MyCell)  Next