在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結 分類:ExcelVBA>>ExcelVBA對象模型編程>>常用對象>>Range對象 在使用ExcelVBA進行編程時,我們通常需要頻繁地引用單元格區(qū)域,然后再使用相應的屬性和方法對區(qū)域進行操作。所謂單元格區(qū)域,指的是單個的單元格、或者是由多個單元格組成的區(qū)域、或者是整行、整列等。下面,我們設定一些情形,以問答的形式對引用單元格區(qū)域的方式進行歸納。 問題一:在VBA代碼中,如何引用當前工作表中的單個單元格(例如引用單元格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") 問題二:在VBA代碼中,我要引用當前工作表中的B2:D6單元格區(qū)域,有哪些方式? 回答:可以使用下面列舉的任一方式對當前工作表中單元格區(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”,則又可以使用下面的語句引用該區(qū)域: ① 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) 問題三:在VBA代碼中,如何使用變量實現(xiàn)對當前工作表中不確定單元格區(qū)域的引用? 回答:有時,我們需要在代碼中依次獲取工作表中特定區(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)語句中指定i和j的范圍后,依次獲取相應單元格。 問題四:在VBA代碼中,如何擴展引用當前工作表中的單元格區(qū)域? 回答:可以使用Resize屬性,例如: (1) ActiveCell.Resize(4, 4),表示自當前單元格開始創(chuàng)建一個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ū)域。 如果是在一個單元格區(qū)域(如B3:E6),或一個命名區(qū)域中(如將單元格區(qū)域B3:E6命名為“MyRange”)使用Resize屬性,則只是相對于單元格區(qū)域左上角單元格擴展區(qū)域,例如: 代碼Range("C3:E6").Resize(, 2),表示單元格區(qū)域C3:D6,并且擴展的單元格區(qū)域可不在原單元格區(qū)域內(nèi)。 因此,可以知道Resize屬性是相對于當前活動單元格或某單元格區(qū)域中左上角單元格按指定的行數(shù)或列數(shù)擴展單元格區(qū)域。 問題五:在VBA代碼中,如何在當前工作表中基于當前單元格區(qū)域或指定單元格區(qū)域處理其它單元格區(qū)域? 回答:可以使用Offset屬性,例如: (1) Range("A1").Offset(2, 2),表示單元格C3。 (2) ActiveCell.Offset(, 1),表示當前單元格下一列的單元格。 (3) ActiveCell.Offset(1),表示當前單元格下一行的單元格。 (4) Range("C3:D5").Offset(, 1),表示單元格區(qū)域D3:E5,即將整個區(qū)域偏移一列。 從上面的代碼示例可知,Offset屬性從所指定的單元格開始按指定的行數(shù)和列數(shù)偏移,從而到達目的單元格,但偏移的行數(shù)和列數(shù)不包括指定單元格本身。 問題六:在VBA代碼中,如何在當前工作表中引用交叉區(qū)域? 回答:可以使用Intersect方法,例如: Intersect(Range("C3:E6"), Range("D5:F8")),表示單元格區(qū)域D5:E6,即單元格區(qū)域C3:E6與D5:F8相重迭的區(qū)域。 問題七:在VBA代碼中,如何在當前工作表中引用多個區(qū)域? 回答: (1) 可以使用Union方法,例如: Union(Range("C3:D4"), Range("E5:F6")),表示單元格區(qū)域C3:D4和E5:F6所組成的區(qū)域。 Union方法可以將多個非連續(xù)區(qū)域連接起來成為一個區(qū)域,從而可以實現(xiàn)對多個非連續(xù)區(qū)域一起進行操作。 (2) 也可以使用下面的代碼: Range("C3:D4, E5:F6")或[C3:D4, E5:F6] 注意:Range("C3:D4", "F5:G6"),表示單元格區(qū)域C3:G6,即將兩個區(qū)域以第一個區(qū)域左上角單元格為起點,以第二個區(qū)域右下角單元格為終點連接成一個新區(qū)域。 同時,在引用區(qū)域后使用Rows屬性和Columns屬性時,注意下面代碼的區(qū)別: ①Range("C3:D4", "F8:G10").Rows.Count,返回的值為8; ②Range("C3:D4,F8:G10").Rows.Count,返回的值為2,即只計算第一個單元格區(qū)域。 問題八:在VBA代碼中,如何引用當前工作表中活動單元格或指定單元格所在的區(qū)域(當前區(qū)域)? 回答:可以使用CurrentRegion屬性,例如: (1) ActiveCell.CurrentRegion,表示活動單元格所在的當前區(qū)域。 (2) Range("D5").CurrentRegion,表示單元格D5所在的當前區(qū)域。 當前區(qū)域是指周圍由空行或空列所圍成的區(qū)域。該屬性的詳細使用參見《CurrentRegion屬性示例》一文。 問題九:在VBA代碼中,如何引用當前工作表中已使用的區(qū)域? 回答:可以使用UsedRange屬性,例如: (1) Activesheet.UsedRange,表示當前工作表中已使用的區(qū)域。 (2) Worksheets("sheet1").UsedRange,表示工作表sheet1中已使用的區(qū)域。 與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區(qū)域,包括顯示為空行,但已進行過格式的單元格區(qū)域。該屬性的詳細使用參見《解析UsedRange屬性》一文。 問題十:如何在單元格區(qū)域內(nèi)指定特定的單元格? 回答:可以使用Item屬性,例如: (1) Range("A1:B10").Item(5,3)指定單元格C5,這個單元格處于以區(qū)域中左上角單元格A1(即區(qū)域中第1行第1列的單元格)為起點的第5行第3列。因為Item屬性為默認屬性,因此也可以簡寫為: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ù)值是正值,例如: ① 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列(因為E5是開始于區(qū)域中左上角單元格D4起的第2行第2列)。 (4) 也能使用一個單個的索引數(shù)值進行引用。計數(shù)方式為從左向右,即在區(qū)域中的第一行開始從左向右計數(shù),第一行結束后,然后從第二行開始從左到右接著計數(shù),依次類推。(注:從區(qū)域中第一行第一個單元格開始計數(shù),當?shù)谝恍薪Y束時,轉(zhuǎn)入第二行最左邊的單元格,這樣按一行一行從左向右依次計數(shù)。以單元格區(qū)域中第1個單元格開始,按上述規(guī)則依次為第2個單元格、第3個單元格….等等),例如: 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,等等。 也可以使用單個的負數(shù)索引值。 這種使用單個索引值的方法對遍歷列是有用的,例如,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)當與對象變量配合使用時,Item屬性能提供簡潔并有效的代碼,例如: Set rng = Worksheets(1).[a1] 定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個索引數(shù)值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。(By Chip Pearson) 問題十一:在VBA代碼中,如何引用當前工作表中的整行或整列? 回答:見下面的示例代碼: (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方法對整列或整行進行調(diào)整。 問題十二:在VBA代碼中,如何引用當前工作表中的所有單元格? 回答:可以使用下面的代碼: (1) Cells,表示當前工作表中的所有單元格。 (2) Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells. Columns.Count)),其中Cells.Rows表示工作表所有行,Cells. Columns表示工作表所有列。 問題十三:在VBA代碼中,如何引用工作表中的特定單元格區(qū)域? 回答:在工作表中,您可能使用過“定位條件”對話框。可以通過選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個對話框可以允許用戶選擇特定的單元格。例如: (1) Worksheets("sheet1").Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區(qū)域。 (2) ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當前工作表中活動單元格所在區(qū)域中所有空白單元格所組成的區(qū)域。 當然,還有很多常量和值的組合,可以讓您實現(xiàn)特定單元格的查找并引用。參見《探討在工作表中找到最后一行》一文。 問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區(qū)域? 回答:要引用其它工作表或其它工作簿中的單元格區(qū)域,只需在單元格對象前加上相應的引用對象即可,例如: (1) Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的單元格區(qū)域C3:D5。 (2) Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的單元格B2。 問題十五:還有其它的一些情形嗎? 回答:列舉如下: (1) Cells(15),表示單元格O1,即可在Cells屬性中指定單元格數(shù)字來選擇單元格,其計數(shù)順序為自左至右、從上到下,又如Cells(257),表示單元格B1。 (2) Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯誤。 結語 我們用VBA對Excel進行處理,一般是對其工作表中的數(shù)據(jù)進行處理,因此,引用單元格區(qū)域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區(qū)域,才能使用相應的屬性和方法進行下一步的操作。 上面列舉了一些引用單元格區(qū)域的情形和方式,可以看出,引用單元格區(qū)域有很多方式,有一些可能不常用,可以根據(jù)工作表的所處的環(huán)境和個人編程習慣進行選擇使用。 當然,在編寫程序時,也可能會將上面的一些屬性聯(lián)合使用,以達到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。 |