使用VBA的常見任務(wù)是指定單元格或單元格區(qū)域,然后對該單元格或單元格區(qū)域進(jìn)行一些操作,如輸入公式或更改格式。通常用一條語句就能完成操作,該語句可標(biāo)識單元格,還可更改某個屬性或應(yīng)用某個方法。本文是《 在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)》一文的補(bǔ)充,參考了msdn文檔庫和Excel 2007 VBA幫助系統(tǒng)。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 目錄 如何選擇當(dāng)前工作表中的單元格? 如何選擇同一工作簿中其它工作表上的單元格? 如何選擇不同工作簿中的單元格? 如何選擇當(dāng)前工作表中的單元格區(qū)域? 如何選擇同一工作簿中另一工作表上的單元格區(qū)域? 如何選擇不同工作簿中工作表上的單元格區(qū)域? 如何在當(dāng)前工作表中選擇命名區(qū)域? 如何選擇同一工作簿中另一工作表上的命名區(qū)域? 如何選擇不同工作簿中工作表上的命名區(qū)域? 如何選擇與當(dāng)前單元格相關(guān)的單元格? 如何選擇與另一單元格(不是當(dāng)前單元格)相關(guān)的單元格? 如何選擇偏離指定區(qū)域的一個單元格區(qū)域? 如何選擇一個指定的區(qū)域并擴(kuò)展區(qū)域的大??? 如何選擇一個指定的區(qū)域,再偏離,然后擴(kuò)展區(qū)域的大小? 如何選擇兩個或多個指定區(qū)域? 如何選擇兩個或多個指定區(qū)域的交叉區(qū)域? 如何選擇連續(xù)數(shù)據(jù)列中的最后一個單元格? 如何選擇連續(xù)數(shù)據(jù)列底部的空單元格? 如何選擇某列中連續(xù)數(shù)據(jù)單元格區(qū)域? 如何選擇某列中非連續(xù)數(shù)據(jù)單元格區(qū)域? 如何選擇一個矩形(規(guī)則的)單元格區(qū)域? 如何選擇多個不同長度的非連續(xù)列? 引用工作表上的所有單元格 使用 A1 表示法引用單元格和區(qū)域 引用行和列 使用索引號引用單元格 使用快捷表示法引用單元格 使用 Range 對象引用單元格 引用命名區(qū)域 引用多個區(qū)域 處理三維區(qū)域 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 如何選擇當(dāng)前工作表中的單元格? 例如,可以使用下面的代碼選擇當(dāng)前工作表中的單元格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 如何選擇當(dāng)前工作表中的單元格區(qū)域? 例如,要選擇當(dāng)前工作表中的單元格區(qū)域C2:D10,可以使用下面的代碼: ActiveSheet.Range(Cells(2, 3), Cells(10, 4)).Select 或:ActiveSheet.Range("C2:D10").Select 或:ActiveSheet.Range("C2", "D10").Select 如何選擇同一工作簿中另一工作表上的單元格區(qū)域? 例如,要選擇同一工作簿中另一工作表上的單元格區(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ū)域? 例如,要選擇另一工作簿中某工作表上的單元格區(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 如何在當(dāng)前工作表中選擇命名區(qū)域? 例如,要選擇當(dāng)前工作表中名為“Test”的區(qū)域,可以使用下面的代碼: Range("Test").Select 或:Application.Goto "Test" 如何選擇同一工作簿中另一工作表上的命名區(qū)域? 例如,選擇同一工作簿中另一工作表上名為“Test”的區(qū)域,可使用下面的代碼: Application.Goto Sheets("Sheet1").Range("Test") 也可以先激活工作表,再選擇: Sheets("Sheet1").Activate Range("Test").Select 如何選擇不同工作簿中工作表上的命名區(qū)域? 例如,要選擇不同工作簿中工作表上名為“Test”的區(qū)域,可使用下面的代碼: Application.Goto Workbooks("BOOK2.XLS").Sheets("Sheet2").Range("Test") 也可以先激活工作表,再選擇: Workbooks("BOOK2.XLS").Sheets("Sheet2").Activate Range("Test").Select 如何選擇與當(dāng)前單元格相關(guān)的單元格? 例如,要選擇距當(dāng)前單元格下面5行左側(cè)4列的單元格,可以使用下面的代碼: ActiveCell.Offset(5, -4).Select 要選擇距當(dāng)前單元格上方2行右側(cè)3列的單元格,可以使用下面的代碼: ActiveCell.Offset(-2, 3).Select 注意:一定要保證當(dāng)前單元格與所選單元格之間的距離在工作表范圍內(nèi),否則會出錯。 如何選擇與另一單元格(不是當(dāng)前單元格)相關(guān)的單元格? 例如,要選擇距單元格C7下方5行右側(cè)4列的單元格,可以使用下面的代碼: ActiveSheet.Cells(7, 3).Offset(5, 4).Select 或:ActiveSheet.Range("C7").Offset(5, 4).Select 如何選擇偏離指定區(qū)域的一個單元格區(qū)域? 例如,要選擇與名為“Test”的區(qū)域大小相同但在該區(qū)域下方4行右側(cè)3列的一個區(qū)域,可以使用下面的代碼: ActiveSheet.Range("Test").Offset(4, 3).Select 如果該命名區(qū)域不在當(dāng)前工作表中,可以先激活該工作表,然后再選擇,如下面的代碼: Sheets("Sheet3").Activate ActiveSheet.Range("Test").Offset(4, 3).Select 如何選擇一個指定的區(qū)域并擴(kuò)展區(qū)域的大小? 例如,要選擇當(dāng)前工作表中名為“Database”區(qū)域,然后將該區(qū)域向下擴(kuò)展5行,可以使用下面的代碼: Range("Database").Select Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count).Select 如何選擇一個指定的區(qū)域,再偏離,然后擴(kuò)展區(qū)域的大??? 例如,選擇名為“Database”區(qū)域下方4行右側(cè)3列的一個區(qū)域,然后擴(kuò)展2行和1列,可以使用下面的代碼: Range("Database").Select Selection.Offset(4, 3).Resize(Selection.Rows.Count + 2, Selection.Columns.Count + 1).Select 如何選擇兩個或多個指定區(qū)域? 例如,為了同時選擇名為“Test”和“Sample”的兩個區(qū)域,可以使用下面的代碼: Application.Union(Range("Test"), Range("Sample")).Select 注意,這兩個區(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")) 將會出錯。 如何選擇兩個或多個指定區(qū)域的交叉區(qū)域?
例如,要選擇名為“Test”和“Sample”的兩個區(qū)域的交叉區(qū)域,可以使用下面的代碼: Application.Intersect(Range("Test"), Range("Sample")).Select 注意,兩個區(qū)域必須在同一工作表中。 = = = = = = = = = = = = = = = = = = = = = = = = =
下面的示例使用了如下圖所示的工作表。 如何選擇連續(xù)數(shù)據(jù)列中的最后一個單元格?例如,要選擇一個連續(xù)列中的最后一個單元格,可以使用下面的代碼: ActiveSheet.Range("a1").End(xlDown).Select 該代碼使用在上面的工作表中,單元格A4被選擇。 如何選擇連續(xù)數(shù)據(jù)列底部的空單元格?
例如,要選擇連續(xù)單元格區(qū)域下面的單元格,可以使用下面的代碼: ActiveSheet.Range("a1").End(xlDown).Offset(1, 0).Select 該代碼使用在上面的工作表中,單元格A5被選擇。 如何選擇某列中連續(xù)數(shù)據(jù)單元格區(qū)域?
例如,要選擇一列中的連續(xù)數(shù)據(jù)單元格區(qū)域,可以使用下面的代碼: ActiveSheet.Range("a1", ActiveSheet.Range("a1").End(xlDown)).Select 或:ActiveSheet.Range("a1:" & ActiveSheet.Range("a1").End(xlDown).Address).Select 該代碼使用在上面的工作表中,單元格區(qū)域A1:A4將被選擇。 如何選擇某列中非連續(xù)數(shù)據(jù)單元格區(qū)域?例如,要選擇某列中非連續(xù)數(shù)據(jù)單元格區(qū)域,可以使用下面的代碼: ActiveSheet.Range("a1", ActiveSheet.Range("a65536").End(xlUp)).Select 或:ActiveSheet.Range("a1:" & ActiveSheet.Range("a65536").End(xlUp).Address).Select 該代碼使用在上面的工作表中,單元格區(qū)域A1:A6將被選擇。 如何選擇一個矩形(規(guī)則的)單元格區(qū)域?要選擇圍繞某單元格的一個矩形區(qū)域,可以使用CurrentRegion方法。CurrentRegion方法將選擇四周被空行和空列圍繞的區(qū)域,如下面的代碼: ActiveSheet.Range("a1").CurrentRegion.Select 該代碼使用在上面的工作表中,將選擇單元格區(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 = = = = = = = = = = = = = = = = = = = = 如何選擇多個不同長度的非連續(xù)列?例如,有下圖所示的工作表: 要同時選擇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 = = = = = = = = = = = = = = = = = = = =注:使用Application.Goto方法,如果指定另一工作表(不是當(dāng)前工作表)中的指定區(qū)域,在Range屬性中使用兩個Cells屬性時,則必須包括Sheets對象,如: Application.Goto Sheets("Sheet1").Range(Sheets("Sheet1").Range(Sheets("Sheet1").Cells(2, 3), Sheets("Sheet1").Cells(4, 5))) = = = = = = = = = = = = = = = = = = = =在VBA中,Range 對象既可表示單個單元格,也可表示單元格區(qū)域。下面的內(nèi)容說明了標(biāo)識和處理Range對象最常用的方法。 引用工作表上的所有單元格如果對工作表應(yīng)用 Cells 屬性時不指定索引號,該方法將返回代表工作表上所有單元格的 Range 對象。以下 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內(nèi)容。 Sub ClearSheet() Worksheets("Sheet1").Cells.ClearContents End Sub 使用 A1 表示法引用單元格和區(qū)域可使用 Range 屬性引用 A1 引用樣式中的單元格或單元格區(qū)域。下述子例程將單元格區(qū)域 A1:D5 的字體設(shè)置為加粗。 Sub FormatRange() Workbooks("Book1").Sheets("Sheet1").Range("A1:D5") _ .Font.Bold = True End Sub 下表演示了使用 Range 屬性的一些 A1 樣式引用。 引用 含義 Range("A1") 單元格 A1 Range("A1:B5") 從單元格 A1 到單元格 B5 的區(qū)域 Range("C5:D9,G9:H16") 多塊選定區(qū)域 Range("A:A") A 列 Range("1:1") 第一行 Range("A:C") 從 A 列到 C 列的區(qū)域 Range("1:5") 從第一行到第五行的區(qū)域 Range("1:1,3:3,8:8") 第 1、3 和 8 行 Range("A:A,C:C,F:F") A 、C 和 F 列 引用行和列可用 Rows 屬性或 Columns 屬性來處理整行或整列。這兩個屬性返回代表單元格區(qū)域的 Range 對象。在下例中,Rows(1) 返回 Sheet1 上的第一行,然后將區(qū)域字體加粗。 Sub RowBold() Worksheets("Sheet1").Rows(1).Font.Bold = True End Sub 下表舉例說明了使用 Rows 和 Columns 屬性的一些行和列的引用。 引用 含義 Rows(1) 第一行 Rows 工作表上所有的行 Columns(1) 第一列 Columns("A") 第一列 Columns 工作表上所有的列 若要同時處理若干行或列,可創(chuàng)建一個對象變量并使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個調(diào)用組合起來。下例將活動工作簿中第一張工作表上的第一行、第三行和第五行的字體設(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 使用索引號引用單元格通過使用行列索引號,可用 Cells 屬性引用單個單元格。該屬性返回代表單個單元格的 Range 對象。在下例中,Cells(6,1) 返回 Sheet1 上的單元格 A6,然后將 Value 屬性設(shè)置為 10。 Sub EnterValue() Worksheets("Sheet1").Cells(6, 1).Value = 10 End Sub 因?yàn)榭捎米兞刻娲幪?,所?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 如果要同時更改某個區(qū)域中所有單元格的屬性(或?qū)⒎椒☉?yīng)用于該區(qū)域中的所有單元格),建議使用 Range 屬性。 使用快捷表示法引用單元格可用方括號將 A1 引用樣式或命名區(qū)域括起來,作為 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號了,如下例中所示。 Sub ClearRange() Worksheets("Sheet1").[A1:B5].ClearContents End Sub Sub SetValue() [MyRange].Value = 30 End Sub 使用 Range 對象引用單元格如果將對象變量設(shè)置為 Range 對象,即可用變量名輕松地操作單元格區(qū)域。 以下過程將創(chuàng)建對象變量 myRange,然后將活動工作簿中 Sheet1 上的區(qū)域 A1:D5 賦予該變量。隨后的語句用該變量名稱代替 Range 對象,以修改該區(qū)域的屬性。 Sub Random() Dim myRange As Range Set myRange = Worksheets("Sheet1").Range("A1:D5") myRange.Formula = "=RAND()" myRange.Font.Bold = True End Sub 引用命名區(qū)域用名稱比用 A1 樣式記號更容易標(biāo)識單元格區(qū)域。若要命名選定的單元格區(qū)域,請單擊編輯欄左端的名稱框,鍵入名稱,再按 Enter。 引用命名區(qū)域以下示例引用名為“MyBook.xls”的工作簿中名為“MyRange”的區(qū)域。 Sub FormatRange() Range("MyBook.xls!MyRange").Font.Italic = True End Sub 以下示例引用名為“Report.xls”的工作簿中特定于工作表的區(qū)域“Sheet1!Sales”。 Sub FormatSales() Range("[Report.xls]Sheet1!Sales").BorderAround Weight:=xlthin End Sub 要選定命名區(qū)域,可使用 GoTo 方法,該方法將激活工作簿和工作表,然后選定該區(qū)域。 Sub ClearRange() Application.Goto Reference:="MyBook.xls!MyRange" Selection.ClearContents End Sub 以下示例顯示對于活動工作簿將如何編寫與上例相同的過程。 Sub ClearRange() Application.Goto Reference:="MyRange" Selection.ClearContents End Sub 在命名區(qū)域中的單元格上循環(huán)
下例用 For Each...Next 循環(huán)語句在命名區(qū)域中的每一個單元格上循環(huán)。如果該區(qū)域中的任一單元格的值超過 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 引用多個區(qū)域使用適當(dāng)?shù)姆椒梢院苋菀椎赝瑫r引用多個單元格區(qū)域。可用 Range 和 Union 方法引用任意組合的單元格區(qū)域;用 Areas 屬性可引用工作表上選定的一組單元格區(qū)域。 使用 Range 屬性
通過在兩個或多個引用之間插入逗號,可使用 Range 屬性引用多個區(qū)域。以下示例清除了 Sheet1 上三個區(qū)域的內(nèi)容。 Sub ClearRanges() Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18"). _ ClearContents End Sub 命名區(qū)域使得用 Range 屬性處理多個區(qū)域更加容易。以下示例可在所有這三個命名區(qū)域處于同一工作表時運(yùn)行。 Sub ClearNamed() Range("MyRange, YourRange, HisRange").ClearContents End Sub 使用 Union 方法
使用 Union 方法可將多個區(qū)域組合到一個 Range 對象中。以下示例創(chuàng)建了名為 myMultipleRange 的 Range 對象,并將其定義為區(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 使用 Areas 屬性可用 Areas 屬性引用選定的單元格區(qū)域或多塊選定區(qū)域中的區(qū)域集合。下述過程計算選定區(qū)域中的塊數(shù)目,如果有多個塊,就顯示一則警告消息。 Sub FindMultiple() If Selection.Areas.Count > 1 Then MsgBox "不能對多個選區(qū)進(jìn)行操作." End If End Sub 處理三維區(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ù)傳送到活動工作簿中所有工作表上的相應(yīng)區(qū)域。 Sub FillAll() Worksheets("Sheet2").Range("A1:H1") _ .Borders(xlBottom).LineStyle = xlDouble Worksheets.FillAcrossSheets (Worksheets("Sheet2") _ .Range("A1:H1")) End Sub 分類:ExcelVBA>>ExcelVBA對象模型編程>>常用對象>>Range對象
by fanjy in 2007-2-10 |