Range对象:也称单元格对象,是EXCEL中应用最频繁的对象。下面是几种不同的Range对象引用方法
Range(“A1”)引用方式:
引用单元格:Range引用单元格时,代表单元格地址的文本需要采用列标加行村的形式来呈现地址,而且需要使用半角的双引号。例如:
Range(“A1”);Range(“B”&i+5);
引用行与列:Range引用整行或整整齐齐列与工作表函数引用整行或整列时采用的规则一致。例如:
Range(“B:B”):表示引用B列;Range(“B:Z”)表示引用B至Z列;Range(“3:20”):表示引用第3至第20行;
Rows(“2:2”)=Rows(2):均表示引用第2行,前一个必须使用引号。
引用区域:使用Range引用一个区域包含两种方式,一是采用单元格与冒号形成区域,具体样式如下:
Range(”左上角单元格地址:右下角单元格地址”)
Range(“左下角单元格地址:右上角单元格地址”)
Range引用区域的第二种方式是采用两个单元格或区域做参数形成的区域,新的区域是包含两个参数的最小矩形区域,它以参数中所有单元格对象的最小行号和最大行号作为上下边界,以参数中最有单元格对象的最小列号和最大列号作为左右边界。例如:Range(Range(“D3”),Range(“I5”)),效果等同于Range(“D3:I5”)
Range(Range(“C3:C4”),Range(“H2:J2”)),效果等同于Range(“C2:J4”)
引用多区域:使用Range引用多区域时,区域与区域之间采用逗号分开,然后在前后分别使用半角双引号,Range的参数长度不超过256个字符。
Range(“C4:C11,E4:E11”)表示同时引用C4:C11和E4:E11两个区域;
Range(“6:6,C:C”)表示同时引用第6行和第C列,此形式引用允许多区域重叠。
Range(“B3:H5”).Cells(2,2)表示引用B3:H5第2行第2列的值
例如:对B3:H5区域先列后行的方式逐个单元格检查拼写,可用以下代码实现:
Sub 检查拼写()
‘声明两个整形变量,用于纵向循环和横向循环
Dim RowNumber As Integer,ColNumber As Integer
‘从第1行到区域中的最后一行,其中Rows.Count表示总行数
For RowNumber = 1 to Range(b3:h5”).Rows.Count
‘从第1列到区域的最后一列,其中Columns.Count表示总列数
For ColNumber=1 To Range(“B3:H5”).Columns.Count
‘逐个检查区域中的单元格拼写是否正确
‘Cells(RowNumber,ColNumber)表示引用区域中指定坐标的单元格
Range(“B3:H5”).Cells(RowNumber,ColNumber).CheckSpelling
‘执行下一次循环(此处表示判断下一行)
Next ColNumber
‘执行下一次循环(此处表示判断下一列)
Next RowNumber
End Sub
Cells(1,1)引用方式:
Cells表示工作表中所有单元格的集合,而使用行坐标和列坐标可以访问集合中任意一个子对象,其中行坐标必须是数值,列坐标可用数值也可用列标字母。(查询帮助的关键字:Worksheet.Cells)
当指定工作表名称时,Cells能引用指定工作表的单元格,当忽略工作表名称时表示引用活动工作表的单元格。
Cells(1,1):表示引用工作表中第一行第一列的单元格,即A1;
Cells(100,10*5):表示引用第一百行、10*5的单元格,两个参数都可以使用表达式;
Cells(5,”R”):表示引用第5行第R列,即R5单元格。
WorkSheets(“表1”).Cells(500,”BC”):表示引用表1中的BC500单元格
Cells还有一种较特殊的用法:作为另一个Range对象的子对象(查询帮助的关键字:Range.Cells)。当Cells的父对象是区域时,Cells代表区域中的所有单元格,而非工作表中的所有单元格。
[a1]引用方式:
[a1]引用方式和Range(“a1”)引用方式有异曲同工之妙,都能将文本形式的单元格地址转换成引用,不过他们的差异也不少。相同点表现在两者都能将单元格地址转换成引用,且支持多区域。例如:
[a1]形式的引用:[a1:a100]、[b5]、[f:f]、[f:f,g10]、[A:h,2:4]
Range形式的引用:Range(“a1:a100”)、Range(“b5”)、Range(“F:F,G10”)、Range(A:h,2:4”)
以上两种表达方式能产生相同引用,但两者的差异也很明显:
首先,Range的参数需要采用引号,而[a1]则不需要引号,可以直接将文本转换成引用。如果[a1]形式的引用采用了引号,那么它不再是对象,而是字符串,不再具有Range对象的属性。
其次,录入Range(“a1”)形式的对象引用时有快速提示信息,而[a1]形式则没有,所以在编写编码时尽量采用Range[“a1”]形式。
最后,[a1]形式的引用不支持参数,例如:Range(“a1:b10”)(5)表示引用A3单元格,而[a1:b10](5)无法引用成功,将出现“错误的参数号”提示。
活动单元格:ActiveCell
在VBA中采用ActiveCell表示活动单元格。活动单元格ActiveCell和选区Selection有不同的含义。Selection表示当前选择的区域,当选择的区域只有单个单元格时,选区Selection就是活动单元格,否则活动单元格仅是处于选区中的一个单元格而已。
如果要改变活动单元格,可使用Select方法(查询帮助的关键字:Range.Select)或者Activate方法(查询帮助的关键字:Range.Activate)。前者表示选择单元格,当选区变化时,活动单元格也会变化,不过最可靠的还是激活方法Activate。例如要将F5单元格设置为活动单元格,那么可用以下代码:Range(“F5”).Activate。Range.Select和Range.Activate都不能跨表,仅作用于活动工作表。当活动工作表是第一个工作表时,以下代码将执行失败:Worksheets(2).Range(a5”).Activate。应该先激活第二个工作表,然后再激活单元格:Worksheets(2).Select;Range(“a5”).Activate
下一个单元格:Next
Range.Next表示下一个单元格(查询帮助的关键字:Range.Next),准确地说是下一个可以输入数据的单元格。在一般情况下,Range.Next表示指定单元格右边的一个单元格,而获取右边的一个单元格的方法有很多,Next属性在此毫无优势,真正体现其价值的是当工作表中存在保护单元格时,采用Range.Next属性可以快捷的获取下一个可供录入数据的目标单元格。
屏幕坐标下的单元格:RangeFromPoint
RangeFromPoint是窗口对象Windows的一个方法(查询帮助的关键字:Windows.RangeFromPoint)它可以获取位于屏幕上指定坐标位置的Shape或Range对象。如果指定坐标位置上没有任何形状,则此方法将返回Nothing;如果在指定坐标的单元格上方有Shape对象,则此方法返回一个Shape对象;如果指定坐标处只有单元格则返回Range对象。此方法的具体语法如下:Windows.RangeFromPoint(X,Y)。其中参数X表示屏幕的纵坐标,Y表示屏幕的横坐标,单位皆为像素,坐标原点是屏幕左上角。
选区:Selection、RangeSelection
Selection表示当前选中的对象(查询帮助的关键字:Applictaion.Selection),可能是单元格也可能是图形对象,还可能是图表。即当前选中的对象是什么Selection就代表什么。
RangeSelection表示指定窗口中工作表上的选定单元格(查询帮助的关键字:Windows.RangeSelection)换言之Selection代表当前选定的对象,而RangeSelection只代表选定对象中的单元格,如果当前选中的活动对象是图片或图表,那么RangeSelection代表上一次选择的单元格对象。如果当前选择的对象是单元格或区域,那么Selection和RangeSelection将表示相同对象。在实际工作中,如果要引用当前选择的区域,则尽量使用RangeSelection而不是Selection,只有确定选择对象是单元格以外的对象时才用Selection。如果需要确定当前活动的对象是否为单元格,可以使用TypeName函数来判断。TypeName函数的功能是判断其参数的类型,计算结果要区分大小写,所以”Range”的首字母必须大写。当TypeName(Selection)计算的结果为”Range”时,表示当前活动对象是单元格。
已用区域:UsedRange
UsedRange是Worksheet对象的一个属性,也是Worksheet的子对象,它表示工作表的已用区域(查询帮助的关键字:Worksheet.UsedRange)即工作表中包括所有已经使用过的单元格的最小矩形区域,如下图的已使用过的区域是A1:C4
实例:对于列宽未设置好导致部分列的数据未完整地显示出来,而部分列的宽度又太大显得不美观,可以通过以下代码美化下:
Sub 对已用区域添加格式()
With ActiveSheet.UsedRange
.HorizontalAlignment = xlCenter ‘设置格式为左右居中显示
.EntireColumn.AutoFit ‘自动调整列宽
.Borders.LineStyle = xlContinuous ‘添加边框
End With
End Sub
以上代码中说明:HorizontalAlignment表示左右对方方式,(查询帮助的关键字:Range.HorizontalAlignment);EntireColumn表示整列,(查询帮助的关键字:Range.EntireColum);Range.Borders表示单元格的所有边框(查询帮助的关键字:Range.Borders),LineStyle表示线型(查询帮助的关键字:Borders.LineStyle),xlContinuous表示实线。
任何时候UsedRange的父对象都不能省略。
当前区域:CurrentRegion
CurrentRegion表示单元格的当前区域(查询帮助的关键字:Range.CurrentRegion)。当前区域是指以包含当前单元格且以空行与空列的组合为边界的区域。
现要求将下图中B组的所有数据加粗显示,那么可以通过以下代码实现:
sub 加粗B组的数据()
Cells.Find(“B组”).CurrentRegion.Font.Bold=True
end sub
此过程采用了Range对象的Find方法(查询帮助的关键字:Range.Find)查找目标数据,找到后对它的当前区域的字体设置为加粗显示。代码中的Cells表示活动工作表的所有单元格(查询帮助的关键字:Worksheet.Cells)。
如果工作表中所有非空单元格之间没有整行或整列的间隔,那么工作表的UsedRange将等同于该区域中任意单元格的CurrentRegion。
当前数组区域:CurrentArray
CurrentArray是Range对象的一个属性,也是Range的子对象,它表示单元格的当前数组区域(查询帮助的关键字:Range.CurrentArray)。数组区域是数组公式所在的区域,可能是单个单元格,也可能是多个单元格。如果单元格中没有数组公式,那么将引用出错。当单元格处于数组区域中时,不允许修改该区域中的单个单元格,只能同时修改整个数组区域中的值。工作中有可能要求在一个区域逐个修改数值,而区域中存在数组区域时必将写入失败。数组区域不能修改其中某个单元格,只能同时对整个区域修改。
按条件引用区域:SpecialCells
VBA中的Range.SpecialCells方法可以实现随意指定定位条件,从而选择对应的单元格对象(即CTRL+G的功能)。通过Range.SpecialCells方法的参数决定定位对象的类型,其语法如下:
Range.SpecialCells(Type,[ Value])
其中第一参数type表示定位条件,下表中包含了可用于条件的常量名称及含义:
| 常量 | 含义 |
| xlCellTypeAllFormatConditions | 任意格式单元格 |
| xlCellTypeAllValidation | 含有验证条件的单元格 |
| xlCellTypeBlanks | 空单元格 |
| xlCellTypeComments | 含有注释的单元格 |
| xlCellTpyeConstants | 含有常量的单元格 |
| xlCellTypeFormulas | 含有公式的单元格 |
| xlCellTypeLastCell | 已用区域中的最后一个单元格 |
| xlCellTypeSameFormatConditions | 含有相同格式的单元格 |
| xlCellTypeSameValidation | 含有相同验证条件的单元格 |
| xlCellTypeVisible | 所有可见单元格 |
参数的可选项如下表所示:
| 常量 | 值 | 含义 |
| xlErrors | 16 | 错误值 |
| xlLogical | 4 | 逻辑值 |
| xlNumbers | 1 | 数值 |
| xlTextValues | 2 | 文本 |
ActiveSheet.UsedRange.SpecialCells(XLcELLtYPEcONSTANTS,7).Select
Range.SpecialCells方法的优势在于不需要循环,一次性定位所有目标对象,提升代码执行效率。
模拟CTRL+方向键产生的单元格:End
Range对象的End属性可以引用新的单元格对象,该对象代表包含源区域的区域尾端的单元格。(查询帮助的关键字:Range.End)。在VBA中,Range.End属性和工作表中的[END+方向键]组合的功能一致。该属性的语法如下:
Range.End(Direction)
其中参数Direction表示定位的方向有4个可选值(1向左;2向右;3向上;4向下)
Range(“XFD1”)表示第1行最后一个单元格;
Range(“C1048576”):表示C列最后一个单元格,适用于07及以上版本;在2003中为Range(“C65536”)。不过推荐大家使用以下通用的手法:
定位第一行最后一个非空单元格:
Cells(1,Columns.count).End(1)
定位第2列最后一个非空单元格:
Cells(Rows.count,2).end(3)
按偏移量重置区域引用:Offset
Range.Offset是按偏移量引用单元格或区域,与工作表函数OFFSET的功能和用法都大不相同。此处的Offset是Range的属性,但它的引用结果是Range对象(查询帮助的关键字:Range.Offset)
Range.Offset的语法如下:
Range.Offset(行偏移量,列偏移量)
例如相对于A2单元格偏移2行3列的单元格,可使用以下代码表示:
Range(“a2”).Offset(2,3)
例如:相对于A2:B3区域偏移2行3列的区域,可采用以下代码:
Range(“a2:b3”).Offset(2,3)此代码引用的对象是D4:E5,和A2:B3区域的高度和宽度一致。Offset的参数也支持负数和0,当第一个参数使用负数时表示向上偏移,当第2个参数使用负数时表示向左偏移。
Range.Offset引用单元格失败时将弹出提示“应用程序定义或对象定义错误”,Offset通常配合End属性使用,例如合并工作表或合并工作簿时,将所有工作瑶数据复制到汇总表中,要求按先后顺序排列,不能覆盖上一次合并的内容。此时需要定位最后一非空行的下一行然后再粘贴数据,而达成此需求需要将End配合Offset使用。例如,要求将“一月”、“二月”、“三月”三个表的数据合并到“总表”中,可采用如下代码:
Sub 合并3个月的数据到汇总表()
‘复制一月的已用数据区域到总表的A1
Worksheets(“一月”).UsedRange.Copy Worksheets(“总表”).[a1]
‘复制二月的已用数据区域到总表A列最后一个非空单元格的下方
Worksheets(“二月”).UsedRange.Copy Worksheets(“总表”).Cells (Rows.Cont,1).End(xlUp).Offset(1,0)
‘复制三月的已用数据区域到总表A列的最后一个非空单元格的下方
Worksheets(“三月”).UsedRange.Copy Worksheets(“总表”).Cells (Rows.Cont,1).End(xlUp).Offset(1,0)
end sub
需要特别强调的是,Range.Offset的参照点是合并单元格,执行行偏移时将合并单元格中的同一行当做一个整体处理,执行行列偏移时将合并单元格中的同一列当做一个整体来处理
如下图A1:B2区域已合并,那么执行列偏移时,参照点A1和B1没有分别。以下两句代码的结果一致,都是$D$1
Msgbox Range(“A1”).Offset(0,2).Addresss
Msgbox Range(“B1”).Offset(0,2).Address
当执行行偏移时,参照点用A2和B2也没分别,以下两句代码的结果一致,都是$D$2:
Msgbox Range(“A2”).Offset(0,2).Address
Msgbox Range(“B2”).Offset(0,2).Address
按宽度与高度重置区域:Resize
Range的Resize属性表示重新指定区域的高度和宽度,从而产生新的区域引用(查询帮助的关键字:Range.Resize),其语法如下:
Range.Resize(指定新的行数,指定新的列数)
例如将工作表sheet1的所有数据复制到sheet2工作表中,不保留格式,可采用以下代码:
sub 复制已用区域的值()
‘引用第一个工作表的已用数据区域
with Worksheets(1).UsedRange
‘根据第一个工作表的已用区域的宽度和高度定位第二个表对应的区域,然后赋值
Worksheets(2).Range(“a1”).Resize(.Rows.Count,.Colums.Count)=.Value
end with
end sub
由于使用Range.Copy方法时会将格式一起复制过去,而使用选择性粘贴又无法一个步骤完成,所以本例采用等号将工作表中已用区域的值赋予另一个工作表的相同宽度与高度的区域。Range.Copy方法的优势在于只需要指定目标区域的左上角单元格即可,如果本例代码改用Range.Copy方法实现,则可用以下代码:
Worksheets(1).UsedRange.Copy Worksheet(2).Range(“a1”)
引用多区域的合集:Union
Union是Application对象的一个方法,表示将多个单元格对象合并为一个对象,从而使调用对象时更方便(查询帮助的关键字:Application.Union),其语法如下:
Application.Union(Arg1,Arg2,…,Arg30)
Union的参数至少2个,最多30个,超过无法合并成功。Union通常配合变量使用。换言之,Union将多个区域合并到一个Range对象,然后将它赋值给一个对象变量,以后需要引用这些区域时不再需要引用所有对象,而是调用变量即可,例如:
sub 合并区域()
dim Rng As Range ‘声明一个Range类型的对象变量
‘将5个区域合并为一个对象,然后赋值给变量Rng
Set Rng=Union(Range(“A1:B10”),Range(“C1:C10”),Range(“e1:e10”),Range(“g1:g10”),Range(“i1:i10”))
Msgbox Rng.Address ‘获取Rng变量的地址
end sub
引用多区域的交集:Intersect
Intersect是Application对象的一个方法,表示取多个单元格对象的交集,即重叠部分(查询帮助的关键字:Application.Intersect)。其语法如下:
Application.Intersect(Arg1,Arg2,..,Arg30)
案例1:合并工作表
要求将三个工作表的数据合并到总表中,但标题的行数不确定且合并数据后的总表只以显示一次标题行,具体代码如下:
sub 合并3个月的数据到汇总表()
Dim BioTi As Bype ‘声明一个Byte变量,用于存放标题行的数量,标题行一般在10行以内
‘让用户手工指定标题行的数量,InputBox的第3参数1表示默认值是1行,最后一个参数为1表示只允许输入数值
BiaoTi=Application.InputBox(“请输入标题的行数”,”确认标题行”,1,,,,,1)
‘复制一个月的已用数据区域到总表的A1
Worksheets(“一月”).UsedRange.Copy Worksheets(“总表”).[a1]
With Worksheets(“二月”).UsedRange ‘引用二月工作表的已用区域
‘将已用区域向下偏移BiaoTi行,从而产生一个新的区域引用,然后取它与原区域的交集,偏移的行数由变量BiaoTi决定,而变量的值则由用户手工录入,所以此代码较为灵活
‘Intersect对偏移前的两个区域获取交集,交集已经排除了标题行,所以复制总表中时不会有标题
Intersect(.Offset(BiaoTi,0),.Offset(0,0)).Copy Worksheets(“总表”).Cells(Rows.Count,1).End(xlUp).Offset(1,0)
end with
‘复制三月的已用数据区域到总表A列的最后一个非空单元格的下方(忽略标题行)
With Worksheets(“三月”).UsedRange
Intersect(.Offset(BiaoTi,0),.Offset(0,0)).Copy Worksheets(“总表”).Cells(Rows.Count,1).End(xlUp).Offset(1,0)
End With
End Sub
本例代码中的Application.InputBox语法如下:
Application.InputBox(显示在对话框中的文本,对话框的标题,显示在输入框中的默认值,左边距,上边距,帮助文件,帮助文件的ID号,指定返回的数据类型)
只有第一参数是必选参数,其余皆为可选参数,参数中第1、2、3和第8参数较重要,期他参数可忽略。
Application.InputBox的参数列表
| 名称 | 说明 |
| 显示在对话框中的文本 | 要在对话框中显示的消息。可为字符串、数字、日期或布尔值 |
| 对话框的标题 | 输入框的标题。如果省略该参数,默认标题将为“输入” |
| 显示在输入框中的默认值 | 指定一个初始值,该值在对话框最初显示时出现在文本框中。如省略,文本框将为空 |
| 左边距 | 指定对话框相对于屏幕左上角的X坐标,在EXCEL2010中无效 |
| 上边距 | 指定对话框相对于屏幕左上角的Y坐标,在EXCEL2010中无效 |
| 帮助文件 | 此输入框使用的帮助文件名。如果存在此参数,对话框将出现一个帮助按钮,通常忽略此参数 |
| 帮助文件的ID号 | 帮助文件中帮助议题的上下文ID号。通常忽略此参数 |
| 指定返回的数据类型(type) | 指定返回的数据类型。如果省略此参数,对话框将返回文本 |
| 值 | 含义 |
| 0 | 公式 |
| 1 | 数字 |
| 2 | 文本(字符串) |
| 4 | 逻辑值(True或False) |
| 8 | 单元格引用,作为一个Range对象 |
| 16 | 错误值,如#N/A |
| 数值数组 |
用名称引用区域
Excel允许将一个或多个区域定义为名称,然后通过名称调用Range 对像,添加名称使用Names.Add方法,其语法如下(查询帮助的关键字:Names)
表达式. Add(Name,RefersTo,Visible,MacroType,ShortcutKey,Category,NameLocal,RefersToLocal,CategoryLocal,RefersToR1C1,RefersToR1C1Local)
| 名称 | 说明 |
| Name | 如果未指定NameLocal参数,则指定要用做名称的字符串。名称不能包括空格,且不能设置为单元格引用的格式 |
| RefersTo | 如果未指定RefersToLocal、RefersToR1C1和RefersToR1C1Local参数,则说明名称引用的内容(用A1格式表示法以英文表示) |
| Visible | 赋值为True时表示将名称定义为可见,反之表示将名称定义为隐藏 |
| MacroType | 由以下值之一确定的宏类型: 1-用户定义函数(Function过程) 2-宏(Sub过程) 3-或忽略(该名称不引用用户定义函数或宏) |
| ShortcutKey | 指定宏的快捷键。必须是单个字母,仅适用于命令宏 |
| Category | 如果MacroType参数等于1或2,则此参数为宏或函数的分类 |
| NameLocal | 如果未指定Name参数,则指定要用做名称的本地化的文本 |
| RefersToLocal | 如果未指定RefersTo、RefersToR1C1和RefersToR1C1Local参数,则说明名称引用的内容(使用A1格式表示法以英文表示) |
| CategoryLocal | 如果未指定Category参数,则指定标识自定义函数分类的本地化的文本 |
| RefersToR1C1 | 如果未指定RefersTo、RefersToLocal和RefersToR1C1Local参数,则说明名称引用的内容(使用R1C1格式表示法) |
| RefersToR1C1Local | 如果未指定RefersTo、RefersToLocal和RefersToR1C1参数,则说明名称引用的内容(使用R1C1格式表示法) |
ActiiveWookbook.Names.Add “成绩”, “=$B$2:$C$10”,True下载本文