靠谱电子书 > 经管其他电子书 > excel_vba_编程教程(完整版) >

第63部分

excel_vba_编程教程(完整版)-第63部分

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



集合(Collection)—— 一个包含一组相关对象的对象  
类(Class)—— 对象的定义,包含其名称、属性、方法和事件。类充作一种对象模版,在允许的 
时候,由此创建对象示例。  
示例(Instance)—— 术语类的一种特定对象,称为类的示例。当你创建一个示例的时候,你也 
就创建了一个新对象,它拥有类定义的属性和方法。  
类模块(Class Module)—— 包含类定义的模块,包括它的属性和方法定义  
模块——模块含有Sub(子过程)和Function(函数)过程,可为其它VBA过程使用,并且和任何对 
象没有特别的关系。  
窗体模块——包含给由用户窗体或者其控件引发的事件过程使用的VBA代码。窗体模块是一种类模 
块。  
事件—— 一种可以为对象识别的对象,例如鼠标点击或者按键,你可以为其定义应对操作。事件 
可以由用户操作,或者VBA语句或者系统引发。  
事件过程—— 一个可以自动执行的过程,是对用户引发的事件或者系统引发的程序代码的反应。  

1。使用集合  

一组相类似的对象成为集合。例如,在Excel里,所有打开了的工作簿属于Workbooks集合,而某个 
具体工作簿里面的所有工作表都是Worksheets集合里面的成员。在Word里,所有打开的文档都属于 
Documents集合,一个文档里的每个段落都是Paragraphs集合的成员。集合是包含其它对象的对象。 
无论你想要使用什么集合,你都可以做下述事情:  
* 使用索引值可以引用集合里的特定对象,例如,要指向Worksheets集合里的第二个对象的话, 
    那么使用下述语句的任意一条:  
    Worksheets(2)。Select   
    或者  

                                          214 

… 页面 231…

    Worksheets(〃Sheet2〃)。Select   
* 使用Count属性可以知道集合里的成员数目,例如,当你在立即窗口里输入语句:  
    ?Worksheetsunt   
    VBA将会返回当前工作簿里的工作表总数  
* 使用Add方法可以在集合里插入新的项目,例如,当你在立即窗口里输入语句:  
    Worksheets。Add  
    VBA将会在当前工作簿里面插入一个新的工作表,这时,Worksheets集合里多了一个成员。  
* 使用For Each…Next循环可以遍历集合里的每个对象。假设你打开了一个工作簿,包含五个工 
    作表,它们的名称为:  
     “Daily wages”, “Weekly wages”, “Bonuses”, “Yearly salary”和“Monthly wages”。 
    使用下述过程将名称里包含“wages”的工作表删除:  
    Sub DeleteSheets()   
         Dim ws As Worksheet   
         Application。DisplayAlerts = False   
         For Each ws In Worksheets   
               If InStr(ws。Name; 〃wages〃) Then   
                     ws。Delete   
               End If   
         Next   
    End Sub   
当你编写你自己的VBA过程时,你可能会碰到这样一种情况,那就是,没有方便的内置集合来处理 
你的任务。解决办法就是创建自定义集合。从第七章,你就已经知道如何通过动态或静态数组来实 
用多个数据。因为,集合有允许你添加、移动和计算其成员的内置属性和方法,所以使用集合比使 
用数组容易得多。  

2。声明自定义集合  

要创建一个用户定义的集合的话,你应该先声明一个Collection类型的对象变量,该变量在Dim语 
句里和关键字New一起声明,如下所示:  
Dim 集合名称 As New Collection   

3。给自定义集合添加对象  

在声明Collection对象后,你就可以使用Add方法往集合里插入新成员了。用来组成该集合的对象 
不必需要是同样的数据类型。Add方法如下所示:  
object。Add item; key; before; after   
你只需要明确对象和成员,object是集合名称,它是使用在Collection对象声明中的相同名称;item 
是你要添加到集合里的对象。尽管其它的参数是可选的,但是它们也很有用。集合里的成员自动从 
1开始分配号码,了解这个很重要。然而,它们也可以给分配一个独特的键。除了通过索引号(1, 
2,3等等)访问某个特定的成员之外,你也可以在集合添加对象的时候给该对象分配一个键。例如, 
如果你创建一个自定义工作表集合,那么你应该使用工作表名称作为键;要鉴别学生或者员工集合 
里的单个人员的话,你就可以使用社会保险号码(SSN)作为他们的键。  
如果你想要确定对象在集合里面的位置时,那么你就应该使用before或者after参数(不要同时使 
用它们)。参数before在此之前添加新对象的对象,而参数after是一个对象,在它之后添加新的对 
象。  
接下来过程Getments声明了一个叫做colNotes的自定义集合,该过程提示输入作者姓名,然后 
在活动工作簿里遍历所有的工作表,以找到该作者的批注。只有某个特定作者输入的批注会加入自 
定义集合。过程给第一个批注分配一个键,然后将剩余的批注添加到集合里,每次都将它们置于最 
后添加的批注之前(注意before参数的使用)。如果集合至少有一个批注,那么过程会在一个信息 
框显示由参数key确定的批注内容。注意,参数key如何用来引用集合里的成员。然后,过程将集合 
里的所有批注打印到立即窗口。文本函数(Mid和Len)用来仅获取批注内容,而排除作者姓名。接 
着,返回工作簿里的批注数目和自定义集合里的批注数目到Count属性。在试验过程Getments 
之前,我们先得按照以下步骤创建一个工作簿:  
                                            215 

… 页面 232…

1。 打开一个新工作簿并保存为Chap11。xls  
2。 在工作表Sheet1的任意单元格上单击右键,并从快捷菜单上选择插入批注,随意输入一些文本。 
    在批注框之外的任意地方点击一下,退出批注编辑模式。使用相同的技巧在工作表Sheet2再插 
    入两个批注,给每个批注输入不同的文本。在当前工作簿里插入新工作表(Sheet4),并插入一 
    个批注。现在你应该在三个工作表里一共有四个批注。  
3。 选择“工具”|“选项”并且点击“常规”页,用户名文本框里面应该显示的是你的名字,删除 
    你自己的名字,并输入Joan Simth,并点击确定。现在,在工作表Sheet2和Sheet4的任意地方 
    各输入一个批注。这些批注应该会自动地印上Joan Smith的名字。当你输入完批注后,回到选 
    项对话框,并将常规页上的用户名改回你自己的名字。  
4。 切换到VB编辑器,并将VBA工程重命名为ObjColClass  
5。 在当前工程里添加一新模块,并重命名为MyCollection  
6。 输入过程Getments,显示如下:  
    Sub Getments()   
         Dim sht As Worksheet   
         Dim colNotes As New Collection   
         Dim myNote As ment   
         Dim I As Integer   
         Dim t As Integer   
         Dim fullName As String   
         fullName = InputBox(〃Enter author's full name:〃)   
         For Each sht In ThisWorkbook。Worksheets   
               sht。Select   
               I = ActiveSheetmentsunt   
              For Each myNote In ActiveSheetments   
                    If myNote。Author = fullName Then   
                         MsgBox myNote。Text   
                          If colNotesunt = 0 Then   
                               colNotes。Add Item:=myNote; key:=〃first〃   
                         Else   
                               colNotes。Add Item:=myNote; Before:=1   
                         End If   
                    End If   
              Next   
               t = t + I   
         Next   
         If colNotesunt  0 Then MsgBox colNotes(〃first〃)。Text   
         MsgBox 〃Total ments in workbook: 〃 & t & Chr(13) & _   
               〃Total ments in collection:〃 & colNotesunt   
         Debug。Print 〃ments by 〃 & fullName   
         For Each myNote In colNotes   
              Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _  
                    Len(myNote。Text))   
         Next   
   End Sub   
7。 运行过程Getments并且查看结果  

4。从自定义集合移出对象  

从自定义集合里移出成员和添加成员一样简单。使用Remove方法可以移出对象,如下所示:  
object。Remove item  
object是自定义集合的名称,含有你要移出的对象;item是你要从集合移出的对象。  

                                          216 

… 页面 233…

我们来修改你在前面部分准备的过程Getments,示范从集合里移出成员。在该过程结尾,我们 
将当前集合colNotes里成员的内容一个一个地显示出来,并且询问用户,使用应该将该成员从该集 
合移出。  
1。 将下面的声明加入到过程Getments的声明部分:  
    Dim response   
    Dim myId As Integer   
    第一条语句声明了一个叫做response的变量,你将使用该变量来储存Msgbox函数的结果。第二 
    条浴巾声明变量myld来储存集合对象的索引号。  
2。 定位过程Getments的下述语句:  
    For Each myNote In colNotes   
    在上面的语句之后,添加下述语句:  
    myId = 1   
3。 定位到过程Getments的下述语句:  
    Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _   
      Len(myNote。Text))   
    在该语句后,输入下面的代码块:  
      response = MsgBox(〃Remove this ment?〃 & Chr(13) _   
      & Chr(13) & myNote。Text; vbYesNo + vbQuestion)   
      If response = 6 Then   
           colNotes。Remove Index:=myId   
      Else   
           myId = myId + 1   
      End If   
4。 在该过程输入下述语句:  
      Debug。Print 〃The following ments remain in the collection:〃   
      For Each myNote in colNotes   
           Debug。Print Mid(myNote。Text; Len(myNote。Author) + 2; _   
           Len(myNote。Text))   
      Next   
5。 运行过程Getments,并且将显示在信息框里批注之一删除。  
修改后的过程Getments2可以在附带的CD里找到。该过程将指定的批注从自定义集合里清除,但 
是不会从工作表里删除批注。  
技巧11…1 给集合重新编号  
当移出对象后,集合回自动重新编号,因此,你可以使用1作为Index参数,来删除自定义集合里的 
所有对象,如下所示:  
Do While myCollectionunt 》0  
    myCollection。Remove Index:=1  
Loop  
插入:模块还是类模块?  
在VB编辑器的插入菜单里有两个模块命令:模块和类模块。这些在本章的开头有定义。到目前为止, 
你已经使用过标准模块来创建Sub和Function过程。你将第一次在本章使用类模块来创建自定义对 
象并且定义它的属性和方法。  

5。创建自定义对象  

创建一个新的,非标准的VBA对象,需要在你的工程里插入类模块并且在模块里添加代码。然而, 
在做此之前,你需要对类是什么要有一个基本的了解。  
如果你回头看一下本章的开头,那么你就会知道类从某种意义上说是对象模板。一个经常使用的类 
比就是将类比作一个曲奇剪切机。就像曲奇剪切机决定某个曲奇做成什么样一样,类的定义决定某 
个对象应该是什么样以及如何做。在实际使用一个对象类之前,你必须先创建一个类的新示例。对 
象示例就是这些曲奇。每个示例都有其类定义的特点(属性和方法),正如你可以使用相同的区旗 

             

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的