這個是MSDN上的文章,介紹了Excel中最常用的Range對象的使用方法。也適用于Excel2007之前的版本。
概述
我們在Microsoft Office Excel2007中所做的大部分工作都是和單元格相關。同樣,我們對Excel對象所做的大部分事情包括使用區(qū)域。一個Range可表示一個單元格、一行、一列或者包含一個或多個連續(xù)單元格塊的選擇、或者一個3-D區(qū)域。
Range屬性返回一個Range對象。Range屬性可以有兩種表示方法。
expression.Range(cell1) expression.Range(cell1,cell2)
在第一個例子中,cell1表示一個單元格的區(qū)域;第二個例子中,兩個數(shù)值表示連續(xù)單元格區(qū)域。在這些示例中,expression是一個必需的元素,必須是Application對象、Range對象或Worksheet對象的其中之一。如果它被省略,便默認是ActiveSheet對象。在第二個例子中,單元格分隔符可以說對象操作符(冒號),重疊操作符(空格),或合并操作符(逗號)。
今天才知道可以使用空格來做重疊操作,例如Range(”A1:C3 B2:D4)其實就是Range(”B2:C3″)。
在下面的幾節(jié)中,你將學習使用Excel區(qū)域的多種操作方法。然而,這些示例只是你可以操作區(qū)域的一部分方法。更多關于Range對象模型成員的資料請參考Range對象成員。
給單元格賦值
給單個單元格賦值很簡單。
Worksheets("Sheet1").Range("A1").Value=3.14159
同樣,可以使用下面的方法給已命名的單元格賦值。
ActiveSheet.Range("MyCell").Value=1
下面的例子給單元格區(qū)域插入同樣的一個數(shù)值。
Worksheets("Sheet1").Range("A1:B10").Value=1
使用在第一節(jié)中介紹過的Range屬性第二種表示方法,你可以實現(xiàn)同樣的結果。
Range("A1","B10")=1
注意Range引用的對象被省略,因此默認使用當前工作表。還有,Range對象的屬性也被省略,則使用默認的Value屬性,并賦值為1。
此外,當你使用第二種表示方法時,下面的語句將XYZ值賦給Sheet2的A1、A3和A5單元格。
Worksheets("Sheet2").Range("A1,A3,A5")="XYZ"
下面的例子中,在Sheet1的A1單元格中插入一個公式。
Worksheets("Sheet1").Range("A1").Formula="=10*RAND()"
這個例子遍歷Sheet1的D1:D10單元格,如果其中一個單元格的String值等于“For Sale”,代碼將替換該值為字符串“Sold”。
For Each c in Worksheets("Sheet1").Range("D1:D10") If c.Value="For Sale" Then c.Value="Sold" End If Next c
區(qū)域的表示方法
有幾種方法表示一個區(qū)域
- 通過單元格地址
- 通過對另外一個單元格的偏移
- 通過名稱
- 當前的選擇
通過使用單元格地址有幾種方法直接表示一個區(qū)域;通過使用ActiveSheet對象你可以使用絕對引用,或者通過使用ActiveCell對象或其它區(qū)域?qū)ο竽憧梢允褂孟鄬σ谩?/p>
在工作表中引用區(qū)域
當你使用區(qū)域時,大部分時間你指的是活動工作表上的一個區(qū)域。不過你可以方便的表示一個非活動工作簿中的區(qū)域。例如,如下面的例子,你可以使用Range屬性表示ActiveSheet上的一個區(qū)域,這里指的是B1單元格到B15單元格的區(qū)域。
Range("B1:B15").Select
同樣,也可以引用另外一個非活動工作表中的同樣的單元格區(qū)域,你可以指定工作表的序號或名稱。
Worksheets(2).Range("B1:B15").Select
你也可以不知道工作表而表示一個非活動工作表的區(qū)域,但必須在該區(qū)域有唯一名稱時才行。
Range("SalesTax").Select
這個技巧不需要關心哪個工作表包含這個已命名的區(qū)域。
引用區(qū)域中的單個單元格
引用區(qū)域中的單元格同引用整個工作簿中的單元格使用同樣的方法。例如,假設指定B4:E10為區(qū)域。要引用這個區(qū)域中的B4單元格,你可以使用Range對象中的A1。要引用這個區(qū)域中的D8單元格,你可以使用Range對象中的C5。
使用偏移引用一個區(qū)域中的單元格
Offset屬性返回一個Range對象,它讓你引用相對于另外一個單元格的單元格。通過指定距離指定位置的列和行數(shù),你可以引用這個單元格。語法如下:
Object.Offset(rowOffset, columnOffset)
正值將焦點往下和右移動。負值將焦點往上和左移動。零表示當前單元格。例如,假設開始位置上單元格E5。
第一個語句在E5往下移一行的E6單元格插入1。
ActiveCell.Offset(1,0)=1
這一個語句在E5往右移一列的F5單元格插入1。
ActiveCell.Offset(0,1)=1
這一個語句在E5往左移3列的B5單元格插入1。
ActiveCell.Offset(0,-3)=1
下面的例子使用Offset屬性計算一個移動平均值。
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列中的前三個單元格為一個區(qū)域,將這些值的總和除以3,然后將平均值插入到C3單元格。然后使用Offset屬性將該區(qū)域往下移動一行,但仍在B列中,這樣就計算B2:B4區(qū)域中的值得平均值。這個值被插入到C4。這個計算過程一直重復到B12單元格。
引用一個命名區(qū)域中的單元格
一個命名區(qū)域擁有一個唯一的名稱。Excel將定義的區(qū)域的名稱保存在Names集合中,這個集合是Workbook對象的一個屬性。命名區(qū)域是Excel中的一個強大的工具,讓你可以給一個單元格或一個單元格區(qū)域賦予一個有意義的名稱。例如,你可以給單元格C1賦予SalesTax的名稱,然后在你正常使用單元格C1的任何時候使用SalesTax,例如下面的例子。
Total=Range("A1")*Range("SalesTax")
在文章的后面部分將更詳細地討論命名區(qū)域。
選擇單元格區(qū)域
沒有一個ActiveRange對象來表示活動區(qū)域,但有其它的方法來使用一個區(qū)域:Select方法讓你選擇一個單元格區(qū)域。當一個區(qū)域被選擇后,你可以使用Selection對象來控制該區(qū)域選擇的動作。
例如,你可以復制一個區(qū)域的值到剪貼板然后插入到一個新的工作表。
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
在這個例子中,ActiveCell對象的CurrentRegion屬性用來選擇一個區(qū)域,這個例子中是D1,然后復制內(nèi)容到剪貼板。一個新的工作表添加到最后一個工作表的后面,并將單元格內(nèi)容復制到新的工作表。
你還可以對選擇的區(qū)域執(zhí)行其它的操作,例如以黑體顯示選擇的區(qū)域。
Selection.Font.Bold=True
下面的語句可以得到同樣的結果。
Range("C5:C20").Font.Bold=True
除了CurrentRegion屬性,你可以使用Range對象的End方法告訴Excel往哪個方向擴張區(qū)域。其中的枚舉類型參數(shù)表示擴張的方向。
通過End方法返回的Range對象表示位于包含目標區(qū)域的范圍尾端的單元格。使用End方法等同于按下END+UP鍵、END+DOWN鍵、END+LEFT鍵或END+RIGHT鍵。這個例子選擇包含B4單元格的范圍中B列最頂部的單元格。
Range("B4").End(xlUP).Select
這個例子選擇包含B4單元格的范圍中第4行最尾行的單元格。
Range("B4").End(xlToRight).Select
這個例子從B4單元格將選擇擴展到包含數(shù)據(jù)的第4行最后一個單元格。
Worksheets("Sheet1").Activate Range("B4",Range("B4").End(xlToRight)).Select
下面的例子使用End方法和方向枚舉參數(shù)來匯總每一列的值。例如,假設你有很多列的數(shù)據(jù),一直從B2單元格到G11,選擇B1為活動單元格,運行宏,然后會將總和放到每列的頂端。
Sub SumBelow() Dim rng As Range ' 計算活動單元格下面區(qū)域的總和并復制總和到其它的列 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