阅读(285) (0)

VBA对象及电子表格单元格操作

2016-11-12 11:26:53 更新

要在 Excel 里创建一些自定义应用程序,需要一些常用对象或者对象集合的工作知识,例如 Range,Workbook (Workbooks),Worksheet (Worksheets),Window (Windows) 和  Application。在前面部分,你开拓了学习 VB 的许多方法。这里有一个总结关于什么时候使用什么工具:


当你在一个现行 VBA 过程,对对象、属性或方法有疑义时按 F1 打开在线帮助,如果你需要快速列出每个可用对象的属性和方法时,或者查找一个很难找到的过程时,使用对象浏览器。如果你想要测试VBA并且立即查看VBA命令的结果时,激活立即窗口。


Excel对象模型里的Range对象

图2-25 Excel 对象模型里的 Range 对象


电子表格单元格操作

当你已经准备好编写你自己的 VBA 过程,将电子表格任务自动化的时候,你很可能是从寻求操作电子表格单元格的指令开始的。你需要知道如何选择单元格,如果在单元格输入数据,如何给单元格区域命名,如何设置单元格格式,以及如何移动,复制和删除单元格。虽然这些任务可以通过鼠标或键盘轻易执行,掌握VBA这些方面的技术需要一些练习。你必须使用Range 对象来引用单个单元格,单元格区域,行或列。如果你看了 Excel 对象模型,你会注意到Range 对象是另外一个大对象——Worksheet 对象——的一部分。有三种属性让你访问Range 对象:Range 属性,Cells 属性和 Offset 属性。

使用Range属性

Range 属性返回一个单元格或者单元格区域。引用必须是 A1 在引号里的样式(例如:”A1”)引用可以包括区域运算符冒号(例如:”A1:B2”)或者联合运算符逗号(例如:”A”,”B12”)

Range属性

使用 Cells 属性

当你要选择一个确定的单元格时,Cells 属性要求两个自变量,第一个是行号,第二个是列号或者列字母。自变量输入在括号中。如果忽略自变量,Excel 将会选择当前工作表的所有单元格。
exce

注意,在上面的例子中,你如何结合使用 Range 和 Cells 属性:

Range(Cells(6, 1), Cells(10, 1)).Select

在上面的例子里,第一个 Cells 属性返回单元格 A6,而第二个返回单元格 A10。Cells 属性返回的单元格之后又当做 Range 对象的参数。结果 Excel 就选择了上面单元格为第一个 Cells 属性返回的结果和下面为第二个 Cells 属性返回单元格的区域了。

工作表是单元格的集合,你也可以使用只带一个自变量的 Cells 属性来表示单元格在工作表所有单元集合中的位置。Excel 按下列方式给单元格编号:单元格 A1 是工作表中的第一个单元格,B1 是第二个,C1 是第三个,等等。Cell256 是第一行中的最后一个单元格。你也许会想起 Excel 只有 256 列。

Cells

注意,Item 是返回一个集合成员的属性。因为 Item 是一个集合的默认成员,你可以直接引用工作表单元格,而不必明确地使用 Item 属性。现在你发现了两种方法选择单元格(Range 属性和 Cells 属性),你也许很迷惑为什么要使用更复杂的 Cells 属性呢?很明显 Range 属性更具有可读性,毕竟,你远在决定学习 VBA 之前就在 Excel 公式和
函数里面使用了 Range 引用。然而,当需要将单元格当做集合操作的时候,Cells 属性则使用更方便。使用这个属性去访问单元格集合中的所有单元格或者单个单元格。

使用 Offset 属性

另外一个引用工作表单元格非常灵活的方法是使用 Offset 属性。当工作表任务自动化时,你也许不知道某个单元格的确切地址。你如何能够选择一个你根本不知道地址的单元格?你可以让 Excel 基于当前选择的单元格来选择一个位置。Offset 属性通过计算从开始选择的单元格向下或向上移动的具体行数,来得到新的区域。同样也可以从当前选择的单元格区域向右或向左移动具体的列数。

Offset 属性使用两个自变量来获得新单元格区域的地址。第一个自变量表示行偏移,第二个自变量则表示列偏移。我们来测试一下几个例子:

Offset属性

上面的第一个例子里,Excel 选择的时单元格 D2。一旦你输入了第二个例子,Excel选 择了单元格 C13。如果单元格 A1 和 D15 已经被选中了,你也可以将上面的两个例子改写为这样:

Selection.Offset(1, 3).Select
Selection.Offset(-2, -1).Select

注意,上面第三个例子里的第二个自变量是 0,第一个或第二个自变量为 0 时,Offset 属性相应表示当前行或当前列。如果当前活动单元格在第一行,那么指令 ActiveCell.Offset(-1, 0).Select 会导致错误。

当使用 Offset 属性时,你可能有时需要改变选择区域的大小。假设开始选择的区域是A5:A10,如何将选择区域向下移动两行,向右移动两列,然后再改变新选择区域的大小呢?假设新的选择区域应该是 C7:C8。Offest 属性只能完成前面部分,后面部分要求另外一个属性来完成。Excel 有个专门的 Resize 属性,你可以结合 Offset 属性和 Resize 属性来回到上面的问题。在你结合这两个属性之前,我们先来看看如何独立地使用它们:
1.将 Excel 窗口和 VB 窗口并排显示
2.激活立即窗口,并且输入下述指令:

Range("A5:A10").Select
Selection.Offset(2, 2).Select
Selection.Resize(2, 4).Select

上面的第一条指令选择区域 A5:A10,当前活动单元格是 A5。第二条指令将选区偏移到C7:C12。单元格 C7 处于活动单元格A5的向下两行和向右两列。现在,活动单元格是 C7。最后一条指令将当前选区改变大小,单元格区域 C7:C8 被选中了,而不再是 C7:C12。象Offset 属性一样,Resize 属性也需要两个自变量。第一个是你要选取的行数,第二个则是要选取的具体列数因此,指令

Selection.Resize(2, 4).Select 将当前选择区域改为两行和四列

后面两行指令可以结合成下面方式:

Selection.Offset(2, 2).Resize(2, 4).Select

上面的例子,先是 Offset 属性计算得到新区域的起始点(译者:选区左上角的单元格),接着是 Resize 属性决定新选区的大小,然后是 Select 方法选取具体的单元格区域。

技巧:录制单元格的选择
宏录制器默认地使用 Range 属性录制选择单元格。如果你打开宏录制器,并且选择单元格A2,输入“text”,再选择单元格A5,你将在 VB 编辑器窗口里得到下述代码:

Range("A2").Select
ActiveCell.FormulaR1C1 = "text"
Range("A5").Select

如果你使用相对引用方式,宏录制器会使用 Offset 属性。你可以在录制前,点击宏录制工具条上的相对引用按钮。宏录制器将得到如下代码:

ActiveCell.Offset(-3, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "text"
ActiveCell.Offset(3, 0).Range("A1").Select

当你使用相对引用方式录制宏时,过程总是会选择相对于当前活动单元格的单元格。注意,上面指令中的第一和第三行的引用单元格 A1,即使我们没有涉及到 A1 的任何东西。你可能记得,在第一章中,宏录制器用它自己的方式将事情搞定。为了将上面的指令变简单一些,你可以删除对单元格 A1 的引用:

ActiveCell.Offset(-3, 0).Select
ActiveCell.FormulaR1C1 = "text"
ActiveCell.Offset(3, 0).Select

使用相对引用来录制过程后,不要忘记再次点击这个按钮,如果下次录制一个非相对地址的过程。

选择单元格的其它方法

如果你经常需要访问你工作表里某些遥远的单元格,你可能已经对下面的键盘快捷键很熟悉:End+上箭头, End+下箭头, End+左箭头和End+右箭头。在 VBA 中,你可以使用 End 属性快速地移动到遥远的单元格。

单元格

注意,End 属性要求一个自变量来表示你要移动的方向。使用下列 Excel 内置的常数来跳到具体的方向:xlright, xlleft, xlup, xldown。

 在新版本(2010版本之后)的office中xlright和xlleft需要替换为xltoleft和xltoright


选择行和列

Excel 使用 EntireRow 和 EntireColumn 属性来选择整行或整列。

选择行和列

你选择了一个单元格区域,你也许想要知道选区包括多少行,多少列。我们来让 Excel 计算区域 A1:D15 中的行数和列数:

1.  在立即窗口里输入下述 VBA 语句

Range("A1:D15").Select

如果 Excel 窗口可见,当你按回车后,VBA 会选中区域 A1:D15

2.输入下列语句来得到选区的行数

?Selection.Rows.Count

一旦你回车,VBA 在下一行显示结果。你的选择包括 15 行
 
3.输入下列语句来得到选区的列数

?Selection.Columns.Count

现在 VBA 告诉你,选中的区域 A1:D15 占据了四列的宽度。

4.将光标放在关键字 Rows 或 Columns 中的任意位置,并且按下 F1,获取这些有用属性的更多信息。

获取工作表信息

Excel 工作表有多大?它有多少单元格,列和行?即使你忘记了这些细节,使用 Count 属性。

获取工作表信息
Excel 2002工作表里有16,777216个单元格,65,536行和256列。

往工作表输入数据

输入工作表里的信息可以是文本,数字或者公式。你可以使用 Range 对象的两种属性之一来往单元格或单元格区域里输入数据:Value 属性或者 Formula 属性。

Value 属性:
ActiveSheet.Range("A1:C4").Value = "=4 * 25"

Formula 属性:
ActiveSheet.Range("A1:C4").Formula = "=4 * 25"

上面两种例子,A1 单元格都显示 4 乘 25 的结果 100。

输入数据

返回工作表中的信息

毫无疑问,你在某些 VB 过程中可能需要返回单元格或者单元格区域的内容。虽然你既可以使用 Value 属性也可以使用 Formula 属性,但是,这次,Range 对象的这两个属性是不可互用的。

Value 属性显示具体单元格中公式的结果。例如,如果 A1 中含有公式“= 4 * 25”,那么指令 ?Range("A1").Value 将会返回值 100

如果你想要显示公式,而不是结果,那么你必须使用 Formula 属性:?Range("A1").Formula。
Excel 将会显示公式“= 4 * 25”而不是结果 100。