VBA關於區域組合的自定義函數


ExcelVBA引用單元格區域
在使用ExcelVBA進行編程時,我們通常需要頻繁地引用單元格區域,然后再使用相應的屬性和方法對區域進行操作。所謂單元格區域,指的是單個的單元格、或者是由多個單元格組成的區域、或者是整行、整列等。下面,我們設定一些情形,以問答的形式對引用單元格區域的方式進行歸納。

--------------------------------------------------------------------------------
問題一:在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單元格區域,有哪些方式?
回答:可以使用下面列舉的任一方式對當前工作表中單元格區域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)

--------------------------------------------------------------------------------
問題三:在VBA代碼中,如何使用變量實現對當前工作表中不確定單元格區域的引用?
回答:有時,我們需要在代碼中依次獲取工作表中特定區域內的單元格,這通常可以采取下面的幾種方式:
(1) Range(“A” & i)
(2) Range(“A” & i & “:C” & i)
(3) Cells(i,1)
(4) Cells(i,j)
其中,i、j為變量,在循環語句中指定i和j的范圍后,依次獲取相應單元格。

--------------------------------------------------------------------------------
問題四:在VBA代碼中,如何擴展引用當前工作表中的單元格區域?
回答:可以使用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屬性是相對於當前活動單元格或某單元格區域中左上角單元格按指定的行數或列數擴展單元格區域。

--------------------------------------------------------------------------------
問題五:在VBA代碼中,如何在當前工作表中基於當前單元格區域或指定單元格區域處理其它單元格區域?
回答:可以使用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屬性從所指定的單元格開始按指定的行數和列數偏移,從而到達目的單元格,但偏移的行數和列數不包括指定單元格本身。

--------------------------------------------------------------------------------
問題六:在VBA代碼中,如何在當前工作表中引用交叉區域?
回答:可以使用Intersect方法,例如:
Intersect(Range("C3:E6"), Range("D5:F8")),表示單元格區域D5:E6,即單元格區域C3:E6與D5:F8相重迭的區域。

--------------------------------------------------------------------------------
問題七:在VBA代碼中,如何在當前工作表中引用多個區域?
回答:
(1) 可以使用Union方法,例如:
Union(Range("C3:D4"), Range("E5:F6")),表示單元格區域C3:D4和E5:F6所組成的區域。
Union方法可以將多個非連續區域連接起來成為一個區域,從而可以實現對多個非連續區域一起進行操作。
(2) 也可以使用下面的代碼:
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,即只計算第一個單元格區域。

--------------------------------------------------------------------------------
問題八:在VBA代碼中,如何引用當前工作表中活動單元格或指定單元格所在的區域(當前區域)?
回答:可以使用CurrentRegion屬性,例如:
(1) ActiveCell.CurrentRegion,表示活動單元格所在的當前區域。
(2) Range("D5").CurrentRegion,表示單元格D5所在的當前區域。
當前區域是指周圍由空行或空列所圍成的區域。該屬性的詳細使用參見《CurrentRegion屬性示例》一文。
[NextPage]
--------------------------------------------------------------------------------
問題九:在VBA代碼中,如何引用當前工作表中已使用的區域?
回答:可以使用UsedRange屬性,例如:
(1) Activesheet.UsedRange,表示當前工作表中已使用的區域。
(2) Worksheets("sheet1").UsedRange,表示工作表sheet1中已使用的區域。
與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區域,包括顯示為空行,但已進行過格式的單元格區域。該屬性的詳細使用參見《解析UsedRange屬性》一文。

--------------------------------------------------------------------------------
問題十:如何在單元格區域內指定特定的單元格?
回答:可以使用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。(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方法對整列或整行進行調整。

--------------------------------------------------------------------------------
問題十二:在VBA代碼中,如何引用當前工作表中的所有單元格?
回答:可以使用下面的代碼:
(1) Cells,表示當前工作表中的所有單元格。
(2) Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells. Columns.Count)),其中Cells.Rows表示工作表所有行,Cells. Columns表示工作表所有列。

--------------------------------------------------------------------------------
問題十三:在VBA代碼中,如何引用工作表中的特定單元格區域?
回答:在工作表中,您可能使用過“定位條件”對話框。可以通過選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個對話框可以允許用戶選擇特定的單元格。例如:
(1) Worksheets("sheet1").Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區域。
(2) ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當前工作表中活動單元格所在區域中所有空白單元格所組成的區域。
當然,還有很多常量和值的組合,可以讓您實現特定單元格的查找並引用。參見《探討在工作表中找到最后一行》一文。

--------------------------------------------------------------------------------
問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區域?
回答:要引用其它工作表或其它工作簿中的單元格區域,只需在單元格對象前加上相應的引用對象即可,例如:
(1) Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的單元格區域C3:D5。
(2) Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的單元格B2。

--------------------------------------------------------------------------------
問題十五:還有其它的一些情形嗎?
回答:列舉如下:
(1) Cells(15),表示單元格O1,即可在Cells屬性中指定單元格數字來選擇單元格,其計數順序為自左至右、從上到下,又如Cells(257),表示單元格B1。
(2) Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯誤。

--------------------------------------------------------------------------------
結語
我們用VBA對Excel進行處理,一般是對其工作表中的數據進行處理,因此,引用單元格區域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區域,才能使用相應的屬性和方法進行下一步的操作。
上面列舉了一些引用單元格區域的情形和方式,可以看出,引用單元格區域有很多方式,有一些可能不常用,可以根據工作表的所處的環境和個人編程習慣進行選擇使用。
當然,在編寫程序時,也可能會將上面的一些屬性聯合使用,以達到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合
轉載請注明:本文來自:Excel吧 (www.excelba.com) 詳細出處參考:http://www.excelba.com/Art/Html/180.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM