Range对象应用大全
VBA代码中引用或选择Excel工作表的单元格或单元格区域
在使用Excel VBA编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、或者包含连续或非连续的多个单元格组成的区域、或者是整行、整列、甚至是三维单元格区域等。
[应用1]引用当前工作表中的单个单元格(例如引用单元格C3)
可以使用下面列举的任一方式引用当前工作表中的单元格(C3): (1)Range(“C3″) (2)[C3]
(3)Cells(3, 3)
(4)Cells(3, “C”)
(5)Range(“C4″).Offset(-1) Range(“D3″).Offset(, -1)
Range(“A1″).Offset(2, 2)
(6)若C3为当前单元格,则可使用:ActiveCell
(7)若将C3单元格命名为“Range1”,则可使用:Range(“Range1″)或[Range1] (8)Cells(4, 3).Offset(-1) (9)Range(“A1″).Range(“C3″)
此外,可以使用下面的代码选择当前工作表中的单元格D5: ActiveSheet.Cells(5, 4).Select 或:ActiveSheet.Range(“D5″).Select
[应用2]引用当前工作表中的B2:D6单元格区域
可以使用下面列举的任一方式引用当前工作表中的单元格区域B2:D6: (1)Range(“B2:D6”)
(2)Range(“B2″, “D6″) (3)[B2:D6]
(4)Range(Range(“B2″), Range(“D6″))
(5)Range(Cells(2, 2), Cells(6, 4))
(6)若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域: ① Range(“MyRange”) ② [MyRange]
(7)Range(“B2″).Resize(5, 3) (8)Range(“A1:C5″).Offset(1, 1)
(9)若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))
(10)若单元格D6为当前单元格,则可使用语句:Range(“B2″, ActiveCell) 下面的过程将单元格区域 A1:D5 的字体设置为加粗。
Sub FormatRange()
Workbooks(\).Sheets(\).Range(\) _ .Font.Bold = True End Sub
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 列。 下面是给单元格赋值的几个例子。 示例1:
Sub test1()
Worksheets(\).Range(\).Value = 22 MsgBox \工作表Sheet1内单元格A5中的值为\ _ & Worksheets(\).Range(\).Value End Sub
示例2:
Sub test2()
Worksheets(\).Range(\).Value = _ Worksheets(\).Range(\).Value MsgBox \现在A1单元格中的值也为\ & _
Worksheets(\).Range(\).Value End Sub
示例3:
Sub test3()
MsgBox \用公式填充单元格,本例为随机数公式\ Range(\).Formula = \ End Sub
示例4:
Sub test4()
Worksheets(1).Cells(1, 1).Value = 24 MsgBox \现在单元格A1的值为24\ End Sub
示例5:
Sub test5()
MsgBox \给单元格设置公式,求B2至B5单元格区域之和\ ActiveSheet.Cells(2, 1).Formula = \ End Sub
示例6:
Sub test6()
MsgBox \设置单元格C5中的公式.\
Worksheets(1).Range(\).Cells(1, 1).Formula = \ End Sub
示例7:
Sub test7()
MsgBox \给命名区域赋值.\
ActiveSheet.Range(\).Value = 1 End Sub
其中,MyCell为单元格区域的名称。
[应用3]引用当前工作表中不确定的单元格区域
有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:
(1)Range(“A” & i)
(2)Range(“A” & i & “:C” & i) (3)Cells(i,1) (4)Cells(i,j)
其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。 在下例中,Cells(6,1)返回Sheet1上的单元格A6,然后将Value属性设置为 10。
Sub EnterValue()
Worksheets(\).Cells(6, 1).Value = 10 End Sub
因为可以用变量替代编号,所以Cells属性非常适合于在单元格区域中循环,如下例中所示。
Sub CycleThrough()
Dim Counter As Integer For Counter = 1 To 20
Worksheets(\).Cells(Counter, 3).Value = Counter Next Counter End Sub
如果要同时更改某个区域中所有单元格的属性(或将方法应用于该区域中的所有单元格),建议使用Range属性。
[应用4]扩展引用当前工作表中的单元格区域
可以使用Resize属性,例如:
(1)ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。 (2)Range(“B2″).Resize(2, 2),表示创建B2:C3单元格区域。 (3)Range(“B2″).Resize(2),表示创建B2:B3单元格区域。 (4)Range(“B2″).Resize(, 2),表示创建B2:C2单元格区域。
如果是在一个单元格区域(如B3:E6),或者一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如: 代码Range(“C3:E6″).Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可
以不在原单元格区域内。
因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。 再举一些例子。
例1:要选择当前工作表中名为“Database”区域,然后将该区域向下扩展5行,可以使用下面的代码:
Range(\).Select
Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count).Select
例2:选择名为“Database”区域下方4行右侧3列的一个区域,然后扩展2行和1列,可以使用下面的代码:
Range(\).Select
Selection.Offset(4, 3).Resize(Selection.Rows.Count + 2, Selection.Columns.Count + 1).Select
[应用5]在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域
可以使用Offset属性,例如:
(1)Range(“A1″).Offset(2, 2),表示单元格C3。
(2)ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。 (3)ActiveCell.Offset(1),表示当前单元格下一行的单元格。
(4)Range(“C3:D5″).Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。 从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。正值表示向下和向右,负值表示向上和向左,零值则是指当前单元格。
例如,要选择距当前单元格下面5行左侧4列的单元格,可以使用下面的代码:
ActiveCell.Offset(5, -4).Select
要选择距当前单元格上方2行右侧3列的单元格,可以使用下面的代码:
ActiveCell.Offset(-2, 3).Select
注意:一定要保证当前单元格与所选单元格之间的距离在工作表范围内,否则会出错。 又如,要选择距单元格C7下方5行右侧4列的单元格,可以使用下面的代码:
ActiveSheet.Cells(7, 3).Offset(5, 4).Select
或:
ActiveSheet.Range(\).Offset(5, 4).Select
再举一些例子。
例如,要选择与名为“Test”的区域大小相同但在该区域下方4行右侧3列的一个区域,可以使用下面的代码:
ActiveSheet.Range(\).Offset(4, 3).Select
如果该命名区域不在当前工作表中,可以先激活该工作表,然后再选择,如下面的代码:
Sheets(\).Activate
ActiveSheet.Range(\).Offset(4, 3).Select
下面的例子计算移动平均值:
Sub MovingAvg() Dim rng As Range Dim lngRow As Long Set rng = Range(\) For lngRow = 3 To 12
Cells(lngRow, \).Value = WorksheetFunction.Sum(rng) / 3 Set rng = rng.Offset(1, 0) Next lngRow End Sub
上述代码首先将B列中的前3个单元格设置为一个单元格区域,计算其平均值,并放置在单元格C3中。接着,Offset属性将单元格区域下移一行但仍在B列,计算单元格区域B2:B4的平均值,并将结果放置到单元格C4。代码重复上述过程直到单元格B12。
[应用6]在当前工作表中引用交叉区域
可以使用Intersect方法,例如:
Intersect(Range(\), Range(\))
表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。
又如,要选择名为“Test”和“Sample”的两个区域的交叉区域,可以使用下面的代码:
Application.Intersect(Range(\), Range(\)).Select
注意,两个区域必须在同一工作表中。
注意,如果两个区域不存在交叉,那么该方法返回Nothing。
例如,下面的代码选择两个命名区域的交叉部分,如果不存在交叉,则显示一条消息。
Sub IntersectSample()
Worksheets(\).Activate
Set Intersect = Application.Intersect(Range(\), Range(\)) If Intersect Is Nothing Then MsgBox \不存在交叉区域.\ Else
Intersect.Select End If End Sub
[应用7]在当前工作表中引用多个区域
(1)可以使用Union方法,将多个区域组合到一个Range对象中。例如:
Union(Range(\), Range(\))
表示单元格区域C3:D4和E5:F6所组成的区域。
Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。
(2)也可以使用下面的代码,即通过在两个或多个引用之间插入逗号,可使用Range属性引用多个区域:
Range(\)