第一篇:在VBA代碼中引用Excel工作表中單元格區域的方式小結
在VBA代碼中引用Excel工作表中單元格區域的方式小結
問題一:在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屬性示例》一文。
問題九:在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屬性等的組合。
如何選擇當前工作表中的單元格?
例如,可以使用下面的代碼選擇當前工作表中的單元格D5: ActiveSheet.Cells(5, 4).Select 或:ActiveSheet.Range(“D5”).Select 如何選擇同一工作簿中其它工作表上的單元格?
例如,要選擇同一工作簿中另一工作表上的單元格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 如何選擇當前工作表中的單元格區域?
例如,要選擇當前工作表中的單元格區域C2:D10,可以使用下面的代碼: ActiveSheet.Range(Cells(2, 3), Cells(10, 4)).Select 或:ActiveSheet.Range(“C2:D10”).Select 或:ActiveSheet.Range(“C2”, “D10”).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 如何在當前工作表中選擇命名區域?
例如,要選擇當前工作表中名為“Test”的區域,可以使用下面的代碼: Range(“Test”).Select 或:Application.Goto “Test” 如何選擇同一工作簿中另一工作表上的命名區域?
例如,選擇同一工作簿中另一工作表上名為“Test”的區域,可使用下面的代碼: Application.Goto Sheets(“Sheet1”).Range(“Test”)也可以先激活工作表,再選擇: Sheets(“Sheet1”).Activate Range(“Test”).Select 如何選擇不同工作簿中工作表上的命名區域?
例如,要選擇不同工作簿中工作表上名為“Test”的區域,可使用下面的代碼: Application.Goto Workbooks(“BOOK2.XLS”).Sheets(“Sheet2”).Range(“Test”)也可以先激活工作表,再選擇:
Workbooks(“BOOK2.XLS”).Sheets(“Sheet2”).Activate Range(“Test”).Select 如何選擇與當前單元格相關的單元格?
例如,要選擇距當前單元格下面5行左側4列的單元格,可以使用下面的代碼: ActiveCell.Offset(5,-4).Select 要選擇距當前單元格上方2行右側3列的單元格,可以使用下面的代碼: ActiveCell.Offset(-2, 3).Select 注意:一定要保證當前單元格與所選單元格之間的距離在工作表范圍內,否則會出錯。如何選擇與另一單元格(不是當前單元格)相關的單元格?
例如,要選擇距單元格C7下方5行右側4列的單元格,可以使用下面的代碼: ActiveSheet.Cells(7, 3).Offset(5, 4).Select 或:ActiveSheet.Range(“C7”).Offset(5, 4).Select 如何選擇偏離指定區域的一個單元格區域?
例如,要選擇與名為“Test”的區域大小相同但在該區域下方4行右側3列的一個區域,可以使用下面的代碼:
ActiveSheet.Range(“Test”).Offset(4, 3).Select 如果該命名區域不在當前工作表中,可以先激活該工作表,然后再選擇,如下面的代碼: Sheets(“Sheet3”).Activate ActiveSheet.Range(“Test”).Offset(4, 3).Select 如何選擇一個指定的區域并擴展區域的大小?
例如,要選擇當前工作表中名為“Database”區域,然后將該區域向下擴展5行,可以使用下面的代碼:
Range(“Database”).Select Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count).Select 如何選擇一個指定的區域,再偏離,然后擴展區域的大小?
例如,選擇名為“Database”區域下方4行右側3列的一個區域,然后擴展2行和1列,可以使用下面的代碼: Range(“Database”).Select Selection.Offset(4, 3).Resize(Selection.Rows.Count + 2, Selection.Columns.Count + 1).Select 如何選擇兩個或多個指定區域?
例如,為了同時選擇名為“Test”和“Sample”的兩個區域,可以使用下面的代碼: Application.Union(Range(“Test”), Range(“Sample”)).Select 注意,這兩個區域須在同一工作表中,如下面的代碼:
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”))將會出錯。如何選擇兩個或多個指定區域的交叉區域?
例如,要選擇名為“Test”和“Sample”的兩個區域的交叉區域,可以使用下面的代碼: Application.Intersect(Range(“Test”), Range(“Sample”)).Select 注意,兩個區域必須在同一工作表中。= = = = = = = = = = = = = = = = = = = = = = = = = 下面的示例使用了如下圖所示的工作表。
如何選擇連續數據列中的最后一個單元格?
例如,要選擇一個連續列中的最后一個單元格,可以使用下面的代碼: ActiveSheet.Range(“a1”).End(xlDown).Select 該代碼使用在上面的工作表中,單元格A4被選擇。如何選擇連續數據列底部的空單元格?
例如,要選擇連續單元格區域下面的單元格,可以使用下面的代碼: ActiveSheet.Range(“a1”).End(xlDown).Offset(1, 0).Select 該代碼使用在上面的工作表中,單元格A5被選擇。如何選擇某列中連續數據單元格區域?
例如,要選擇一列中的連續數據單元格區域,可以使用下面的代碼: ActiveSheet.Range(“a1”, ActiveSheet.Range(“a1”).End(xlDown)).Select 或:ActiveSheet.Range(“a1:” & ActiveSheet.Range(“a1”).End(xlDown).Address).Select 該代碼使用在上面的工作表中,單元格區域A1:A4將被選擇。如何選擇某列中非連續數據單元格區域?
例如,要選擇某列中非連續數據單元格區域,可以使用下面的代碼: ActiveSheet.Range(“a1”, ActiveSheet.Range(“a65536”).End(xlUp)).Select 或:ActiveSheet.Range(“a1:” & ActiveSheet.Range(“a65536”).End(xlUp).Address).Select 該代碼使用在上面的工作表中,單元格區域A1:A6將被選擇。如何選擇一個矩形(規則的)單元格區域?
要選擇圍繞某單元格的一個矩形區域,可以使用CurrentRegion方法。CurrentRegion方法將選擇四周被空行和空列圍繞的區域,如下面的代碼: ActiveSheet.Range(“a1”).CurrentRegion.Select 該代碼使用在上面的工作表中,將選擇單元格區域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 = = = = = = = = = = = = = = = = = = = = 如何選擇多個不同長度的非連續列? 例如,有下圖所示的工作表:
要同時選擇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 = = = = = = = = = = = = = = = = = = = = 注:使用Application.Goto方法,如果指定另一工作表(不是當前工作表)中的指定區域,在Range屬性中使用兩個Cells屬性時,則必須包括Sheets對象,如:
Application.Goto Sheets(“Sheet1”).Range(Sheets(“Sheet1”).Range(Sheets(“Sheet1”).Cells(2, 3), Sheets(“Sheet1”).Cells(4, 5)))= = = = = = = = = = = = = = = = = = = = 在VBA中,Range 對象既可表示單個單元格,也可表示單元格區域。下面的內容說明了標識和處理Range對象最常用的方法。引用工作表上的所有單元格
如果對工作表應用 Cells 屬性時不指定索引號,該方法將返回代表工作表上所有單元格的 Range 對象。以下 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內容。Sub ClearSheet()Worksheets(“Sheet1”).Cells.ClearContents End Sub 使用 A1 表示法引用單元格和區域
可使用 Range 屬性引用 A1 引用樣式中的單元格或單元格區域。下述子例程將單元格區域 A1:D5 的字體設置為加粗。Sub FormatRange()Workbooks(“Book1”).Sheets(“Sheet1”).Range(“A1:D5”)_.Font.Bold = True End Sub 下表演示了使用 Range 屬性的一些 A1 樣式引用。引用 含義 Range(“A1”)單元格 A1 Range(“A1:B5”)從單元格 A1 到單元格 B5 的區域 Range(“C5:D9,G9:H16”)多塊選定區域 Range(“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、C 和 F 列 引用行和列
可用 Rows 屬性或 Columns 屬性來處理整行或整列。這兩個屬性返回代表單元格區域的 Range 對象。在下例中,Rows(1)返回 Sheet1 上的第一行,然后將區域字體加粗。Sub RowBold()Worksheets(“Sheet1”).Rows(1).Font.Bold = True End Sub 下表舉例說明了使用 Rows 和 Columns 屬性的一些行和列的引用。引用 含義 Rows(1)第一行
Rows 工作表上所有的行 Columns(1)第一列 Columns(“A”)第一列
Columns 工作表上所有的列
若要同時處理若干行或列,可創建一個對象變量并使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個調用組合起來。下例將活動工作簿中第一張工作表上的第一行、第三行和第五行的字體設置為加粗。Sub SeveralRows()Worksheets(“Sheet1”).Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5))myUnion.Font.Bold = True End Sub 使用索引號引用單元格
通過使用行列索引號,可用 Cells 屬性引用單個單元格。該屬性返回代表單個單元格的 Range 對象。在下例中,Cells(6,1)返回 Sheet1 上的單元格 A6,然后將 Value 屬性設置為 10。
Sub EnterValue()Worksheets(“Sheet1”).Cells(6, 1).Value = 10 End Sub 因為可用變量替代編號,所以 Cells 屬性非常適合于在單元格區域中循環,如下例中所示。Sub CycleThrough()Dim Counter As Integer For Counter = 1 To 20 Worksheets(“Sheet1”).Cells(Counter, 3).Value = Counter Next Counter End Sub 如果要同時更改某個區域中所有單元格的屬性(或將方法應用于該區域中的所有單元格),建議使用 Range 屬性。使用快捷表示法引用單元格
可用方括號將 A1 引用樣式或命名區域括起來,作為 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號了,如下例中所示。Sub ClearRange()Worksheets(“Sheet1”).[A1:B5].ClearContents End Sub
第二篇:VBA代碼中引用Excel工作表中單元格區域的方式小結
VBA代碼中引用Excel工作表中單元格區域的方式小結.txt大人物的悲哀在于他們需要不停地做出選擇;而小人物的悲哀在于他們從來沒有選擇的機會。男人因滄桑而成熟,女人因成熟而滄桑。男人有了煙,有了酒,也就有了故事;女人有了錢,有了資色,也就有了悲劇。在VBA代碼中引用Excel工作表中單元格區域的方式小結
問題一:在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)
------------------問題二:在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屬性示例》一文。
------------------問題九:在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屬性等的組合。
找到最后一行的一些方法探討 使用End屬性
在ExcelVBA中,使用End(xlUp)查找最后一行是最常使用且最為簡單的方法,它假設要有一列總包含有數據(數字、文本和公式等),并且在該列中最后輸入數據的單元格的下一行不會包含數據,因此不必擔心會覆蓋掉已有數據。但該方法有兩個缺點:(1)僅局限于查找指定列的最后一行。
(2)如果該列中最后一行被隱藏,那么該隱藏行將被視作最后一行。因此,在最后一行被隱藏時,其數據可能會被覆蓋。但該列中間的隱藏行不會影響查找的結果。[示例代碼01] Sub EndxlUp_OneColLastRow()If Range(“A” & Rows.Count).End(xlUp)= Empty Then GoTo Finish '獲取最后一行
MsgBox “最后一行是第” & Range(“A” & Rows.Count).End(xlUp).Row & “行.” Exit Sub Finish: MsgBox “沒有發現公式或數據!” End Sub [示例代碼02] Sub NextRowInColumnUsedAsSub()'包含所有數據和公式,忽略隱藏的最后一行
Range(“A” & Range(“A” & Rows.Count).End(xlUp).Row + 1).Select End Sub [示例代碼03] Sub NextRowInColumnUsedAsFunction()'包含所有數據和公式,忽略隱藏的最后一行
Range(“A” & LastRowInColumn(“A”)+ 1).Select End Sub '-------Public Function LastRowInColumn(Column As String)As Long LastRowInColumn = Range(Column & Rows.Count).End(xlUp).Row End Function 注意,要輸入新數據的列可能與我們所查找最后一行時所使用的列不同,例如,在上例中,我們可以修改為在B列中查找該列的最后一行,而在A列相應行的下一行中輸入新的數據。
------------------使用Find方法
Find方法在當前工作有數據中進行查找,不需要指定列,也可以確保不會意外地覆蓋掉已有數據。其中,參數LookIn指定所查找的類型,有三個常量可供選擇,即xlValues、xlFormulas和xlComments。
(1)常量xlFormulas將包含零值的單元格作為有數據的單元格。(當設置零值不顯示時,該單元格看起來為空,但該參數仍將該單元格視為有數據的單元格)(2)常量xlValues將包含零值的單元格(如果設置零值不顯示時)作為空白單元格,此時,若該單元格在最后一行,則Find方法會認為該單元格所在的行為空行,因此,該單元格中的內容可能會被新數據所覆蓋。
[注:在Excel中,選擇菜單“工具”——“選項”,在打開的“選項”對話框中,選擇“視圖”選項卡,將其中的“零值”前的復選框取消選中,則工作表中的零值都不會顯示] 如果在參數LookIn中使用常量xlValues的話,還存在一個問題是:如果您將最后一行隱藏,則Find方法會認為倒數第二行是最后一行,此時您在最后一行的下一行輸入數據,則會將實際的最后一行的數據覆蓋。
您可以在隱藏最后一行與不隱藏最后一行,或者是最后一行顯示零值與不顯示零值時,運行下面的示例代碼04,看看所得的結果有什么不同。[示例代碼04] Sub Find_LastRowxlValues()On Error GoTo Finish '獲取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlValues, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “沒有發現數值!” End Sub 因此,在使用Find方法時,您應該考慮所選參數設置的常量,以及工作表最后一行是否有可能被隱藏或不顯示零值。如果您忽視這些情況,很可能得不到您想要的結果,或者是覆蓋掉已有數據。使用常量xlFormulas可以避免這個問題,如下面的示例代碼05所示。[示例代碼05] Sub Find_LastRowxlFormulas()On Error GoTo Finish '獲取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlFormulas, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “沒發現數值或公式!” End Sub 下面再列舉幾個示例代碼。[示例代碼06] Sub NextRowUsedAsSub()'選取最后一行的下一行 Range(“A” & Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row + 1).Select End Sub [示例代碼07] Sub NextRowUsedAsFunction()'選取最后一行的下一行(調用函數)Range(“A” & LastRow + 1).Select End Sub '-------Public Function LastRow()As Long '本代碼包含隱藏行
'使用常量xlFormulas,因為常量xlValues會忽略隱藏的最后一行 LastRow = Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row End Function 注:Find方法中,參數LookIn的默認值為xlFormulas。
------------------使用SpecialCells方法
SpecialCells方法用于查找指定類型的值,其語法為SpecialCells(Type,Value),有兩種主要的使用方式:
(1)若參數Type僅考慮常量,則在查找時會忽略和覆蓋由公式生成的任何數據,如示例代碼08所示。
(2)若參數Type僅考慮由公式生成的數據,則在查找時會忽略和覆蓋任何常量數據,如示例代碼09所示。如果參數Type是xlCellTypeConstants或者是xlCellTypeFormulas,則Value參數可使用常量決定哪種類型的單元格將被包含在結果中,這些常量值能組合而返回多個類型,其缺省設置是選擇所有的常量或公式,而不管是何類型,可使用下面四個可選的常量: 1)xlTextValues(包含文本);2)xlNumbers(包含數字);3)xlErrors(包含錯誤值);4)xlLogical(包含邏輯值)自已在工作表輸入一些含有數值和公式的數據,隱藏或不隱藏最后一行或公式所在的行,先體驗下面的兩段示例代碼。[示例代碼08] '當最后一行為公式或隱藏了最后行時,會忽略,即認為倒數第二行為最后一行 Sub NextConstantRowFunction()Range(“A” & LastConstantRow(True, True, True, True)+ 1).Select End Sub '------Public Function LastConstantRow(Optional IncludeText As Boolean, _ Optional IncludeNumbers As Boolean, _ Optional IncludeErrors As Boolean, _ Optional IncludeLogicals As Boolean)As Long Dim Text As Long, Numbers As Long, Errors As Long Dim Logical As Long, AllTypes As Long If IncludeText Then Text = xlTextValues Else Text = 0 If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0 If IncludeErrors Then Errors = xlErrors Else Errors = 0 If IncludeLogicals Then Logical = xlLogical Else Logical = 0 AllTypes = Text + Numbers + Errors + Logical On Error GoTo Finish LastConstantRow = Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, “$”)_(UBound(Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, “$”)))Exit Function Finish: MsgBox “沒有發現數據!” End Function [示例代碼09] '查找含有公式的單元格所在的行,忽略該行以后的常量和隱藏的行 Sub NextFormulaRowFunction()Range(“A” & LastFormulaRow(True, True, True, True)+ 1).Select End Sub '-------Public Function LastFormulaRow(Optional IncludeText As Boolean, _ Optional IncludeNumbers As Boolean, _ Optional IncludeErrors As Boolean, _ Optional IncludeLogicals As Boolean)As Long Dim Text As Long, Numbers As Long, Errors As Long Dim Logical As Long, AllTypes As Long If IncludeText Then Text = xlTextValues Else Text = 0 If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0 If IncludeErrors Then Errors = xlErrors Else Errors = 0 If IncludeLogicals Then Logical = xlLogical Else Logical = 0 AllTypes = Text + Numbers + Errors + Logical On Error GoTo Finish LastFormulaRow = Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, “$”)_(UBound(Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, “$”)))Exit Function Finish: MsgBox “沒有發現數據!” End Function 下面的示例代碼10忽略最后一行帶有公式的單元格,即當最后一行的單元格中含有公式時,將倒數第二行作為最后一行,即只考慮直接輸入到工作表中的數據。當最后一行沒有公式但被隱藏時,并不影響該方法的判斷。[示例代碼10] Sub SpecialCells_LastRowxlCellTypeConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants).EntireRow).EntireRow '獲取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “沒有發現數據!” End Sub 注:因為上述代碼使用了’Split’函數,故只適合于Office2000及以上的版本。該方法也允許我們指定單個數據類型,諸如數字數據或文本數據,如下所示。
下面,我們查找的最后一行是僅在行中有數字(而不包含公式)的單元格的最后一行。[示例代碼11] Sub SpecialCells_LastRowxlCellTypeNumberConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants, xlNumbers).EntireRow)'獲取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “沒有發現數據!” End Sub 下面,我們查找的最后一行是僅在行中有文本(而不包含公式)的單元格的最后一行。[示例代碼12] Sub SpecialCells_LastRowxlCellTypeTextConstants()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow)'獲取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “沒有發現數據!” End Sub 下面,我們查找的最后一行是僅在行中有公式的單元格的最后一行。[示例代碼13] Sub SpecialCells_LastRowxlCellTypeFormulas()Dim MyRow As Range On Error GoTo Finish Set MyRow = Intersect([A:A], Cells._ SpecialCells(xlCellTypeFormulas).EntireRow).EntireRow '獲取最后一行
MsgBox “最后一行是第” & Split(MyRow.Address, “$”)_(UBound(Split(MyRow.Address, “$”)))& “行” Set MyRow = Nothing Exit Sub Finish: MsgBox “沒有發現數據!” End Sub 同上面所講述的一樣,我們也能使用SpecailCells方法去找到其它特定類型的單元格所在的最后一行,下面是這些常量的一個完整的列表:
XlCellTypeAllFormatConditions(任何格式的單元格)XlCellTypeAllValidation(帶有數據有效性的單元格)XlCellTypeBlanks(所使用區域中的空白單元格)XlCellTypeComments(包含有批注的單元格)XlCellTypeConstants(包含有常量的單元格)XlCellTypeFormulas(包含有公式的單元格)XlCellTypeLastCell(已使用區域中的最后一個單元格(看下面))XlCellTypeSameFormatConditions(有相同格式的單元格)XlCellTypeSameValidation(有相同數據有效性條件的單元格)XlCellTypeVisible(工作表中所有可見的單元格)
第三篇:在VBA代碼中引用Excel工作表中單元格區域的方式小結
在VBA代碼中引用Excel工作表中單元格區域的方式小結
-----------------Public Function LastUsedRow()As Long LastUsedRow = Cells.SpecialCells(xlCellTypeLastCell).Row End Function 使用這里介紹的兩種技術時,您一定要清楚工作表當前的狀態,以找到正確的最后一行。
------------------使用CurrentRegion屬性
CurrentRegion屬性返回代表單元格所在的當前區域,即四周有空行的獨立區域,因此,可使用此屬性查找當前區域的最后一行。但是使用其查找最后一行的一個缺點是,必須首先選取當前區域,然后進行查找。
------------------小結
正如開始所講述的一樣,使用各種方法來查找最后一行都有其優缺點,并且都能找到您想要的最后一行,關鍵是您要了解各種方法的特性,以及工作表的狀態,以便于選擇所使用的方法來找到您需要的最后一行。
上述內容可能有不準確的地方,也可能有遺漏之處,您也可以在調試中體會和改進。
使用 Visual Basic 的普通任務是指定單元格或單元格區域,然后對該單元格或單元格區域進行一些操作,如輸入公式或更改格式。
通常用一條語句就能完成操作,該語句可標識單元格,還可更改某個屬性或應用某個方法。
在 Visual Basic 中,Range 對象既可表示單個單元格,也可表示單元格區域。下列主題說明了標識和處理 Range 對象最常用的方法。
用 A1 樣式記號引用單元格和單元格區域
可使用 Range 屬性來引用 A1 引用樣式中的單元格或單元格區域。下述子程序將單元格區域 A1:D5 的字體設置為加粗。
Sub FormatRange()Workbooks(“Book1”).Sheets(“Sheet1”).Range(“A1:D5”)_.Font.Bold = True End Sub
下表演示了使用 Range 屬性的一些 A1 樣式引用。
引用
含義
Range(“A1”)單元格 A1
Range(“A1:B5”)從單元格 A1 到單元格 B5 的區域
Range(“C5:D9,G9:H16”)多塊選定區域
Range(“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、C 和 F 列
用編號引用單元格
通過使用行列編號,可用 Cells 屬性來引用單個單元格。該屬性返回代表單個單元格的 Range 對象。下例中,Cells(6,1)返回 Sheet1 上的單元格 A6,然后將 Value 屬性設置為 10。Sub EnterValue()Worksheets(“Sheet1”).Cells(6, 1).Value = 10 End Sub 因為可用變量替代編號,所以 Cells 屬性非常適合于在單元格區域中循環,如下例所示。
Sub CycleThrough()Dim Counter As Integer For Counter = 1 To 20 Worksheets(“Sheet1”).Cells(Counter, 3).Value = Counter Next Counter End Sub 注意 如果要同時更改某一單元格區域中所有單元格的屬性或對其應用方法,可使用 Range 屬性。有關詳細信息,請參閱用 A1 樣式記號引用單元格。
引用行和列
可用 Rows 屬性或 Columns 屬性來處理整行或整列。這兩個屬性返回代表單元格區域的 Range 對象。下例中,用 Rows(1)返回 Sheet1 上的第一行,然后將單元格區域的 Font 對象的 Bold 屬性設置為 True。
Sub RowBold()Worksheets(“Sheet1”).Rows(1).Font.Bold = True End Sub 下表舉例說明了使用 Rows 和 Columns 屬性的一些行和列的引用。
引用
含義
Rows(1)第一行
Rows 工作表上所有的行
Columns(1)第一列
Columns(“A”)第一列
Columns 工作表上所有的列
若要同時處理若干行或列,請創建一個對象變量并使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個調用組合起來。下例將活動工作簿中第一張工作表上的第一行、第三行和第五行的字體設置為加粗。Sub SeveralRows()Worksheets(“Sheet1”).Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5))myUnion.Font.Bold = True End Sub 用快捷記號引用單元格
可用方括號將 A1 引用樣式或命名區域括起來,作為 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號,如下例所示。
Sub ClearRange()Worksheets(“Sheet1”).[A1:B5].ClearContents End Sub Sub SetValue()[MyRange].Value = 30 End Sub 引用命名區域
用名稱比用 A1 樣式記號更容易標識單元格區域。若要命名選定的單元格區域,請單擊編輯欄左端的名稱框,鍵入名稱,再按 Enter。
引用命名區域
下例引用了名為“MyBook.xls”的工作簿中的名為“MyRange”的單元格區域。
Sub FormatRange()Range(“MyBook.xls!MyRange”).Font.Italic = True End Sub 下例引用名為“Report.xls”的工作簿中的特定工作表單元格區域“Sheet1!Sales”。
Sub FormatSales()Range(“[Report.xls]Sheet1!Sales”).BorderAround Weight:=xlthin End Sub 若要選定命名區域,請用 GoTo 方法,該方法將激活工作簿和工作表,然后選定該區域。
Sub ClearRange()Application.Goto Reference:=“MyBook.xls!MyRange” Selection.ClearContents End Sub 下例顯示對于活動工作簿將如何編寫相同的過程。
Sub ClearRange()Application.Goto Reference:=“MyRange” Selection.ClearContents End Sub 在命名區域中的單元格上循環
下例用 For Each...Next 循環語句在命名區域中的每一個單元格上循環。如果該區域中的任一單元格的值超過 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 相對于其他單元格來引用單元格
處理相對于另一個單元格的某一單元格的常用方法是使用 Offset 屬性。下例中,將位于活動工作表上活動單元格下一行和右邊三列的單元格的內容設置為雙下劃線格式。
Sub Underline()ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub 注意 可錄制使用 Offset 屬性(而不是絕對引用)的宏。在“工具”菜單上,指向“宏”,再單擊“錄制新宏”,然后單擊“確定”,再單擊錄制宏工具欄上的“相對引用”按鈕。
若要在單元格區域中循環,請在循環中將變量與 Cells 屬性一起使用。下例以 5 為步長,用 5 到 100 之間的值填充第三列的前 20 個單元格。變量 counter 用作 Cells 屬性的行號。
Sub CycleThrough()Dim counter As Integer For counter = 1 To 20 Worksheets(“Sheet1”).Cells(counter, 3).Value = counter * 5 Next counter End Sub 用 Range 對象引用單元格
如果將對象變量設置為 Range 對象,即可用變量名方便地操作單元格區域。
下述過程創建了對象變量 myRange,然后將活動工作簿中 Sheet1 上的單元格區域 A1:D5 賦予該變量。隨后的語句用該變量代替該區域對象,以修改該區域的屬性。
Sub Random()Dim myRange As Range Set myRange = Worksheets(“Sheet1”).Range(“A1:D5”)myRange.Formula = “=RAND()” myRange.Font.Bold = True End Sub 引用工作表上的所有單元格
如果對工作表應用 Cells 屬性時不指定編號,該屬性將返回代表工作表上所有單元格的 Range 對象。下述 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內容。
Sub ClearSheet()Worksheets(“Sheet1”).Cells.ClearContents End Sub 引用多個單元格區域
使用適當的方法可以很容易地同時引用多個單元格區域。可用 Range 和 Union 方法引用任意組合的單元格區域;用 Areas 屬性可引用工作表上選定的一組單元格區域。
使用 Range 屬性
通過在兩個或多個引用之間放置逗號,可使用 Range 屬性來引用多個單元格區域。下例清除了 Sheet1 上三個單元格區域的內容。
Sub ClearRanges()Worksheets(“Sheet1”).Range(“C5:D9,G9:H16,B14:D18”)._ ClearContents End Sub 命名區域使得用 Range 屬性處理多個單元格區域更為容易。下例可在三個命名區域處于同一工作表時運行。
Sub ClearNamed()Range(“MyRange, YourRange, HisRange”).ClearContents End Sub 使用 Union 方法
用 Union 方法可將多個單元格區域組合到一個 Range 對象中。下例創建了名為 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 使用 Areas 屬性
可用 Areas 屬性引用選定的單元格區域或多塊選定區域中的區域集合。下述過程計算選定區域中的塊數目,如果有多個塊,就顯示一則警告消息。Sub FindMultiple()If Selection.Areas.Count > 1 Then MsgBox “Cannot do this to a multiple selection.” End If End Sub 在VBA代碼中引用Excel工作表中單元格區域的方式小結 2007年07月12日 星期四 上午 09:37 在VBA代碼中引用Excel工作表中單元格區域的方式小結
分類:ExcelVBA>>ExcelVBA對象模型編程>>常用對象>>Range對象
在 使用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屬性示例》一文。
問題九:在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屬性等的組合。MsgBox 函數
作用:在對話框中顯示消息,等待用戶單擊按鈕,并返回一個 Integer 告訴用戶單擊哪一個按鈕。語法:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])參數說明:
MsgBox 函數的語法具有以下幾個命名參數:
Prompt-------必需的。字符串表達式,作為顯示在對話框中的消息。prompt 的最大長度大約為 1024 個字符,由所用字符的寬度決定。如果 prompt 的內容超過一行,則可以在每一行之間用回車符(Chr(13))、換行符(Chr(10))或是回車與換行符的組合(Chr(13)& Chr(10))將各行分隔開來。
Buttons-------可選的。數值表達式是值的總和,指定顯示按鈕的數目及形式,使用的圖標樣式,缺省按鈕是什么以及消息框的強制回應等。如果省略,則 buttons 的缺省值為 0。Title-------可選的。在對話框標題欄中顯示的字符串表達式。如果省略 title,則將應用程序名放在標題欄中。
Helpfile--------可選的。字符串表達式,識別用來向對話框提供上下文相關幫助的幫助文件。如果提供了 helpfile,則也必須提供 context。
Context-------可選的。數值表達式,由幫助文件的作者指定給適當的幫助主題的幫助上下文編號。如果提供了 context,則也必須提供 helpfile。
用于MsgBox函數中Button參數的常量 常量 值 說明 vbOKOnly 0 只顯示“確定”按鈕
VbOKCancel 1 顯示“確定”和“取消”按鈕
VbAbortRetryIgnore 2 顯示“終止”、“重試”和“忽略” 按鈕 VbYesNoCancel 3 顯示“是”、“否”和“取消”按鈕 VbYesNo 4 顯示“是”和“否”按鈕 VbRetryCancel 5 顯示“重試”和“取消”按鈕 VbCritical 16 顯示“關鍵信息”圖標 VbQuestion 32 顯示“警告詢問”圖標 VbExclamation 48 顯示“警告消息”圖標 VbInformation 64 顯示“通知消息”圖標
vbDefaultButton1 0 第一個按鈕是缺省值(缺省設置)vbDefaultButton2 256第二個按鈕是缺省值 vbDefaultButton3 512第三個按鈕是缺省值 vbDefaultButton4 768第四個按鈕是缺省值
vbApplicationModal 0應用程序強制返回;應用程序一直被掛起,直到用戶對消息框 作出響應才繼續工作
vbSystemModal 4096系統強制返回;全部應用程序都被掛起,直到用戶對消息框作 出響應才繼續工作
vbMsgBoxHelpButton 16384將Help按鈕添加到消息框 VbMsgBoxSetForeground 65536指定消息框窗口作為前景窗口 vbMsgBoxRight 524288文本為右對齊
vbMsgBoxRtlReading 1048576指定文本應為在希伯來和阿拉伯語系統中的從右到左顯示 說明:
(1)第一組值(0–5)描述了消息框中顯示的按鈕的類型與數目;第二組值(16,32,48,64)描述了圖標的樣式;第三組值(0,256,512,768)說明哪一個按鈕是缺省值;而第四組值(0,4096)則決定消息框的強制返回性。將這些數字相加以生成Buttons參數值的時候,只能由每組值取用一個數字。(2)這些常數都是 Visual Basic for Applications(VBA)指定的。結果,可以在程序代碼中到處使用這些常數名稱,而不必使用實際數值。實際數值與常數名稱是等價的。返回值
用于MsgBox函數返回值的常量 常數 值 說明 vbOK 1 確定 vbCancel 2 取消 vbAbort 3 終止 vbRetry 4 重試 vbIgnore 5 忽略 vbYes 6 是 vbNo 7 否
(1)如果同時提供了Helpfile與Context參數,可以按F1鍵來查看與Context相應的幫助主題,Excel通常會在輸入框中自動添加一個幫助(Help)按鈕。
(2)若在消息框中顯示“取消”按鈕,則按下ESC鍵與單擊“取消”按鈕效果相同。若消息框中有“幫助”按鈕,則提供相關的幫助信息。
(3)如果要輸入多個參數并省略中間的某些參數,則必須在相應位置加入逗號分界符。示例
(1)(1)使用 MsgBox 函數,在具有“是”及“否”按鈕的對話框中顯示一條嚴重錯誤信息。示例中的缺省按鈕為“否”,MsgBox函數的返回值視用戶按哪一個鈕而定。并假設DEMO.HLP為一幫助文件,其中有一個幫助主題代碼為1000。
Dim Msg,Style,Title,Help,Ctxt,Response,MyString Msg=“Do you want to continue ?” ’定義消息文本
Style = vbYesNo + vbCritical + vbDefaultButton2 ' 定義按鈕 Title = “MsgBox Demonstration” ' 定義標題文本 Help = “DEMO.HLP” ' 定義幫助文件 Ctxt = 1000 ' 定義幫助主題
Response = MsgBox(Msg, Style, Title, Help, Ctxt)If Response = vbYes Then ' 用戶按下“是” MyString = “Yes” ' 完成某操作 Else ' 用戶按下“否”
MyString = “No” ' 完成某操作 End If(2)只顯示某消息 MsgBox “Hello!”
(3)將消息框返回的結果賦值給變量 Ans=MsgBox(“Continue?”,vbYesNo)
If MsgBox(“Continue?”,vbYesNo)<>vbYes Then Exit Sub(4)使用常量的組合,賦值組Config變量,并設置第二個按鈕為缺省按鈕 Config=vbYesNo+vbQuestion+vbDefaultButton2(5)若要在消息中強制換行,可在文本中使用vbCrLf(或vbNewLine)常量,用&加空格與字符隔開。如
MsgBox “This is the first line.” & vbNewLine & “Second line.”
(6)可以在消息框中使用vbTab常量插入一個制表符。下面的過程使用一個消息框來顯示5×5單元格區域中的所有值,用vbTab常量分隔列并使用vbCrLf常量插入一個新行。注意在MsgBox函數最多只顯示1024個字符,因此限制了可顯示的單元格數。Option Explicit Sub ShowRangeValue()Dim Msg As String Dim r As Integer, c As Integer Msg = “" For r = 1 To 5 For c = 1 To 5 Msg = Msg & Cells(r, c)& vbTab Next c Msg = Msg & vbCrLf Next r MsgBox Msg End Sub(7)在消息框語句中運用工作表函數以及設置顯示的數置格式,如下面語句所示:
MsgBox ” selection has “ & m & ” cells.“ & Chr(13)& ” the sum is :“ & Application.WorksheetFunction.Sum(Selection)& Chr(13)& ”the average is :“ & Format(Application.WorksheetFunction.Average(Selection), ”#,##0.00“), vbInformation, ”selection count & sum & average" & Chr(13)
第四篇:vba單元格區域引用方式的小結
vba單元格區域引用方式的小結
在使用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屬性等的組合。文章標簽: ExcelVBA引用單元格
第五篇:在Word文檔中引用Excel工作表
在Word文檔中引用Excel工作表數據
用戶在使用Word編輯文檔的過程中,往往會用到大量的數據。尤其在一些諸如技術方案、技術總結等類型的文章中,文章中的同一組數據可能要反復使用很多次。有些數據還可能來自于Excel工作表,甚至整個表格都由Excel復制而來。對于這些數據的輸入工作,大多數用戶會采取直接輸入或復制粘貼的方法。通過這樣的方法輸入的數據在Word文檔中是死板的數據,一旦實際數據調整變更,Word文檔中的所有數據需要重新輸入,為用戶帶來很大的工作量。如果借助Word 2003“編輯”菜單中的“選擇性粘貼”命令,用戶可以非常靈活地在Excel工作表中的數據。方法1:當整個表格來源于Excel工作表時,首先在Excel工作表中選中需要Word文檔中引用的數據區域,并執行復制操作。然后運行“編輯”→“選擇性粘貼”菜單命令,打開“選擇性粘貼”對話框。在“形式”列表中選中“Microsoft Office Excel工作表 對象”選項,并單擊“確定”按鈕。通過這種方式引用的Excel數據可以使用Excel編輯數據,方法2:當Word文檔中的數據來源于Excel工作表中的某個單元格時,可以首先在Excel工作表中復制該單元格,然后在Word文檔中依次單擊“編輯”→“選擇性粘貼”菜單命令,打開“選擇性粘貼”對話框。在“形式”列表中選中“無格式文本”選項,并單擊“確定”按鈕。這樣操作可以既保持與數據源的鏈接,又能與Word文檔格式融為一體。如果數據源有格式特別是有上下標時,可以選擇“帶格式文本(RTF)”選項,方法3:如果需要在Word文檔中對同一數據進行反復引用,可以把其中一個數據作為數據源,然后通過選擇性粘貼為鏈接的方式在其他未知對該數據進行引用。鏈接的方式可以選擇“帶格式文本(RTF)”、“HTML格式”和“無格式文本”,其中“無格式文本”可以使粘貼后內容的格式與Word文檔格式保持一致;另外兩種形式則保持原有格式。需要注意的是,在編輯修改數據源時不能選擇全部數據后再修改,而必須把光標定位到數據源中間再輸入新數據,并刪除原來的數據,否則選擇性粘貼的數據不能被更新。