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