一、四个重要概念
在Excel VBA中,对象、方法、属性、事件是四个很重要的概念。
对象 代表应用程序中的元素,比如,工作表、单元格、图表、窗体,或是一份报告。
方法 指的是对象能执行的动作。例如,Add、Copy工作表,Select工作簿等。
属性 对象的属性定义了对象的特征,诸如大小、颜色或屏幕位置,或某一方面的行为,诸如对象是否有激活或可见的。可以通过修改对象的属性值来改变对象的特性。例如,Name、Value、Count、Row等
事件 是一个对象可以辨认的动作,像单击鼠标或按下某键等,并且可以写某些代码针对此述动作来做响应。用户做动作或程序代码的结果可能导致事件的发生,或是由系统引发。例如,Enter、Exit、MouseDown、Change等
二、VBA中的单元格对象
大家都知道,在VBA中可以用Range和Cells引用单元格,但其实,Range对象是范围对象,代表某一单元格、某一行、某一列、某一选定区域(该区域可包含一个或若干连续单元格区域),或者某一三维区域。而Cells并不是对象成员,是对象的属性。Cells属性应用于 Range 对象时,返回 Range 对象,该对象代表指定区域内的单元格。当其应用于 DataSheet对象(代表 Microsoft Graph 数据表)时,也返回Range 对象,该对象代表数据表上的所有单元格(不仅仅是当前正在使用的单元格)。所以从严格意义上来说,Excel对象模型不存在单元格对象。
注:一个对象可以包含多个对象,比如Workbook包含Worksheet,Worksheet包含Range,所以Range对象在Excel对象模型中位于第三层: Application——Workbook——Worksheet——Range
三、单元格表示方式
(一)、Range表示方式
1、Range对象表示方式
Range("A1") |
'表示单个单元格 |
|
Range("A1,D1") |
'表示多个单元格并集 |
|
Range("A1:D1") 或 Range("A1","D1") |
'单个区域 |
|
Range("A1:B7,B3:D12") |
'多个区域并集A1:B7,B3:D12 |
|
Range("A1:B7 B3:D12") |
'多个区域交集B3:B7 |
|
Range("A1:B7","B3:D12") |
'多个区域合并A1:D12 |
|
Range("1:3") 或 Range("A:D") |
'某行或某列 |
|
Range("SalesDate") |
'返回定义名称为SalesDate的区域 |
2、Worksheet.Range属性表示方式(语法 Worksheet.Range(Cell1, Cell2))
参数Cell1必选, Cell2 可选。Cell1和Cell2代表单元格或区域,既可以用Range引用,也可用Cells引用,以及方括号引用,还可以引用定义名称的字符串、单元格地址的字符串,甚至是表达式。如果代码中忽略工作表对象,则默认指当前工作表
Range(Range("A1"), Range("D2")) |
'表示引用A1:D2区域 |
|
Range(cells(1,1),cells(2,4)) |
'表示引用A1:D2区域 |
|
Range([a2], [c10]) |
'表示引用A2:C10 |
|
Range("Sales","Date") |
'表示Sales与Date为名称的区域 |
当参数并非单个单元格,而是区域时,取两个区域所跨越的最大范围。
Range(Range("A1:A3"), Range("D2")) '表示引用A1:D3区域 |
最左上角的单元格做为新的区域的参照起点,再取两个区域所跨越的最大行做为新的区域的行数,取两个区域跨越的最大列做为新区域的列数
Range(Range("B2:A3"), Range("A3:D10") '表示引用A2:D10区域 |
"B2:A3"和"A3:D10",第一对字符B和A中取出最小值A,然后第二对字符2和3中取出最小值2,,再从第三对字符A与D中取出最大值D,最后从3和10中取最大值10,将这四个字符与冒号串连起来即为"A2:D10"。
3、Range.Range属性表示方式
返回Range对象的相对引用,在使用相对引用宏代码中常看到。以其父对象Range左上角单元格做为参照系,按后面Range属性指定的位置,进行相对的偏移。例如:
Range("D2").Range("B3") '引用E4单元格 |
(二)、中括号快捷表示方式
[A1] '单个单元格表式 |
[A1,D1] '多个单元格并集A1,D1 |
[A1:D1] '单个区域 |
[A1:D1,A3:D3,C1:C8] '多个区域并集 |
[A1:B7 B3:D12] '多个区域交集 |
[1:3] 或 [A:D] '某行或某列 |
[SalesDate] '返回定义名称为SalesDate的区域 |
-
注:用中括号方式表示在书写时不要加双引号("")
-
注:中括号方式只能引用当前活动工作表中的单元区域
(三)、Cells属性表示方式
1、Worksheet.Cells(RowIndex, ColumnIndex)属性
使用行号和列号或列标作为索引参数,引用某工作表中指定的单元格。如果代码中忽略工作表对象,则默认指当前工作表;如果忽略行号与列号,则默认引用所有单元格。
Cells '表示当前活动工作表中所有单元格 |
Cells(2,3) 或 Cells(2,"C") '表示单个单元格 |
2、Range.Cells(RowIndex,ColumnIndex)
在Cells关键字后面紧接着指定行和列索引,以其父对象Range左上角单元格做参照,按指定行数和列数移动位置。
例如:Range("B2:C4").Cells(2,2)表示C3单元格。
3、Range.Cells(Index)
在Range区域中,按从左到右、先行后列的顺序编号,Cells属性可以表示Range区域中某个索引号对应的单元格。
例如:Range("B2:C4").Cells(3)表示C3单元格。
-
注:Cells的参数还可以使用小数,VBA会将其进行四舍五入
(四)、三种表示方式的比较
优点 |
缺点 |
|
Range |
参数中可用变量 |
输入简便性差 |
Cells |
参数中可用变量 适用于循环语句 |
不能表示区域 |
中括号快捷方式 |
输入方便快捷 |
参数中不能使用变量 |
(五)、非当前活动工作表中单元格的表示
若需要表示非当前活动工作表中的单元格或区域,要明确单元格所在的工作表,甚至是工作簿,这时就需要按对象分层次引用单元格:
Worksheets("Sheet1").Range("A1") '当前活动工作簿中非活动工作表单元格 |
Workbooks("book1.xls").Worksheets("Sheet1").Cells(1,1) '非当前活动工作簿中的单元格 |
注:请看下面的例子:
MsgBox WorksheetFunction.Sum (Worksheets("Sheet2").Range(Range("A1"),Range("A10"))) |
MsgBox WorksheetFunction.Sum _ |
(Worksheets("Sheet2").Range(Worksheets("Sheet2").Range("A1"), _ |
Worksheets("Sheet2").Range("A10"))) |
运行中会出现1004错误,应用程序定义或对象定义错误。出现这种错误就是因为语句中没有指明单元格所在的工作表或工作簿。将其改成
四、常用属性和方法
对于单元格的三种引用方式,还有一些属性和方法,较常用的属性与方法有:
(一)Value属性和Text属性
1、Value属性
返回或设置指定单元格的值,Variant型。如果该单元格为空,Value属性返回Empty(可用 IsEmpty 函数检测这种情况)。如果Range对象包含一个以上的单元格,本属性将返回数值数组(可用IsArray函数检测这种情况)。Value是默认属性,所以如果不明确指出属性时,那么一定是调用它的Value属性值。例如:MsgBox Range("A1") 等于MsgBox Range("A1").value。
2、Text属性
返回或设置指定对象中的文本,String类型。
3、区别
Value属性与Tex属性看起来都是返回单元格中的数据,但其实是有区别的,请看下面这个示例:
Set c = Worksheets("Sheet1").Range("B14") c.Value = 1198.3 c.NumberFormat = "$#,##0_);($#,##0)" Debug.Print c.Value Debug.Print c.Text |
运行后将在立即窗中看到结果是:
1198.3 |
¥1.198 |
由此我们可知,Value是单元格中实际的值,而Text返回的是肉眼看到的值。
(二)Offset属性和Resize属性
1、Office属性
从指定的单元格区域开始,按要求的行数与列数进行偏移,返回Range对象。如果忽略参数,其默认值为0,即引用原有的区域。
Range("C1").Offset(3,-2) '从A1单元格向下偏移3行向左偏移2行即A4 |
Range("C3:D6").Offset(-2,) 'C3:D6区域整体向上偏移2行即C1:D4 |
注:Offset的参数支持小数,VBA会自动将其四舍五入后再参数与运算。还可以使用表达式做参数
2、Resize属性
重置给定区域的大小。返回Range对象,该对象代表调整后的区域。对给定单元格或区域中左上角单元格(起点单元格)按指定的行数和列数扩展或缩小该单元格或区域。
Range("B1:C2").Resize(4, 4)'表示B1:E4 |
Range("B1:C2").Resize(1)'表示B1:C1 |
Range("A:A").Resize(1, 256) '表示第一行,将原有的整列转置为整行 |
注:
其参数代表重置后的行数和列数,如果省略参数则表示该行或该列不变
参数不可使用负数和0,但支持小数,VBA会自动将其四舍五入后再参数与运算。还可以使用表达式做参数
(三)End属性和Address属性
1、End属性
返回区域尾端的单元格,常用于定位最后一行或最后一列
Range("A65536").End(xlUp).Row '定位最后一行或最后一个非空单元格 |
Cells(1,256).End(xlToLeft).Column '定位最后一列或最后一个非空单元格 |
END属性的参数表如下:
名称 |
代替数字 |
值 |
说明 |
xlDown |
3 |
-4121 |
向下。 |
xlToLeft |
1 |
-4159 |
向左。 |
xlToRight |
2 |
-4161 |
向右。 |
xlUp |
4 |
-4162 |
向上。 |
2、Address属性
返回一个String值,返回其父级对象的引用地址。
Range("Q2").Address '返回Q2的绝对地址$Q$2 |
Range("W1").Address(0,0) '返回W1的相对地址W1 |
(四)Select方法和Activate方法
1、两个方法区别
Select方法是选择,而Activate则是激活单元格或区域。
2、Selection和ActiveCell的区别
Selection可以引用选择区域所有单元格,通常简称为选区。而ActiveCell则表示活动单元格。选区可以是一个单元格,也可以包含多个单元格,甚至多个区域;活动单元格仅仅一个。活动单元格一定包含于选区中。一般来说,ActiveCell一定是那个鼠标第一次点击的那个单元格。
注:Activecell和Selectiion只能用于当前工作表,如果加前置对象来指定其它工作表或者工作簿,不论是否在该工作表或工作簿中,将产生运行错误。
(五)Clear等常用方法
Clear '清除单元格的内容和格式
ClearContents '只清除单元格的内容
ClearFormats '只清除单元格的格式
五、补充知识:其他常用属性与方法
(一)、Item属性
1、Range.Item(RowIndex, ColumnIndex)
该表达式按参数中的行号与列标(列标可以是数字或字符串)的返回其父对象中指定的单元格。 例如:
Range("D3:F7").Item(1, 3) 表示D3:F7区域第一行第三列,即F3 |
因为Item属性是默认属性,因此可以简写为:
Range("D3:F7")(1, 3) '表示D3:F7区域第一行第三列,即F3 |
Range("D3:F7")(9, 4) 'D3向下偏移九个单位,即G11 |
2、Range.Item(Index)
当需要返回区域的Value时,用Range("A1:B4").Value会出现错误,因为区域的值是一个数组,包括多个对象,VBA中无法直接将其显示在屏幕上。正确的方式是逐个引用区域中单个值,除了使用Cells属性外,还可以通过Item(索引号)属性做参数来实现。同样可以简化Item,例如: Range("D2:Z10")(24) '代表D2:Z10区域中第24个单元格,即D3
也就是说,索引号代表区域中从左到右、从上到下的序号,它是区域左上角单元格的参照进行相对引用。
注:参数可以使用小数,VBA会将其进行四舍五入进行转换成整数
(二)、Application.Union(Arg1, Arg2, ……, Arg30) 方法
使用Union方法可将多个区域组合到一个Range对象中,即获取单元格区域的合集。在工作中,需要用到合集的地方较多,特别在查找目标单元格或者多个区域中循环时。
例如:Application.Union([A2:B2], [D3:G4])
看到这里很多人会觉得直接使用Range引用多区域的方法不是更快捷吗?例如以上区域可以表示为: Range("A2:B2,D3:G4")
但请注意,Range参数的字符限制使它在多区域应用方面无法取代Union,当程序长度超过256个字符时必将产生编译错误。而Union方法则可以突破这个屏障。 Union求多区域的合集时没有Range表示多区域时的字符限制。
六、小结
本节课讲解VBA中单元格的引用方式。主要有Range、Cells和方括号三种方式,Range方式分为Range对象方式、Worksheet.Range属性方式以及Range.Range属性方式;Cells属性方式分为Worksheet.Cells属性和Range.Cells属性方式;还有输入便捷的方括号方式。注意区分这几种方式的不同点与共同点。
单元格的表示方式还有合集(Union方法)、偏移量(Offset属性)、扩大缩小(Resize属性) 、End等其它方式。