引子:本文以MSDN中《Developers Guide to the Excel 2007 Range Object》一文為線(xiàn)索,整理并歸納了自已以前學(xué)習Range對象時(shí)的一系列學(xué)習筆記。輯錄于此,供有興趣的朋友參考。
毫無(wú)疑問(wèn),Range對象是Excel對象模型中最重要的對象,幾乎所有與工作表有關(guān)的實(shí)質(zhì)性操作都涉及到Range對象,可以說(shuō),熟悉并熟練運用Range對象是掌握Excel VBA編程的關(guān)鍵。下面,讓我們逐步了解、熟悉并開(kāi)始使用Range對象吧。
在VBA代碼中引用或選擇Excel工作表的單元格或單元格區域
在使用Excel VBA編程時(shí),我們通常需要頻繁地引用單元格區域,然后再使用相應的屬性和方法對區域進(jìn)行操作。所謂單元格區域,指的是單個(gè)的單元格、或者包含連續或非連續的多個(gè)單元格組成的區域、或者是整行、整列、甚至是三維單元格區域等。
[應用1]引用當前工作表中的單個(gè)單元格(例如引用單元格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”,則又可以使用下面的語(yǔ)句引用該區域:
① Range(“MyRange”)
② [MyRange]
(7)Range(“B2″).Resize(5, 3)
(8)Range(“A1:C5″).Offset(1, 1)
(9)若單元格B2為當前單元格,則可使用語(yǔ)句:Range(ActiveCell, ActiveCell.Offset(4, 2))
(10)若單元格D6為當前單元格,則可使用語(yǔ)句:Range(“B2″, ActiveCell)
下面的過(guò)程將單元格區域 A1:D5 的字體設置為加粗。
Sub FormatRange() Workbooks("Book1").Sheets("Sheet1").Range("A1:D5") _ .Font.Bold = True End SubRange(“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(yíng)、C和F 列。
下面是給單元格賦值的幾個(gè)例子。
示例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 "現在A(yíng)1單元格中的值也為" & _ 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為單元格區域的名稱(chēng)。
[應用3]引用當前工作表中不確定的單元格區域
有時(shí),我們需要在代碼中依次獲取工作表中特定區域內的單元格,這通??梢圆扇∠旅娴膸追N方式:
(1)Range(“A” & i)
(2)Range(“A” & i & “:C” & i)
(3)Cells(i,1)
(4)Cells(i,j)
其中,i、j為變量,在循環(huán)語(yǔ)句中指定i和j的范圍后,依次獲取相應單元格。
在下例中,Cells(6,1)返回Sheet1上的單元格A6,然后將Value屬性設置為 10。
Sub EnterValue() Worksheets("Sheet1").Cells(6, 1).Value = 10 End Sub因為可以用變量替代編號,所以Cells屬性非常適合于在單元格區域中循環(huán),如下例中所示。
Sub CycleThrough()
Dim Counter As Integer
For Counter = 1 To 20
Worksheets("Sheet1").Cells(Counter, 3).Value = Counter Next Counter
End Sub
如果要同時(shí)更改某個(gè)區域中所有單元格的屬性(或將方法應用于該區域中的所有單元格),建議使用Range屬性。
[應用4]擴展引用當前工作表中的單元格區域
可以使用Resize屬性,例如:
(1)ActiveCell.Resize(4, 4),表示自當前單元格開(kāi)始創(chuàng )建一個(gè)4行4列的區域。
(2)Range(“B2″).Resize(2, 2),表示創(chuàng )建B2:C3單元格區域。
(3)Range(“B2″).Resize(2),表示創(chuàng )建B2:B3單元格區域。
(4)Range(“B2″).Resize(, 2),表示創(chuàng )建B2:C2單元格區域。
如果是在一個(gè)單元格區域(如B3:E6),或者一個(gè)命名區域中(如將單元格區域B3:E6命名為“MyRange”)使用Resize屬性,則只是相對于單元格區域左上角單元格擴展區域,例如:
代碼Range(“C3:E6″).Resize(, 2),表示單元格區域C3:D6,并且擴展的單元格區域可以不在原單元格區域內。
因此,可以知道Resize屬性是相對于當前活動(dòng)單元格或某單元格區域中左上角單元格按指定的行數或列數擴展單元格區域。
再舉一些例子。
例1:要選擇當前工作表中名為“Database”區域,然后將該區域向下擴展5行,可以使用下面的代碼:
Range("Database").Select Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count).Select例2:選擇名為“Database”區域下方4行右側3列的一個(gè)區域,然后擴展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,即將整個(gè)區域偏移一列。
從上面的代碼示例可知,Offset屬性從所指定的單元格開(kāi)始按指定的行數和列數偏移,從而到達目的單元格,但偏移的行數和列數不包括指定單元格本身。正值表示向下和向右,負值表示向上和向左,零值則是指當前單元格。
例如,要選擇距當前單元格下面5行左側4列的單元格,可以使用下面的代碼:
ActiveCell.Offset(5, -4).Select
要選擇距當前單元格上方2行右側3列的單元格,可以使用下面的代碼:
ActiveCell.Offset(-2, 3).Select
注意:一定要保證當前單元格與所選單元格之間的距離在工作表范圍內,否則會(huì )出錯。
又如,要選擇距單元格C7下方5行右側4列的單元格,可以使用下面的代碼:
ActiveSheet.Cells(7, 3).Offset(5, 4).Select
或:
ActiveSheet.Range("C7").Offset(5, 4).Select再舉一些例子。
例如,要選擇與名為“Test”的區域大小相同但在該區域下方4行右側3列的一個(gè)區域,可以使用下面的代碼:
ActiveSheet.Range("Test").Offset(4, 3).Select如果該命名區域不在當前工作表中,可以先激活該工作表,然后再選擇,如下面的代碼:
Sheets("Sheet3").Activate ActiveSheet.Range("Test").Offset(4, 3).Select下面的例子計算移動(dòng)平均值:
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個(gè)單元格設置為一個(gè)單元格區域,計算其平均值,并放置在單元格C3中。接著(zhù),Offset屬性將單元格區域下移一行但仍在B列,計算單元格區域B2:B4的平均值,并將結果放置到單元格C4。代碼重復上述過(guò)程直到單元格B12。
[應用6]在當前工作表中引用交叉區域
可以使用Intersect方法,例如:
Intersect(Range("C3:E6"), Range("D5:F8"))表示單元格區域D5:E6,即單元格區域C3:E6與D5:F8相重迭的區域。
又如,要選擇名為“Test”和“Sample”的兩個(gè)區域的交叉區域,可以使用下面的代碼:
Application.Intersect(Range("Test"), Range("Sample")).Select注意,兩個(gè)區域必須在同一工作表中。
注意,如果兩個(gè)區域不存在交叉,那么該方法返回Nothing。
例如,下面的代碼選擇兩個(gè)命名區域的交叉部分,如果不存在交叉,則顯示一條消息。
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]在當前工作表中引用多個(gè)區域
(1)可以使用Union方法,將多個(gè)區域組合到一個(gè)Range對象中。例如:
Union(Range("C3:D4"), Range("E5:F6"))表示單元格區域C3:D4和E5:F6所組成的區域。
Union方法可以將多個(gè)非連續區域連接起來(lái)成為一個(gè)區域,從而可以實(shí)現對多個(gè)非連續區域一起進(jìn)行操作。
(2)也可以使用下面的代碼,即通過(guò)在兩個(gè)或多個(gè)引用之間插入逗號,可使用Range屬性引用多個(gè)區域:
Range("C3:D4, E5:F6")或
[C3:D4, E5:F6]
注意:Range(“C3:D4″, “F5:G6″),表示單元格區域C3:G6,即將兩個(gè)區域以第一個(gè)區域左上角單元格為起點(diǎn),以第二個(gè)區域右下角單元格為終點(diǎn)連接成一個(gè)新區域。
同時(shí),在引用區域后使用Rows屬性和Columns屬性時(shí),注意下面代碼的區別:
①Range(“C3:D4″, “F8:G10″).Rows.Count,返回的值為8;
②Range(“C3:D4,F8:G10″).Rows.Count,返回的值為2,即只計算第一個(gè)單元格區域。
(3)可用Areas屬性引用選定的單元格區域或多塊選定區域中的區域集合。
例1:以下示例清除了 Sheet1 上三個(gè)區域的內容。
Sub ClearRanges() Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18"). _ ClearContents End Sub命名區域使得用Range屬性處理多個(gè)區域更加容易。以下示例可在所有這三個(gè)命名區域處于同一工作表時(shí)運行。
Sub ClearNamed() Range("MyRange, YourRange, HisRange").ClearContents End Sub例2:為了同時(shí)選擇名為“Test”和“Sample”的兩個(gè)區域,可以使用下面的代碼:
Application.Union(Range("Test"), Range("Sample")).Select注意,這兩個(gè)區域須在同一工作表中,如下面的代碼:
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"))將會(huì )出錯。
例3:以下示例創(chuàng )建了名為 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:下述過(guò)程計算選定區域中的塊數目,如果有多個(gè)塊,就顯示一則警告消息。
Sub FindMultiple() If Selection.Areas.Count > 1 Then MsgBox "不能對多個(gè)選區進(jìn)行操作." End If End Sub
[應用8]引用當前工作表中活動(dòng)單元格或指定單元格所在的區域(當前區域)
可以使用CurrentRegion屬性,例如:
(1)ActiveCell.CurrentRegion,表示活動(dòng)單元格所在的當前區域。
(2)Range(“D5″).CurrentRegion,表示單元格D5所在的當前區域。
當前區域是指周?chē)煽招谢蚩樟兴鶉傻膮^域。
下面的示例將當前工作表當前區域的值復制到剪貼板,然后將這些值插入到新工作表:
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屬性不同的是,該屬性代表工作表中已使用的單元格區域,包括顯示為空行,但已進(jìn)行過(guò)格式的單元格區域。
'選取當前工作表中已使用的單元格區域 Sub SelectUsedRange() MsgBox "選取當前工作表中已使用的單元格區域" _ & vbCrLf & "并顯示其地址" ActiveSheet.UsedRange.Select MsgBox ActiveSheet.UsedRange.Address End Sub
[應用10]在單元格區域內指定特定的單元格
可以使用Item屬性,例如:
(1)Range(“A1:B10″).Item(5,3)指定單元格C5,這個(gè)單元格處于以區域中左上角單元格A1(即區域中第1行第1列的單元格)為起點(diǎn)的第5行第3列。因為Item屬性為默認屬性,因此也可以簡(jiǎn)寫(xiě)為:Range(“A1:B10″)(5,3)。
如果將A1:B10區域命名為”MyRange”,那么Range(“MyRange”)(5,3)也指定單元格C5。
(2)Range(“A1:B10″)(12,13)指定單元格M12,即用這種方式引用單元格,該單元格不必一定要包含在區域內。
同時(shí),也不需要索引數值是正值,例如:
① Range(“D4:F6″)(0,0)代表單元格C3;
② Range(“D4:F6″)(-1,-2)代表單元格A2。
而Range(“D4:F6″)(1,1)代表單元格D4。
(3)也可以在單元格區域中循環(huán),例如:
Range(“D4:F6″)(2,2)(3,4)代表單元格H7,即該單元格位于作為左上角單元格E5的第3行第4列(因為E5是開(kāi)始于區域中左上角單元格D4起的第2行第2列)。
(4)也能使用一個(gè)單個(gè)的索引數值進(jìn)行引用。計數方式為從左向右,即在區域中的第一行開(kāi)始從左向右計數,第一行結束后,然后從第二行開(kāi)始從左到右接著(zhù)計數,依次類(lèi)推。(注:從區域中第一行第一個(gè)單元格開(kāi)始計數,當第一行結束時(shí),轉入第二行最左邊的單元格,這樣按一行一行從左向右依次計數。以單元格區域中第1個(gè)單元格開(kāi)始,按上述規則依次為第2個(gè)單元格、第3個(gè)單元格….等等),例如:
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,等等。
也可以使用單個(gè)的負數索引值。
這種使用單個(gè)索引值的方法對遍歷列是有用的,例如,Range(“D4″)(1)代表單元格D4,Range(“D4″)(2)代表單元格D5,Range (“D4″)(11)代表單元格D14,等等。
同理,稍作調整后也可遍歷行,例如:
Range(“D4″).Columns(2)代表單元格E4,Range(“D4″).Columns(5)指定單元格H4,等等。
(5)當與對象變量配合使用時(shí),Item屬性能提供簡(jiǎn)潔并有效的代碼,例如:
Set rng = Worksheets(1).[A1]
定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個(gè)索引數值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。
[應用11]引用當前工作表中的整行或整列
見(jiàn)下面的示例代碼:
(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方法對整列或整行進(jìn)行調整。
此外,可用Rows屬性或Columns屬性來(lái)處理整行或整列。這兩個(gè)屬性返回代表單元格區域的Range對象。在下例中,Rows(1)返回Sheet1上的第一行,然后將區域字體加粗。
Sub RowBold() Worksheets("Sheet1").Rows(1).Font.Bold = True End Sub另,Rows(1)代表當前工作表中的第一行,Rows代表當前工作表中的所有的行,Columns(1)代表當前工作表中的第一列,Columns(“A”)代表當前工作表中的第一列,Columns代表當前工作表中所有的列。
若要同時(shí)處理若干行或列,可創(chuàng )建一個(gè)對象變量并使用Union方法,將對Rows屬性或Columns屬性的多個(gè)調用組合起來(lái)。下例將活動(dòng)工作簿中第一張工作表上的第一行、第三行和第五行的字體設置為加粗。
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表示工作表所有列。
下面的過(guò)程清除活動(dòng)工作簿中Sheet1上所有單元格的內容。
Sub ClearSheet() Worksheets("Sheet1").Cells.ClearContents End Sub[應用13]引用工作表中的特定單元格區域
在工作表中,您可能使用過(guò)“定位條件”對話(huà)框??梢酝ㄟ^(guò)選擇菜單“編輯——定位”,單擊“定位”對話(huà)框中的“定位條件”按鈕顯示該對話(huà)框。這個(gè)對話(huà)框可以允許用戶(hù)選擇特定的單元格。例如:
(1)Worksheets(“sheet1″).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當前工作表中活動(dòng)單元格所在區域中所有空白單元格所組成的區域。
(3)選擇所有公式單元格
Sub SelectSpecialCells() MsgBox "選擇當前工作表中所有公式單元格" ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Select End Sub
當然,還有很多常量和值的組合,可以讓您實(shí)現特定單元格的查找并引用。
[應用14]引用命名區域
使用名稱(chēng)比使用A1樣式記號更容易標識單元格區域。若要命名選定的單元格區域,請單擊編輯欄左端的名稱(chēng)框,鍵入名稱(chēng),再按回車(chē)鍵。
例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”,并添加邊框線(xiàn):
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
以下示例顯示對于活動(dòng)工作簿將如何編寫(xiě)與上例相同的過(guò)程。
Sub ClearRange() Application.Goto Reference:="MyRange" Selection.ClearContents End Sub
例7:下例用For Each…Next循環(huán)語(yǔ)句在命名區域中的每一個(gè)單元格上循環(huán)。如果該區域中的任一單元格的值超過(guò)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:選擇連續數據列中的最后一個(gè)單元格
要選擇一個(gè)列A中最后一個(gè)單元格,可以使用下面的代碼:
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:選擇一個(gè)矩形(規則的)單元格區域
要選擇圍繞某單元格的一個(gè)矩形區域,可以使用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]選擇多個(gè)不同長(cháng)度的非連續列
例如,有如下圖2所示的工作表:
圖2:示例數據
要同時(shí)選擇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]設置當前單元格的前一個(gè)單元格和后一個(gè)單元格的值
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說(shuō)明:使用Application.Goto方法,如果指定另一工作表(不是當前工作表)中的指定區域,在Range屬性中使用兩個(gè)Cells屬性時(shí),則必須包括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上區域中的格式和所有數據傳送到活動(dòng)工作簿中所有工作表上的相應區域。
Sub FillAll() Worksheets("Sheet2").Range("A1:H1") _ .Borders(xlBottom).LineStyle = xlDouble Worksheets.FillAcrossSheets (Worksheets("Sheet2") _ .Range("A1:H1")) End Sub[應用20]使用Range對象變量引用單元格
如果將對象變量設置為Range對象,即可以使用變量名輕松地操作單元格區域。
以下過(guò)程將創(chuàng )建對象變量myRange,然后將活動(dòng)工作簿中Sheet1上的區域A1:D5賦予該變量。隨后的語(yǔ)句用該變量名稱(chēng)代替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以前的版本來(lái)說(shuō):
(1)Cells(15),表示單元格O1,即可在Cells屬性中指定單元格數字來(lái)選擇單元格,其計數順序為自左至右、從上到下,又如Cells(257),表示單元格B1。
(2)Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會(huì )返回錯誤。
Excel 2007中增加了工作表列數和行數,因此上述限制相應改變。
說(shuō)明:上面的一些代碼在選擇單元格或單元格區域時(shí),先激活工作表后選擇,這只是為了說(shuō)明的方便。實(shí)際上,在操作單元格時(shí),只要引用了相應的單元格或單元格區域,不必先激活工作表。
小結:我們使用VBA對Excel進(jìn)行處理,一般是對其工作表中的數據進(jìn)行處理,因此,引用單元格區域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區域,才能使用相應的屬性和方法進(jìn)行下一步的操作。
上面列舉了一些引用單元格區域的情形和方式,可以看出,引用單元格區域有很多方式,有一些可能不常用,可以根據工作表的所處的環(huán)境和個(gè)人編程習慣進(jìn)行選擇使用。
當然,在編寫(xiě)程序時(shí),也可能會(huì )將上面的一些屬性聯(lián)合使用,以達到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。
下面對Range對象的一些常用屬性和方法進(jìn)行簡(jiǎn)單的小結。
1、Activate與Select
試驗下面的過(guò)程:
Sub SelectAndActivate() Range("B3:E10").Select Range("C5").Activate End Sub其結果如下圖所示:
圖3:Select與Activate
即選取單元格區域B3:E10并將單元格C5選中。
Selection指單元格區域B3:E10,而ActiveCell則是單元格C5;ActiveCell代表單個(gè)的單元格,而Selection則可以代表單個(gè)單元格,也可以代表單元格區域。
2、Range屬性
可以使用Application對象的Range屬性引用Range對象,如
Application.Range("B2") '代表當前工作表中的單元格B2若引用當前工作表中的單元格,也可以忽略前面的Application對象。
Range("A1:D10") '代表當前工作表中的單元格區域A1:D10 Range("A1:A10,C1:C10,E1:E10") '代表當前工作表中非連續的三個(gè)區域組成的單元格區域Range屬性也接受指向單元格區域對角的兩個(gè)參數,如:
Range("A1","D10") '代表單元格區域A1:D10當然,Range屬性也接受單元格區域名稱(chēng),如:
Range("Data") '代表名為Data的數據區域Range屬性的參數可以是對象也可以是字符串,如:
Range("A1",Range("LastCell"))3、單元格引用的快捷方式
可以在引用區域兩側加上方括號來(lái)快速引用單元格區域,如:
[B2]
[A1:D10]
[A1:A10,C1:C10,E1:E10]
[Data]
但其引用的是絕對區域。
4、Cells屬性
可以使用Cells屬性來(lái)引用Range對象。如:
ActiveSheet.Cells Application.Cells '引用當前工作表中的所有單元格 Cell(2,2) Cell(2,"B") '引用單元格B2 Range(Cells(1,1),Cells(10,5)) '引用單元格區域A1:E10
若想在一個(gè)單元格區域中循環(huán)時(shí),使用Cells屬性是很方便的。
也可以使用Cells屬性進(jìn)行相對引用,如:
Range("D10:G20").Cells(2,3) '表示引用單元格區域D10:G20中第2行第3列的單元格,即單元格F11也可使用語(yǔ)句:Range(“D10″).Cells(2,3)達到同樣的引用效果。
5、Offset屬性
Offset屬性基于當前單元格按所給參數進(jìn)行偏移,與Cells屬性不同的是,它基于0即基準單元格為0,如:
Range(“A10″).Cells(1,1)和Range(“A10″).Offset(0,0)都表示單元格A10
當想引用于基準單元格區域同樣大小的單元格區域時(shí),則Offset屬性是有用的。
6、Resize屬性
可使用Resize屬性獲取相對于原單元格區域左上角單元格指定大小的區域。
7、SpecialCells方法
SpecialCells方法對應于“定位條件”對話(huà)框,如圖05-02所示:
8、CurrentRegion屬性
使用CurrentRegion屬性可以選取當前單元格所在區域,即周?chē)强招泻涂樟兴鶉傻木匦螀^域,等價(jià)于“Ctrl+Shift+*”快捷鍵。
9、End屬性
End屬性所代表的操作等價(jià)于“Ctrl+方向箭”的操作,使用常量xlUp、xlDown、xlToLeft和xlToRight分別代表上、下、左、右箭。
例如,下面的代碼匯總活動(dòng)單元格下方列的值:
Sub SumBelow() Dim rng As Range '匯總活動(dòng)單元格下方單元格的值 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 Sub10、Columns屬性和Rows屬性
Columns屬性和Rows屬性分別返回單元格區域中的所有列和所有行。
11、Areas集合
在多個(gè)非連續的單元格區域中使用Columns屬性和Rows屬性時(shí),只是返回第一個(gè)區域的行或列,如:
Range("A1:B5,C6:D10,E11:F15").Rows.Count將返回5。
此時(shí)應使用Areas集合來(lái)返回區域中每個(gè)塊的地址,如:
For Each rng In Range("A1:B5,C6:D10,E11:F15").Areas MsgBox rng.Address Next rng對 Office 2003 用戶(hù)的重要通知: 若要繼續接收 Office 安全更新,請確保您運行的是 Office 2003 Service Pack 3 (SP3)。對 Office 2003 的支持將于 2014 年 4 月 8 日終止。如果要在支持終止后運行 Office 2003,為確保您繼續收到 Office 的所有重要安全更新,您需要升級到更新版本,例如 Office 365 或 Office 2013。有關(guān)更多信息,請參閱對 Office 2003 的支持將終止。 文章編號: 291308 - 查看本文應用于的產(chǎn)品
![]() |
聯(lián)系客服