第8学时 对象介绍
3)按下Alt+F11键,打开VisualBasic编辑器。
4)按下F1键,激活“帮助”。
5)输入问题“什么是对象”。
6)按回车键,从列出的主题中选择“MicrosoftExcel对象”,此时会显示一张详细的对象模型图,如图8-1所示
最常用的5个对象
尽管在Excel的对象模型中包括100多个对象,但你会发现程序设计主要集中在如下五个对象上:
* Application
* Workbook
* Worksheet
* Range
* Chart
Application对象代表Excel。使用Application对象可以控制应用程序级的设置、内置的Excel函数以及高级方法,例如InputBox方法。
Workbook对象是指Excel中的工作簿,即是说Excel文件。在VBA环境中,不说打开一个文件,而称为打开一个工作簿;也不说保存一个文件,而称为保存工作簿。
学习Excel时最先了解到的其中一点就是,Workbook中包括Worksheet。Worksheet是Workbook中独立的页,数据就保存在Worksheet中。
Worksheet中包括单元格(Cell)。你也许会认为不得不编写大量的代码以对单元格对象进行控制,但是,实际上没有单元格这样的对象。有单元格属性,将在后面的学时中学到。相反,你将对范围(Range)对象进行处理。范围对象是指一个或者多个单元格。
大多数Excel用户都使用Excel的图表功能,所以你经常需要处理图表(Chart)对象。用“图表向导”创建图表时所做的一切都可以通过VBA代码做到。
例如,要引用工作簿Book1中的工作表Sheet1上的范围A1,必须使用如下代码:
Application.Workbooks("Book1").Worksheets("Sheet1").Range("A1")
实际上,在大多数情况下,可以省略对Application对象的引用(Application.InputBox是一个例外)。可以通过如下代码引用范围A1:
Workbooks("Book1").Worksheets("Sheet1").Range("A1")
在代码中,并不总是需要使用完全限定的对象名。在某些情况下,例如在代码中某个工作表刚被激活时,可以使用如下较短的引用方式:
Range("A1")
如何限定对象取决于你的经验。限定一个对象必须可以将它和同名的对象区分开来。例如,你可能有两个工作簿,每个工作簿中都有一个名为Sheet1的工作表,在这种情况下,需要使用完整的限定名称以免混淆。
用如下代码:
Range("A1").Value=100
DimsngValueAsSingle
SngValue=Range("A1").Value
Workbooks("VBA Example").Open
某些方法是带参数的,而参数又可能是必须的或者可选的。例如,以下代码将工作簿保存为“CurrentBudget”:
This Workbook.SaveAs Filename="Current Budget"
你也许已经猜到,有时对方法的引用就像对专门为某个对象设计的过程和函数的使用。
这也可以解释为什么有的方法具有参数,有的方法甚至还有返回值。
8.9.1 Add方法
所有集合的一个共有特点是可以添加项目。通过添加可以在集合中创建新的元素。要在一个集合中创建新的元素,可以使用Add方法。例如,要添加一个新的工作簿,可以使用如下代码:
Workbooks.Add
这行代码等价于打开Excel的文件菜单并添加一个新的工作簿。要添加一个新的工作表到工作簿中,可以使用如下代码:
Worksheets.Add
8.9.2 Count属性
集合支持一个非常有用的名叫Count的属性。Count属性保存集合中元素的数目。如果希望知道一个工作簿中包括多少张工作表,可以使用如下代码:
Dimi WSCount As Integer
IWSCount=Worksheets.Count
你也许想知道为什么要使用Count属性。设想你正在创建一个应用程序,其中包含与一周的各个工作日相对应的工作表,当工作簿完成之后,可以通过使用Count属性来检测工作簿是否包括五张工作表。在这种情况下,可以使用类似程序清单8-4中的代码。
程序清单8-4 使用Count属性
--------------------------------------------------------------------------------
1: Sub CountWorkSheets ()
2: Dim iWSCount As Integer
3: Dim sMessage As String
4:
5: iWSCount=Worksheets.Count
6:
7: If iWSCount <> 7 Then
8: sMessage="The workbook contains"& iWSCount
9: sMessage=stessage &"It should contain 7 worksheets"
10: MsgBox sMessage
11: End If
12: End Sub
9.1.2 Application对象有用的属性和方法
你将发现Application对象有几种非常有用的属性和方法。其中一些属性如下:
* ActiveWorkbook 返回当前活动的工作簿。
* ActiveSheet 返回当前活动的工作簿中活动的工作表。返回的工作表可以是Excel支持的任何工作表类型,包括工作表和图表工作表。
* ActiveCell 返回当前活动的工作簿中活动的工作表中活动的单元格。
* ThisWorkbook 返回正在执行的过程所驻留的工作簿。
* MailSystem 返回本系统所采用的邮件系统。当进行邮件自动化时本属性非常有用。
* MailSession 用于检测用户是否登录了电子邮件。
* OperatingSystem 当开发由Windows和Mac用户使用的VBA应用程序时,这个属性非常有用。可以用这个属性来决定所使用的操作系统,并且做出必要的改变。
* Selection 用于决定当前选中了什么,可以是单元格、图表、图形对象等等。
你已经使用过一个Application对象的方法—InputBox。InputBox方法可以显示一个输入框,并且可以指定返回值的数据类型。Application对象的其他有用的方法包括:
* MailLogon和MailLogoff和MailSystem和MailSession属性配合使用,这两个方法可以登录和退出电子邮系统。
* Quit 用于退出Excel。
* Run 用来执行Excel4.0宏。
.2 Workbook对象
现在,你已经知道Workbook对象代表Excel文件。正因为如此,你也许可以立刻想到需要使用Workbook对象来处理的各种类型的事件:打开、保存、打印和关闭。以下首先学习Workbook对象的一些最常用的方法,而不是从这个对象的属性开始学习。
* Activate 本方法用来激活工作簿。
* Close 用于关闭工作簿。
* Save 用于保存工作簿。
如果在使用Save方法之前没有保存过该工作簿,该工作簿将以它当前的名字保存。这意味着它将被保存为诸如Book1这样的名字。
* SaveAs 用于保存工作簿。本方法和Save方法的区别在于本方法有几个有用的可选参数,包括Filename、FileFormat、Password、WriteResPassword和ReadOnlyRecommended。
* PrintOut 本方法用于打印整个工作簿。
* PrintPreview 本方法用于在打印预览中显示工作簿。
9.3 Worksheet对象
果希望对整个工作表进行某些格式设置,怎样才能选中工作表中的所有单元格呢?
通过使用Cells属性可以做到。如果希望设置一张工作表上所有单元格的字体,可以使用如下代码:
Worksheets("Sheet1").Cells.Font.Name="Arial"
也许会用到以下三个Worksheet对象的方法:
* Activate 激活工作表。
* CheckSpelling 用于检查工作表中内容的拼写。
* Delete 用于删除某个工作表。
第10学时 Range对象
而在VBA中,则称为和Range对象打交道。对于一个程序员来说,在所有的Excel对象中,对Range对象的处理是最频繁的。
正因为如此,在本学时中,你将学习有关Range对象的各种知识。
一个Range对象可以是:
* 一个单独的单元格。
* 对单元格的选择。
* 多个选择。
* 一行或者一列。
* 一个3D区域。
10.1.1 Range对象的属性
和学习其他对象一样,首先需要学习Range对象的一些属性和方法。Range对象最有用的一些属性如下:
* Address 本属性返回Range的当前位置。
* Count 本属性用于决定Range中单元格的数目。
* Formula 本属性返回用于计算显示值的公式。
* Offset 本属性对于从一个Range移动到另一个Range非常有用。
* Resize 通过它可设置当前选中的Range的大小。
* Value 返回Range的数值。
1)在单元格B1中输入“100”,在单元格B2中输入“200”,在单元格B3中输入“300”。
2)选中单元格B4,并输入“=SUM(B1:B3)”。
3)按下Alt+F11键打开VisualBasic编辑器,在当前工作簿中插入一个新的模块。
4)创建一个名为“RangeProperties”的过程。
5)为该过程输入如下代码:
1: Sub RangeProperties ()
2: ThisWorkbook.Worksheets("Sheet1").Range("A1").Activate
3: ActiveCell.Offset(2,2).Activate
4: Msgbox "The current active cell is"& ActiveCell.Address
5:
6: Msgbox "The value of B4 is"& Range("B4").Value
7: Msgbox "The formula of B4 is" & Range("B4").Formula
8: End Sub
6)回到工作簿的Sheet1,运行RangeProperties过程。显示的第一个消息框告诉你激活的单元格为C3,如图10-1所示。
在本过程中,做的第一件事是激活单元格A1:
ThisWorkbook.Worksheets("Sheet1").Range("A1").Activate
激活单元格A1之后,用Offset方法移动到单元格C3,并且在消息框中显示新激活的单元格的地址:
ActiveCell.Offset(2,2).Activate
Msgbox "The current active cell is" & ActiveCell.Address
通过Offset属性,可以移动到另一个Range位置,这个属性的语法如下:
rangename.Offset(RowOffset,ColumnOffset)
可选参数RowOffset和ColumnOffset控制移动的方向。在本过程中,将这两个参数均设置为2,这就将Range移动到了C3。
接下来是显示单元格B4的数值和计算公式:
Msgbox "The value of B4 is" &Range("B4").Value
Msgbox "The formula of B4 is" &Range("B4").Formula
这两行代码很好地说明了Range对象的Value属性和Formula属性的区别。Value属性返回显示在单元格中的数值,而Formula属性则返回单元格中实际输入的公式。
10.1.2 Range对象的方法
Range对象同样具有多种多样的方法,包括:
* Activate 激活一个Range。
* Clear 清除一个Range的内容。
* Copy 将一个Range的内容复制到剪贴板。
* Cut 将一个Range的内容剪切到剪贴板。
* PasteSpecial 将剪贴板的内容粘贴到Range中。
* Select 选择一个Range。
在VBA代码中,用得最多的单独的对象可能就要算Range对象了。Range对象是Excel的对象世界中真正的工作对象。作为Excel用户,你将把大部分时间花在对Range对象的处理上。
在本学时中,将学习多种对Range对象进行处理的技术。
本学时的重点包括:
* 理解Range对象的作用
* 使用With语句
* 使用For Each语句
* 分析几个使用Range对象的过程
10.1 Range对象
作为Excel用户,你基本上是和工作表上的单元格打交道。而在VBA中,则称为和Range对象打交道。对于一个程序员来说,在所有的Excel对象中,对Range对象的处理是最频繁的。
正因为如此,在本学时中,你将学习有关Range对象的各种知识。
一个Range对象可以是:
* 一个单独的单元格。
* 对单元格的选择。
* 多个选择。
* 一行或者一列。
* 一个3D区域。
10.1.1 Range对象的属性
和学习其他对象一样,首先需要学习Range对象的一些属性和方法。Range对象最有用的一些属性如下:
* Address 本属性返回Range的当前位置。
* Count 本属性用于决定Range中单元格的数目。
* Formula 本属性返回用于计算显示值的公式。
* Offset 本属性对于从一个Range移动到另一个Range非常有用。
* Resize 通过它可设置当前选中的Range的大小。
* Value 返回Range的数值。
在上面的程序清单中列出的属性只是Range对象属性很小的一部分,实际上,Range对象的属性多达几十个。在下面的练习中,将熟悉Range对象的一些属性。在开始前,关闭所有的工作簿,并打开一个新的工作簿。接着从创建一个新的工作表开始:
1)在单元格B1中输入“100”,在单元格B2中输入“200”,在单元格B3中输入“300”。
2)选中单元格B4,并输入“=SUM(B1:B3)”。
3)按下Alt+F11键打开VisualBasic编辑器,在当前工作簿中插入一个新的模块。
4)创建一个名为“RangeProperties”的过程。
5)为该过程输入如下代码:
ThisWorkbook.Worksheets("Sheet1").Range("A1").Activate
ActiveCell.Offset(2,2).Activate
Msgbox "The current active cell is"& ActiveCell.Address
Msgbox "The value of B4 is"& Range("B4").Value
Msgbox "The formula of B4 is"& Range("B4").Formula
6)回到工作簿的Sheet1,运行RangeProperties过程。显示的第一个消息框告诉你激活的单元格为C3,如图10-1所示。
图10-1 将Address属性用作创建消息框文本的内容
7)单击“确定”按钮,下一个消息框显示单元格B4的数值。
8)单击“确定”按钮,最后一个消息框显示单元格B4的计算公式。
9)单击“确定”按钮,退出消息框。
熟悉上面例子中显示信息的细微区别了吗?为了确保对本例中代码的理解,请花一点时间复习一下。程序清单10-1显示了完成后的过程。
程序清单10-1 RangeProperties过程
--------------------------------------------------------------------------------
1: Sub RangeProperties ()
2: ThisWorkbook.Worksheets("Sheet1").Range("A1").Activate
3: ActiveCell.Offset(2,2).Activate
4: Msgbox "The current active cell is"& ActiveCell.Address
5:
6: Msgbox "The value of B4 is"& Range("B4").Value
7: Msgbox "The formula of B4 is" & Range("B4").Formula
8: End Sub
--------------------------------------------------------------------------------
在本过程中,做的第一件事是激活单元格A1:
ThisWorkbook.Worksheets("Sheet1").Range("A1").Activate
激活单元格A1之后,用Offset方法移动到单元格C3,并且在消息框中显示新激活的单元格的地址:
ActiveCell.Offset(2,2).Activate
Msgbox "The current active cell is" & ActiveCell.Address
通过Offset属性,可以移动到另一个Range位置,这个属性的语法如下:
rangename.Offset(RowOffset,ColumnOffset)
可选参数RowOffset和ColumnOffset控制移动的方向。在本过程中,将这两个参数均设置为2,这就将Range移动到了C3。
接下来是显示单元格B4的数值和计算公式:
Msgbox "The value of B4 is" &Range("B4").Value
Msgbox "The formula of B4 is" &Range("B4").Formula
这两行代码很好地说明了Range对象的Value属性和Formula属性的区别。Value属性返回显示在单元格中的数值,而Formula属性则返回单元格中实际输入的公式。
10.1.2 Range对象的方法
Range对象同样具有多种多样的方法,包括:
* Activate 激活一个Range。
* Clear 清除一个Range的内容。
* Copy 将一个Range的内容复制到剪贴板。
* Cut 将一个Range的内容剪切到剪贴板。
* PasteSpecial 将剪贴板的内容粘贴到Range中。
* Select 选择一个Range。
10.2 使用With语句
现在,你对Excel中最常用的对象已经比较熟悉了。接下来,将学习一个结构,通过这个结构可以使对对象的处理更为容易。当对Range对象进行处理时,一个最普通的任务是设置各种各样的属性。程序清单10-2显示了用于对Range对象执行各种格式设置的代码的例子。
程序清单10-2 设置Range对象格式的代码
--------------------------------------------------------------------------------
1: Range("A1:A6").NumberFormat="#,##0.00"
2: Range("A1:A6").Font.Name="Courier New"
3: Range("A1:A6").Font.FontStyle="Regular"
4: Range("A1:A6").Font.Size=11
5: Range("A1:A6").Font.Strikethrough=False
6: Range("A1:A6").Font.Superscript=False
7: Range("A1:A6").Font.Subscript=False
8: Range("A1:A6").Font.OutlineFont=False
9: Range("A1:A6").Font.Shadow=False
10: Range("A1:A6").Font.Underline=xlUnderlineStyleNone
11: Range("A1:A6").Font.ColorIndex=xlAutomatic
程序清单10-3 With语句的例子
--------------------------------------------------------------------------------
1: With Range ("A1:A6")
2: .NumberFormat="#, ##0.00"
3: WithFont
4: .Name="Courier New"
5: .FontStyle="Regular"
6: .Size=11
7: .Strikethrough=False
8: .Superscript=False
9: .Subscript=False
10: .OutlineFont=False
11: .Shadow=False
12: .Underline=xlUnderlineStyleNone
13: .ColorIndex=xlAutomatic
14: End With
15: End With
10.3 使用For Each语句
With语句是用来执行同一个对象的多个语句,而For Each语句则是用来对多个对象执行同一条语句。通过ForEach语句,可以对集合中的每个元素重复执行同样的语句。
For Each语句也可用于数组。
For Each语句的语法如下:
For Each element In group
[Statements]
[Exit For]
[Statements]
Next
注意,该语法支持Exit For从句。和其他Exit从句一样,ExitFor从句通常位于一条If语句中。如果需要改变Range中每个单元格的数值,可以使用程序清单10-5中的代码。
程序清单10-5 For Each语句的例子
--------------------------------------------------------------------------------
1:Sub ForExample ()
2: Dim x As Range
3:
4: For Each x In ThisWorkbook.Worksheets("Sheet1").Range("A1:A6")
5: x.Value=x.Value + 10
6: Next
7:End Sub
1:Sub BoldEveryOther ()
2: Dim iCounter As Integer
3:
4: For iCounter=3 To ThisWorkbook.Worksheets("Sheet1")_
Range("A1:C25").Rows.Count Step 2
5: ThisWorkbook.Worksheets("Sheet1").Range("A1:C25")._
Rows(iCounter).Font.Bold=True
6: Next
7:
8: End Sub
本过程中主要的关键在于For Next语句。注意iCounter设置的初始值为3,即从第三行开始隔行加粗。Step的值为2决定了是隔行加粗。图10-3显示了该过程运行后的工作表。