分享

Range对象应用大全(1)-应用基础

 JT_man 2014-08-12
1 颗星2 颗星3 颗星4 颗星5 颗星 (6 人投票, 平均: 4.83 out of 5)

引子:本文以MSDN中《Developers Guide to the Excel 2007 Range Object》一文为线索,整理并归纳了自已以前学习Range对象时的一系列学习笔记。辑录于此,供有兴趣的朋友参考。
毫无疑问,Range对象是Excel对象模型中最重要的对象,几乎所有与工作表有关的实质性操作都涉及到Range对象,可以说,熟悉并熟练运用Range对象是掌握Excel VBA编程的关键。下面,让我们逐步了解、熟悉并开始使用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("Book1").Sheets("Sheet1").Range("A1:D5") _
        .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("Sheet1").Range("A5").Value = 22
    MsgBox "工作表Sheet1内单元格A5中的值为" _
       & Worksheets("Sheet1").Range("A5").Value
End Sub

示例2:

Sub test2()
    Worksheets("Sheet1").Range("A1").Value = _
    Worksheets("Sheet1").Range("A5").Value
    MsgBox "现在A1单元格中的值也为" & _
        Worksheets("Sheet1").Range("A5").Value
End Sub

示例3:

Sub test3()
    MsgBox "用公式填充单元格,本例为随机数公式"
    Range("A1:H8").Formula = "=Rand()"
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 = "=Sum(B1:B5)"
End Sub

示例6:

Sub test6()
    MsgBox "设置单元格C5中的公式."
    Worksheets(1).Range("C5:C10").Cells(1, 1).Formula = "=Rand()"
End Sub

示例7:

Sub test7()
    MsgBox "给命名区域赋值."
    ActiveSheet.Range("MyCell").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("Sheet1").Cells(6, 1).Value = 10
End Sub

因为可以用变量替代编号,所以Cells属性非常适合于在单元格区域中循环,如下例中所示。

Sub CycleThrough()
    Dim Counter As Integer
    For Counter = 1 To 20
        Worksheets("Sheet1").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("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相重迭的区域。
(收录后注:也可用Range("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

[应用8]引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)
可以使用CurrentRegion属性,例如:
(1)ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。
(2)Range(“D5″).CurrentRegion,表示单元格D5所在的当前区域。
当前区域是指周围由空行或空列所围成的区域。
下面的示例将当前工作表当前区域的值复制到剪贴板,然后将这些值插入到新工作表:Copy、Paste

Sub CopyCurrentRegionValue()
    Range("D5").Activate
    ActiveCell.CurrentRegion.Select
    Selection.Copy
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = "Sample"
    Sheets("Sample").Select
    Range("D5").Activate
    ActiveSheet.Paste
End Sub

[应用9]引用当前工作表中已使用的区域
可以使用UsedRange属性,例如:
(1)Activesheet.UsedRange,表示当前工作表中已使用的区域。
(2)Worksheets(“sheet1″).UsedRange,表示工作表sheet1中已使用的区域。
与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。

'选取当前工作表中已使用的单元格区域
Sub SelectUsedRange()
    MsgBox "选取当前工作表中已使用的单元格区域" _
       & vbCrLf & "并显示其地址"
    ActiveSheet.UsedRange.Select
    MsgBox ActiveSheet.UsedRange.Address
End Sub

[应用10]在单元格区域内指定特定的单元格
可以使用Item属性,例如:
(1)Range(“A1:B10″).Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range(“A1:B10″)(5,3)。
如果将A1:B10区域命名为”MyRange”,那么Range(“MyRange”)(5,3)也指定单元格C5。
(2)Range(“A1:B10″)(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。
同时,也不需要索引数值是正值
,例如:
① Range(“D4:F6″)(0,0)代表单元格C3;
② Range(“D4:F6″)(-1,-2)代表单元格A2。
而Range(“D4:F6″)(1,1)代表单元格D4。
(3)也可以在单元格区域中循环,例如:
Range(“D4:F6″)(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。
(4)也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单元格开始,按上述规则依次为第2个单元格、第3个单元格….等等),例如:
Range(“A1:B2″)(1) 代表单元格A1;
Range(“A1:B2″)(2) 代表单元格B1;
Range(“A1:B2″)(3) 代表单元格A2;
Range(“A1:B2″)(4) 代表单元格B2。
这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:
Range(“A1:B2″)(5)代表单元格A3;
Range(“A1:B2″)(14)代表单元格B7,等等。
也可以使用单个的负数索引值。
这种使用单个索引值的方法对遍历列是有用的,例如,Range(“D4″)(1)代表单元格D4,Range(“D4″)(2)代表单元格D5,Range (“D4″)(11)代表单元格D14,等等。
同理,稍作调整后也可遍历行,例如:
Range(“D4″).Columns(2)代表单元格E4,Range(“D4″).Columns(5)指定单元格H4,等等。
(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如:

Set rng = Worksheets(1).[A1]

定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。
[应用11]引用当前工作表中的整行或整列
见下面的示例代码:
(1)Range(“C:C”).Select,表示选择C列。
Range(“C:E”).Select,表示选择C列至E列。
(2)Range(“1:1″).Select,表示选择第一行。
Range(“1:3″).Select,表示选择第1行至第3行。
(3)Range(“C:C”).EntireColumn,表示C列;
Range(“D1″).EntireColumn,表示D列。
同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行调整。
此外,可用Rows属性或Columns属性来处理整行或整列。这两个属性返回代表单元格区域的Range对象。在下例中,Rows(1)返回Sheet1上的第一行,然后将区域字体加粗。

Sub RowBold()
    Worksheets("Sheet1").Rows(1).Font.Bold = True
End Sub

另,Rows(1)代表当前工作表中的第一行,Rows代表当前工作表中的所有的行,Columns(1)代表当前工作表中的第一列,Columns(“A”)代表当前工作表中的第一列,Columns代表当前工作表中所有的列。
若要同时处理若干行或列,可创建一个对象变量并使用Union方法,将对Rows属性或Columns属性的多个调用组合起来。下例将活动工作簿中第一张工作表上的第一行、第三行和第五行的字体设置为加粗。

Sub SeveralRows()
    Worksheets("Sheet1").Activate
    Dim myUnion As Range
    Set myUnion = Union(Rows(1), Rows(3), Rows(5))
    myUnion.Font.Bold = True
End Sub

[应用12]引用当前工作表中的所有单元格
可以使用下面的代码:
(1)Cells,表示当前工作表中的所有单元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells. Columns.Count)),其中Cells.Rows表示工作表所有行,Cells. Columns表示工作表所有列。
下面的过程清除活动工作簿中Sheet1上所有单元格的内容。

Sub ClearSheet()
    Worksheets("Sheet1").Cells.ClearContents
End Sub

[应用13]引用工作表中的特定单元格区域
在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:
(1)Worksheets(“sheet1″).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。
(3)选择所有公式单元格

Sub SelectSpecialCells()
    MsgBox "选择当前工作表中所有公式单元格"
    ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Select
End Sub

当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。
[应用14]引用命名区域
使用名称比使用A1样式记号更容易标识单元格区域。若要命名选定的单元格区域,请单击编辑栏左端的名称框,键入名称,再按回车键。
例1:要选择当前工作表中名为“Test”的区域,可以使用下面的代码:

Range("Test").Select

或:

Application.Goto "Test"

例2:选择同一工作簿中另一工作表上名为“Test”的区域,可使用下面的代码:

Application.Goto Sheets("Sheet1").Range("Test")

也可以先激活工作表,再选择:

Sheets("Sheet1").Activate
Range("Test").Select

例3:要选择不同工作簿中工作表上名为“Test”的区域,可使用下面的代码:

Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet2").Range("Test")

也可以先激活工作表,再选择:

Workbooks("BOOK2.XLS").Sheets("Sheet2").Activate
Range("Test").Select

例4:以下示例引用名为“MyBook.xls”的工作簿中名为“MyRange”的区域,并将该区域的字体设置为斜体:

Sub FormatRange()
    Range("MyBook.xls!MyRange").Font.Italic = True
End Sub

例5:以下示例引用名为“Report.xls”的工作簿中特定工作表的区域“Sheet1!Sales”,并添加边框线:

Sub FormatSales()
    Range("[Report.xls]Sheet1!Sales").BorderAround Weight:=xlThin
End Sub

例6:要选定命名区域,可以使用GoTo方法。该方法将激活工作簿和工作表,然后选定该区域。

Sub ClearRange()
    Application.Goto Reference:="MyBook.xls!MyRange"
    Selection.ClearContents
End Sub

以下示例显示对于活动工作簿将如何编写与上例相同的过程。

Sub ClearRange()
    Application.Goto Reference:="MyRange"
    Selection.ClearContents
End Sub

例7:下例用For Each…Next循环语句在命名区域中的每一个单元格上循环。如果该区域中的任一单元格的值超过limit的值,就将该单元格的颜色更改为黄色。

Sub ApplyColor()
    Const Limit As Integer = 25
    For Each c In Range("MyRange")
        If c.Value > Limit Then
            c.Interior.ColorIndex = 27
        End If
    Next c
End Sub

[应用15]选择特别指定的单元格或单元格区域
下面的示例使用了如下图1所示的工作表。

图1:示例数据
例1:选择连续数据列中的最后一个单元格
要选择一个列A中最后一个单元格,可以使用下面的代码:

ActiveSheet.Range("A1").End(xlDown).Select

在图1所示的工作表中运行上述代码,将选择单元格A4。

'选取最下方的单元格
Sub SelectEndCell()
    MsgBox "选取当前单元格区域内最下方的单元格"
    ActiveCell.End(xlDown).Select
End Sub

可以改变参数xlDown以选取最左边、最右边、最上方的单元格。
例2:选择连续数据列底部的空单元格
要选择连续单元格区域下面的空单元格,可以使用下面的代码:

ActiveSheet.Range("A1").End(xlDown).Offset(1, 0).Select

在图1所示的工作表中运行上述代码,将选择单元格A5。
例3:选择某列中连续数据单元格区域
要选择列A中连续数据单元格区域,可以使用下面的代码:

ActiveSheet.Range("A1", ActiveSheet.Range("A1").End(xlDown)).Select

或:

ActiveSheet.Range("A1:" & ActiveSheet.Range("A1").End(xlDown).Address).Select

在图1所示的工作表中运行上述代码,将选择单元格区域A1:A4。
例4:选择某列中非连续数据单元格区域
要选择某列中非连续数据单元格区域,可以使用下面的代码:

ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp)).Select

或:

ActiveSheet.Range("A1:" & ActiveSheet.Range("A1").End(xlDown).Address).Select

在图1所示的工作表中运行上述代码,将选择单元格区域A1:A6。
例5:选择一个矩形(规则的)单元格区域
要选择围绕某单元格的一个矩形区域,可以使用CurrentRegion属性。CurrentRegion属性将选择四周被空行和空列围绕的区域,如下面的代码:

ActiveSheet.Range("A1").CurrentRegion.Select

在图1所示的工作表中运行上述代码,将选择单元格区域A1:C4。也可以使用下面的代码:

ActiveSheet.Range("A1", ActiveSheet.Range("A1").End(xlDown).End(xlToRight)).Select

或:

ActiveSheet.Range("A1:" & ActiveSheet.Range("A1").End(xlDown).End(xlToRight).Address).Select

若想选择单元格区域A1:C6,可使用下面的代码:

lastCol = ActiveSheet.Range("A1").End(xlToRight).Column
lastRow = ActiveSheet.Cells(65536, lastCol).End(xlUp).Row
ActiveSheet.Range("A1", ActiveSheet.Cells(lastRow, lastCol)).Select

或:

lastCol = ActiveSheet.Range("A1").End(xlToRight).Column
lastRow = ActiveSheet.Cells(65536, lastCol).End(xlUp).Row
ActiveSheet.Range("A1:" & ActiveSheet.Cells(lastRow, lastCol).Address).Select

[应用16]选择多个不同长度的非连续列
例如,有如下图2所示的工作表:

图2:示例数据
要同时选择A列和C列中的数据,即单元格区域A1:A3和C1:C6,可使用下面的代码:

StartRange = "A1"
EndRange = "C1"
Set a = Range(StartRange, Range(StartRange).End(xlDown))
Set b = Range(EndRange, Range(EndRange).End(xlDown))
Union(a, b).Select

[应用17]设置当前单元格的前一个单元格和后一个单元格的值

Sub SetCellValue()
    MsgBox "将当前单元格中前面的单元格值设为""我前面的单元格""" & vbCrLf _
      & "后面的单元格值设为""我后面的单元格"""
    ActiveCell.Previous.Value = "我前面的单元格"
    ActiveCell.Next.Value = "我后面的单元格"
End Sub

[应用18]引用其它工作表或其它工作簿中的单元格区域
要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:
(1)Worksheets(“Sheet3″).Range(“C3:D5″),表示引用工作表sheet3中的单元格区域C3:D5。
(2)Workbooks(“MyBook.xls”).Worksheets(“sheet1″).Range(“B2″),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。
此外,要选择同一工作簿中另一工作表上的单元格E6,可以使用下面的代码:

Application.Goto ActiveWorkbook.Sheets("Sheet2").Cells(6, 5)

或:

Application.Goto (ActiveWorkbook.Sheets("Sheet2").Range("E6"))

也可以先激活该工作表,然后再选择:

Sheets("Sheet2").Activate
ActiveSheet.Cells(6, 5).Select

同样,例如要选择另一工作簿中某工作表上的单元格F7,可以使用下面的代码:

Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Cells(7, 6)

或:

Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("F7")

也可以先激活该工作簿中的工作表,然后再选择:

Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
ActiveSheet.Cells(7, 6).Select

又如,要选择同一工作簿中另一工作表上的单元格区域D3:E11,可以使用下面的代码:

Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("D3:E11")

或:

Application.Goto ActiveWorkbook.Sheets("Sheet3").Range("D3", "E11")

也可以先激活该工作表,然后再选择:

Sheets("Sheet3").Activate
ActiveSheet.Range(Cells(3, 4), Cells(11, 5)).Select

要选择另一工作簿中某工作表上的单元格区域E4:F12,可以使用下面的代码:

Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4:F12")

或:

Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4", "F12")

也可以先激活该工作表,然后再选择:

Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
ActiveSheet.Range(Cells(4, 5), Cells(12, 6)).Select

说明:使用Application.Goto方法,如果指定另一工作表(不是当前工作表)中的指定区域,在Range属性中使用两个Cells属性时,则必须包括Sheets对象,如:

Application.Goto Sheets("Sheet1").Range(Sheets("Sheet1").Range(Sheets("Sheet1").Cells(2, 3), Sheets("Sheet1").Cells(4, 5)))

[应用19]处理三维区域
如果要处理若干工作表上相同位置的单元格区域,可用Array函数选定两张或多张工作表。下例设置三维单元格区域的边框格式。

Sub FormatSheets()
    Sheets(Array("Sheet2", "Sheet3", "Sheet5")).Select
    Range("A1:H1").Select
    Selection.Borders(xlBottom).LineStyle = xlDouble
End Sub

下例应用FillAcrossSheets方法,将Sheet2上区域中的格式和所有数据传送到活动工作簿中所有工作表上的相应区域。

Sub FillAll()
    Worksheets("Sheet2").Range("A1:H1") _
        .Borders(xlBottom).LineStyle = xlDouble
    Worksheets.FillAcrossSheets (Worksheets("Sheet2") _
        .Range("A1:H1"))
End Sub

[应用20]使用Range对象变量引用单元格
如果将对象变量设置为Range对象,即可以使用变量名轻松地操作单元格区域。
以下过程将创建对象变量myRange,然后将活动工作簿中Sheet1上的区域A1:D5赋予该变量。随后的语句用该变量名称代替Range对象,以修改该区域的属性。

Sub Random()
    Dim myRange As Range
    Set myRange = Worksheets("Sheet1").Range("A1:D5")
    myRange.Formula = "=RAND()"
    myRange.Font.Bold = True
End Sub

[应用21]其它的引用方式
对于Excel 2007以前的版本来说:
(1)Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。
(2)Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。
Excel 2007中增加了工作表列数和行数,因此上述限制相应改变。
说明:上面的一些代码在选择单元格或单元格区域时,先激活工作表后选择,这只是为了说明的方便。实际上,在操作单元格时,只要引用了相应的单元格或单元格区域,不必先激活工作表。
小结:我们使用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。
上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。
当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。
下面对Range对象的一些常用属性和方法进行简单的小结。
1、Activate与Select
试验下面的过程:

Sub SelectAndActivate()
    Range("B3:E10").Select
    Range("C5").Activate
End Sub

其结果如下图所示:

图3:Select与Activate
即选取单元格区域B3:E10并将单元格C5选中。
Selection指单元格区域B3:E10,而ActiveCell则是单元格C5;ActiveCell代表单个的单元格,而Selection则可以代表单个单元格,也可以代表单元格区域。
2、Range属性
可以使用Application对象的Range属性引用Range对象,如

Application.Range("B2") '代表当前工作表中的单元格B2

若引用当前工作表中的单元格,也可以忽略前面的Application对象。

Range("A1:D10") '代表当前工作表中的单元格区域A1:D10
Range("A1:A10,C1:C10,E1:E10") '代表当前工作表中非连续的三个区域组成的单元格区域

Range属性也接受指向单元格区域对角的两个参数,如:

Range("A1","D10") '代表单元格区域A1:D10

当然,Range属性也接受单元格区域名称,如:

Range("Data") '代表名为Data的数据区域

Range属性的参数可以是对象也可以是字符串,如:

Range("A1",Range("LastCell"))

3、单元格引用的快捷方式
可以在引用区域两侧加上方括号来快速引用单元格区域,如:
[B2]
[A1:D10]
[A1:A10,C1:C10,E1:E10]
[Data]
但其引用的是绝对区域
4、Cells属性
可以使用Cells属性来引用Range对象。如:

ActiveSheet.Cells
Application.Cells '引用当前工作表中的所有单元格
Cell(2,2)
Cell(2,"B") '引用单元格B2
Range(Cells(1,1),Cells(10,5)) '引用单元格区域A1:E10

若想在一个单元格区域中循环时,使用Cells属性是很方便的。
也可以使用Cells属性进行相对引用,如:

Range("D10:G20").Cells(2,3) '表示引用单元格区域D10:G20中第2行第3列的单元格,即单元格F11

也可使用语句:Range(“D10″).Cells(2,3)达到同样的引用效果。
5、Offset属性
Offset属性基于当前单元格按所给参数进行偏移,与Cells属性不同的是,它基于0即基准单元格为0,如:
Range(“A10″).Cells(1,1)和Range(“A10″).Offset(0,0)都表示单元格A10
当想引用于基准单元格区域同样大小的单元格区域时,则Offset属性是有用的。
6、Resize属性
可使用Resize属性获取相对于原单元格区域左上角单元格指定大小的区域。
7、SpecialCells方法
SpecialCells方法对应于“定位条件”对话框,如图05-02所示:
图4:“定位条件”对话框
8、CurrentRegion属性
使用CurrentRegion属性可以选取当前单元格所在区域,即周围是空行和空列所围成的矩形区域,等价于“Ctrl+Shift+*”快捷键。
9、End属性
End属性所代表的操作等价于“Ctrl+方向箭”的操作,使用常量xlUp、xlDown、xlToLeft和xlToRight分别代表上、下、左、右箭。
例如,下面的代码汇总活动单元格下方列的值:

Sub SumBelow()
    Dim rng As Range
    '汇总活动单元格下方单元格的值
    With ActiveCell
        Set rng = Range(.Offset(1), .Offset(1).End(xlDown))
        .Formula = "=SUM(" & _
                rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) & ")"
        .Copy Destination:=Range(.Cells(1), .Offset(1).End(xlToRight).Offset(-1))
    End With
End Sub

10、Columns属性和Rows属性
Columns属性和Rows属性分别返回单元格区域中的所有列和所有行。
11、Areas集合
在多个非连续的单元格区域中使用Columns属性和Rows属性时,只是返回第一个区域的行或列,如:

Range("A1:B5,C6:D10,E11:F15").Rows.Count

将返回5。
此时应使用Areas集合来返回区域中每个块的地址,如:

For Each rng In Range("A1:B5,C6:D10,E11:F15").Areas
    MsgBox rng.Address
Next rng

12、Union方法和Intersect方法
当想从两个或多个单元格区域中生成一个单元格区域时,使用Union方法;当找到两个或多个单元格区域共同拥有的单元格区域时,使用Intersect方法。
当然,操作单元格或单元格区域有很多有用的技巧,这需要在实践中总结和归纳。接下来的文章,我们将对Range对象的常用属性和方法进行详解。

声明:本文由完美Excel网站整理,完美Excel保留本文的所有权利,未经许可,任何组织或个人不得以任何方式将本文用于商业作途。其他网站或博客引用本文,请注明原文链接和版权声明。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多