在 VBA 中大量的工作都会涉及到工作表中的单元格和单元格区域。单元格区域指的是工作表中单个单元格或是由多个单元格组成的区域。单元格区域可以是单个单元格、整行、整列或由多个非连续区域组成。在 VBA中 引用单元格区域主要有如下几种方法。
使用 A1 样式引用
A1 样式使用 Range 属性返回单元格区域。在 A1 样式中,按字母顺序标记列,按数字顺序标记行,如 D 列第 4 行单元格的 A1 样式引用为 Range("D4")
。
Worksheet.Range 属性
语法
Range(Cell1, Cell2)
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
Cell1 | 必需 | Variant | 使用一个参数时,则是用作区域引用的 String。一个用作区域引用的 String;使用两个参数时,则为 Range 对象。 |
Cell2 | 可选 | Variant | 一个用作区域引用的 String 或一个 Range 对象。Cell2 定义属性返回的另一区域极限。 |
Cell1 和 Cell2 为 VBA 中的 A1 样式引用。区域引用可包含区域运算符(冒号)、交集运算符(空格)或联合运算符(逗号),但是在实际编程中引用交叉区域和合并区域通常采用更灵活的 Intersect 和 Union 方法。它们还可包含美元符号(即绝对地址,如"$A$1",这些符号将被忽略)。本地定义的名称可为区域引用。如果使用名称,则假定该名称采用宏语言。
Cell1 和 Cell2 可为包含单个单元格、列、行或任何其他单元格区域的 Range 对象。
通常,Cell1 和 Cell2 是返回区域的左上角和右下角的单个单元格。
如果在没有对象限定符的情况下使用,此属性是 ActiveSheet.Range
(返回活动工作表中的范围;如果活动工作表不是工作表,则此属性无效)的快捷方式。
当应用于 Range 对象时,该属性与 Range 对象相关。例如,如果所选内容为单元格 C3,Selection.Range("B1")
则返回单元格 D3,因为它相对于 Selection 属性返回的 Range 对象。另一方面,代码 ActiveSheet.Range("B1")
则始终返回单元格 B1。
示例:使用 A1 样式引用
下表列出了使用 Range 属性的一些 A1 样式引用:
引用 | 说明 |
---|---|
Range("A1") |
单元格 A1 |
Range("A1:B5") |
从单元格 A1 到单元格 B5 的区域 |
Range("C5:D9,G9:H16") |
多块选定区域 |
Range("A:A") |
第 A 列 |
Range("1:1") |
第一行 |
Range("A:C") |
从 A 列到 C 列的区域 |
Range("1:5") |
从第一行到第五行的区域 |
Range("1:1,3:3,8:8") |
第 1、3 和 8 行 |
Range("A:A,C:C,F:F") |
A 、C 和 F 列 |
Range("A3:F8 B1:D7") |
单元格区域 A3:F8 和 B1:D7 的交叉区域 B3:D7 |
Range("A1:LastCell") |
单元格 A1 到定义的名称(LastCell)的区域 |
Range("C3").Range("B1").Select |
选择 D4 单元格 |
ActiveSheet.Range("B1") |
始终返回单元格 B1 |
使用行列编号
在 VBA 中可以使用 Cells 属性通过行列编号来引用单个单元格。此属性返回一个代表单个单元格的 Range 对象。
Range() 更容易阅读,而 Cells() 在循环中更容易使用。
Cells 属性的语法
Cells(RowIndex, ColumnIndex)
两个参数都是可选的,分别表示引用区域中的行序号和列序号。
示例:使用 Cells 属性默认参数
默认参数的 Cells 属性返回引用对象的所有单元格。
以下语句返回活动工作表的所有单元格:
ActiveSheet.Cells
以下语句返回单元格区域 A1:E10 的所有单元格:
Range("A1:E10").Cells
以下语句选择 A 列最后一个非空单元格:
Cells(Rows.Count, 1).End(xlUp).Select
使用 VBA 向工作表写入数据时,经常遇到的是确定需要在哪一行写入,使用以下语句在 A 列最后一个非空单元格后写入数据:
LastBlankCell = Cells(Rows.Count, 1).End(xlUp).Row + 1
示例:仅使用 Cells 属性的行参数
带参数的 Cells 属性返回代表单个单元格的 Range 对象。如果仅指定了参数 RowIndex,此时 RowIndex 表示引用单元格的索引号,其顺序为从左到右,从上到下,例如,Cells(1)
返回单元格区域中的第 1 个单元格(区域左上角的单元格),Cells(2)
返回区域中第2个单元格。
以下示例仅使用 Cells 属性的行参数来说明索引顺序:
Sub CellsIndexDemo()
Dim i As Integer
With Range("A1:D10")
For i = 1 To .Cells.Count
.Cells(i) = i
Next i
End With
End Sub
效果如下:
![Cells(index) 索引顺序](/wp-content/uploads/2023/05/cells-index.png)
示例:仅使用 Cells 属性的列参数
参数 ColumnIndex 指定单元格所在列号的数字或字符串,1 或“A”表示引用区域中的第 1 列,如 Cells(3, 4)
和 Cells(3, "D")
都引用 D3 单元格。
当只指定参数 Columnlndex 时,参数 Rowlndex 的默认值为 1
,返回属性应用对象指定列的第1个单元格。实际应用中不推荐省略行参数的写法。
以下示例返回当前话动工作表 D1 单元格:
ActiveSheet.Cells(, 4)
等效于
ActiveSheet.Cells(1, 4)
以下示例返回单元格区域 A4:D8 中第 3 列第 1 个单元格,即 C4 单元格:
Range("A4:D8").Cells(, 3)
示例:使用 Cells 属性的行列参数
以下示例激活活动工作表的单元格 D7:
ActiveSheet.Cells(7, 4).Activate
示例:带变量的 Cells 属性参数
相比于 Range 属性,Cells 属性参数能方便的使用变量,因此可以方便地应用于单元格区域循环中。
以下示例代码为话动工作表中 A1:A100 单元格区域填入序号:
Sub LoopInCells()
Dim intCounter As Integer
For intCounter = 1 To 100
ActiveSheet.Cells(intCounter, 1).Value = intCounter
Next intCounter
End Sub
使用快捷记号
将 A1 引用样式或命名区域使用方括号([]
)括起来作为 Range 属性的快捷方式。此时无需键入单词“Range”或使用引号,以实现快捷输入。
以下示例代码使用快捷记号为 A1 单元格组值:
[A1] = 100
以下示例代码将单元格区域 A1:D8 为 Range 对象变量 rngRange 赋值:
Set rngRange = [A1:D8]
以下示例为交叉区域赋值:
[A1:D6 C2:F8] = 3
以下示例用命名区域的快捷表示法:
[MyRange].Value = 30
使用快捷记号引用单元格区城时只能使用字符串而不能使用变量。使用快捷记号效率较低,通常应在生产代码中避免使用。
使用 Rows 和 Columns 属性
使用 Rows 属性或 Columns 属性返回对象指定区域的所有行和所有列,通过索引号可以返回其中的一行/列或多行/列。
引用 | 说明 |
---|---|
Rows(1) |
第一行 |
Rows |
所有行 |
Columns(1) |
第一列 |
Columns("A") |
A 列 |
Columns |
所有列 |
Range("B3:F10").Rows("2:4").Select |
选择 B4:F6 |
ActiveSheet.Rows("2:5").Select |
选择活动工作表的第二行到第五行 |
使用 Offset 属性
Range 对象的 Offset 属性代表位于指定单元格区域的一定偏移量位置上的与指定单元格区域大小相同的单元格区域。
Offset 属性语法如下:
Offset(RowOffset, ColumnOffset)
Offset 属性参数如下:
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
RowOffset | 可选 | Variant | 要偏移范围的行数(正、负或 0 (零) )。正值表示向下偏移,负值表示向上偏移。默认值为 0。 |
ColumnOffset | 可选 | Variant | 要偏移范围的列数(正、负或 0 (零) )。正值表示向右偏移,负值表示向左偏移。默认值为 0。 |
以下示例将单元格区域 A1:B3 向下移动3个单元格,向右移动3个单元格,并选择移动后的单元格区域 D4:E6,移动后的区域跟移动前的区域大小一致。运行以下过程查看效果:
Sub OffsetDemo()
Range("A1:B3").Offset(3, 3).Select
End Sub
效果如下:
![使用 Offset 属性](/wp-content/uploads/2023/05/Offset-Property.png)
使用相对引用录制宏时使用的便是 Offset 属性。
使用 Resize 属性
Range对象的 Resize 属性用于调整指定区域的大小,并返回调整后的单元格区域,默认使用该区域左上角单元格作为基准单元格。
Resize属性的语法:
Resize(Rowsize, Columnsize)
参数 RowSize 和参数 ColumnSize 分别代表调整后的单元格区域的行数和列数。
以下示例代码选中 A1 单元格扩展为 4 行 4 列后的区域:
Sub ResizeDemo()
Range("A1").Resize(4, 4).Select
End Sub
效果如下:
![使用 Resize 属性调整区域大小](/wp-content/uploads/2023/05/resize-range.png)
使用 CurrentRegion 属性
Range 对象的 CurrentRegion 属性返回对象所在的当前区域,当前区域是一个边缘为任意空行和空列,或者工作表边缘组合成的最小矩形范围。
以下示例选定工作表中的数据区域,而不包含标题行:
Sub SelectData()
Dim rngRange As Range
'使用CurrentRegion属性取得包含A1单元格的当前区域
Set rngRange = Range("A1").CurrentRegion
With rngRange
'先使用Offset属性获取新区域,再使用Resize属性调整单元格区域大小
.Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Select
End With
'释放对象变量
Set rngRange = Nothing
End Sub
运行效果如下:
![使用 CurrentRegion 属性选择数据](/wp-content/uploads/2023/05/Select-CurrentRegion-Example.png)
使用 Areas 属性
对于单一选择区域,Areas 属性返回 Range 对象本身。对于多重选择区域,Areas 属性返回一个集合,该集合包含与每个选定区域相对应的对象,通过遍历集合中可获得各个区域对应的 Range 对象,每个Areas 对应一个连续的单元格区域。
以下示例将计数选定区域,如果选定了多个区域,将显示一条警告消息:
Sub FindMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "不能对多区域选择执行此操作。"
End If
End Sub
以下示例代码逐一显示每个区域地址并选中该区域:
Sub AreasDemo()
Dim rngRange As Range
Dim i As Integer
Set rngRange = Range("A1,B1:D5,E3:F10")
For i = 1 To rngRange.Areas.Count
MsgBox "将选择第" & i & "个Areas区域: " & rngRange.Areas(i).Address
rngRange.Areas(i).Select
Next i
Set rngRange = Nothing
End Sub
使用 UsedRange 属性
使用 Worksheet 对象的 UsedRange 属性来指定工作表上使用的最大的区域(即左上角最小的行和列到右下角最大的行和列组成的区域)。
以下示例选定活动工作表中的已用区域:
ActiveSheet.UsedRange.Select