......续接 VBA之Range对象应用大全(1),我来为大家科普一下关于vba中range属性详解?下面希望有你要的答案,我们一起来看看吧!
vba中range属性详解
......续接 VBA之Range对象应用大全(1)
[应用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("Database").Select
Selection.Resize(Selection.Rows.Count 5, Selection.Columns.Count).Select
例2:选择名为“Database”区域下方4行右侧3列的一个区域,然后扩展2行和1列,可以使用下面的代码:
Range("Database").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("C7").Offset(5, 4).Select
再举一些例子。
例如,要选择与名为“Test”的区域大小相同但在该区域下方4行右侧3列的一个区域,可以使用下面的代码:
ActiveSheet.Range("Test").Offset(4, 3).Select
如果该命名区域不在当前工作表中,可以先激活该工作表,然后再选择,如下面的代码:
Sheets("Sheet3").Activate
ActiveSheet.Range("Test").Offset(4, 3).Select
下面的例子计算移动平均值:
Sub MovingAvg()
Dim rng As Range
Dim lngRow As Long
Set rng = Range("B1:B3")
For lngRow = 3 To 12
Cells(lngRow, "C").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("C3:E6"), Range("D5:F8"))
表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。
又如,要选择名为“Test”和“Sample”的两个区域的交叉区域,可以使用下面的代码:
Application.Intersect(Range("Test"), Range("Sample")).Select
注意,两个区域必须在同一工作表中。
注意,如果两个区域不存在交叉,那么该方法返回Nothing。
例如,下面的代码选择两个命名区域的交叉部分,如果不存在交叉,则显示一条消息。
Sub IntersectSample()
Worksheets("Sheet1").Activate
Set Intersect = Application.Intersect(Range("rng1"), Range("rng2"))
If Intersect Is Nothing Then
MsgBox "不存在交叉区域."
Else
Intersect.Select
End If
End Sub
[应用7]在当前工作表中引用多个区域
(1)可以使用Union方法,将多个区域组合到一个Range对象中。例如:
Union(Range("C3:D4"), Range("E5:F6"))
表示单元格区域C3:D4和E5:F6所组成的区域。
Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。
(2)也可以使用下面的代码,即通过在两个或多个引用之间插入逗号,可使用Range属性引用多个区域:
Range("C3:D4, E5:F6")
或
[C3:D4, E5:F6]
注意:Range(“C3:D4″, “F5:G6″),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。
同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别:
①Range(“C3:D4″, “F8:G10″).Rows.Count,返回的值为8;
②Range(“C3:D4,F8:G10″).Rows.Count,返回的值为2,即只计算第一个单元格区域。
(3)可用Areas属性引用选定的单元格区域或多块选定区域中的区域集合。
例1:以下示例清除了 Sheet1 上三个区域的内容。
Sub ClearRanges()
Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18").ClearContents
End Sub
命名区域使得用Range属性处理多个区域更加容易。以下示例可在所有这三个命名区域处于同一工作表时运行。
Sub ClearNamed()
Range("MyRange, YourRange, HisRange").ClearContents
End Sub
例2:为了同时选择名为“Test”和“Sample”的两个区域,可以使用下面的代码:
Application.Union(Range("Test"), Range("Sample")).Select
注意,这两个区域须在同一工作表中,如下面的代码:
Set y = Application.Union(Range("Sheet1!A1:B2"), Range("Sheet1!C3:D4"))
但Union方法不能处理不同工作表中的区域,可下面的代码:
Set y = Application.Union(Range("Sheet1!A1:B2"), Range("Sheet2!C3:D4"))
将会出错。
例3:以下示例创建了名为 myMultipleRange 的 Range 对象,并将其定义为区域 A1:B2 和 C3:D4 的组合,然后将该组合区域的字体设置为加粗。
Sub MultipleRange()
Dim r1, r2, myMultipleRange As Range
Set r1 = Sheets("Sheet1").Range("A1:B2")
Set r2 = Sheets("Sheet1").Range("C3:D4")
Set myMultipleRange = Union(r1, r2)
myMultipleRange.Font.Bold = True
End Sub
例4:下述过程计算选定区域中的块数目,如果有多个块,就显示一则警告消息。
Sub FindMultiple()
If Selection.Areas.Count > 1 Then
MsgBox "不能对多个选区进行操作."
End If
End Sub
,