第一篇:在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
-----------------Public Function LastUsedRow()As Long LastUsedRow = Cells.SpecialCells(xlCellTypeLastCell).Row End Function 使用這里介紹的兩種技術(shù)時(shí),您一定要清楚工作表當(dāng)前的狀態(tài),以找到正確的最后一行。
------------------使用CurrentRegion屬性
CurrentRegion屬性返回代表單元格所在的當(dāng)前區(qū)域,即四周有空行的獨(dú)立區(qū)域,因此,可使用此屬性查找當(dāng)前區(qū)域的最后一行。但是使用其查找最后一行的一個(gè)缺點(diǎn)是,必須首先選取當(dāng)前區(qū)域,然后進(jìn)行查找。
------------------小結(jié)
正如開始所講述的一樣,使用各種方法來查找最后一行都有其優(yōu)缺點(diǎn),并且都能找到您想要的最后一行,關(guān)鍵是您要了解各種方法的特性,以及工作表的狀態(tài),以便于選擇所使用的方法來找到您需要的最后一行。
上述內(nèi)容可能有不準(zhǔn)確的地方,也可能有遺漏之處,您也可以在調(diào)試中體會和改進(jìn)。
使用 Visual Basic 的普通任務(wù)是指定單元格或單元格區(qū)域,然后對該單元格或單元格區(qū)域進(jìn)行一些操作,如輸入公式或更改格式。
通常用一條語句就能完成操作,該語句可標(biāo)識單元格,還可更改某個(gè)屬性或應(yīng)用某個(gè)方法。
在 Visual Basic 中,Range 對象既可表示單個(gè)單元格,也可表示單元格區(qū)域。下列主題說明了標(biāo)識和處理 Range 對象最常用的方法。
用 A1 樣式記號引用單元格和單元格區(qū)域
可使用 Range 屬性來引用 A1 引用樣式中的單元格或單元格區(qū)域。下述子程序?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 列
用編號引用單元格
通過使用行列編號,可用 Cells 屬性來引用單個(gè)單元格。該屬性返回代表單個(gè)單元格的 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 注意 如果要同時(shí)更改某一單元格區(qū)域中所有單元格的屬性或?qū)ζ鋺?yīng)用方法,可使用 Range 屬性。有關(guān)詳細(xì)信息,請參閱用 A1 樣式記號引用單元格。
引用行和列
可用 Rows 屬性或 Columns 屬性來處理整行或整列。這兩個(gè)屬性返回代表單元格區(qū)域的 Range 對象。下例中,用 Rows(1)返回 Sheet1 上的第一行,然后將單元格區(qū)域的 Font 對象的 Bold 屬性設(shè)置為 True。
Sub RowBold()Worksheets(“Sheet1”).Rows(1).Font.Bold = True End Sub 下表舉例說明了使用 Rows 和 Columns 屬性的一些行和列的引用。
引用
含義
Rows(1)第一行
Rows 工作表上所有的行
Columns(1)第一列
Columns(“A”)第一列
Columns 工作表上所有的列
若要同時(shí)處理若干行或列,請創(chuàng)建一個(gè)對象變量并使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個(gè)調(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 用快捷記號引用單元格
可用方括號將 A1 引用樣式或命名區(qū)域括起來,作為 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號,如下例所示。
Sub ClearRange()Worksheets(“Sheet1”).[A1:B5].ClearContents End Sub Sub SetValue()[MyRange].Value = 30 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ū)域中的每一個(gè)單元格上循環(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 相對于其他單元格來引用單元格
處理相對于另一個(gè)單元格的某一單元格的常用方法是使用 Offset 屬性。下例中,將位于活動工作表上活動單元格下一行和右邊三列的單元格的內(nèi)容設(shè)置為雙下劃線格式。
Sub Underline()ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub 注意 可錄制使用 Offset 屬性(而不是絕對引用)的宏。在“工具”菜單上,指向“宏”,再單擊“錄制新宏”,然后單擊“確定”,再單擊錄制宏工具欄上的“相對引用”按鈕。
若要在單元格區(qū)域中循環(huán),請?jiān)谘h(huán)中將變量與 Cells 屬性一起使用。下例以 5 為步長,用 5 到 100 之間的值填充第三列的前 20 個(gè)單元格。變量 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 對象引用單元格
如果將對象變量設(shè)置為 Range 對象,即可用變量名方便地操作單元格區(qū)域。
下述過程創(chuàng)建了對象變量 myRange,然后將活動工作簿中 Sheet1 上的單元格區(qū)域 A1:D5 賦予該變量。隨后的語句用該變量代替該區(qū)域?qū)ο?,以修改該區(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)用 Cells 屬性時(shí)不指定編號,該屬性將返回代表工作表上所有單元格的 Range 對象。下述 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內(nèi)容。
Sub ClearSheet()Worksheets(“Sheet1”).Cells.ClearContents End Sub 引用多個(gè)單元格區(qū)域
使用適當(dāng)?shù)姆椒梢院苋菀椎赝瑫r(shí)引用多個(gè)單元格區(qū)域??捎?Range 和 Union 方法引用任意組合的單元格區(qū)域;用 Areas 屬性可引用工作表上選定的一組單元格區(qū)域。
使用 Range 屬性
通過在兩個(gè)或多個(gè)引用之間放置逗號,可使用 Range 屬性來引用多個(gè)單元格區(qū)域。下例清除了 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 使用 Union 方法
用 Union 方法可將多個(gè)單元格區(qū)域組合到一個(gè) 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ū)域集合。下述過程計(jì)算選定區(qū)域中的塊數(shù)目,如果有多個(gè)塊,就顯示一則警告消息。Sub FindMultiple()If Selection.Areas.Count > 1 Then MsgBox “Cannot do this to a multiple selection.” End If End Sub 在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié) 2007年07月12日 星期四 上午 09:37 在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
分類:ExcelVBA>>ExcelVBA對象模型編程>>常用對象>>Range對象
在 使用ExcelVBA進(jìn)行編程時(shí),我們通常需要頻繁地引用單元格區(qū)域,然后再使用相應(yīng)的屬性和方法對區(qū)域進(jìn)行操作。所謂單元格區(qū)域,指的是單個(gè)的單元格、或者是由多個(gè)單元格組成的區(qū)域、或者是整行、整列等。下面,我們設(shè)定一些情形,以問答的形式對引用單元格區(qū)域的方式進(jìn)行歸納。
問題一:在VBA代碼中,如何引用當(dāng)前工作表中的單個(gè)單元格(例如引用單元格C3)?
回答:可以使用下面列舉的任一方式對當(dāng)前工作表中的單元格(C3)進(jìn)行引用。(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”)
問題二:在VBA代碼中,我要引用當(dāng)前工作表中的B2:D6單元格區(qū)域,有哪些方式?
回答:可以使用下面列舉的任一方式對當(dāng)前工作表中單元格區(qū)域B2:D6進(jìn)行引用。
(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為當(dāng)前單元格,則可使用語句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若單元格D6為當(dāng)前單元格,則可使用語句:Range(“B2”, ActiveCell)
問題三:在VBA代碼中,如何使用變量實(shí)現(xiàn)對當(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)語句中指定i和j的范圍后,依次獲取相應(yīng)單元格。
問題四:在VBA代碼中,如何擴(kuò)展引用當(dāng)前工作表中的單元格區(qū)域? 回答:可以使用Resize屬性,例如:
(1)ActiveCell.Resize(4, 4),表示自當(dāng)前單元格開始創(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屬性,則只是相對于單元格區(qū)域左上角單元格擴(kuò)展區(qū)域,例如:
代碼Range(“C3:E6”).Resize(, 2),表示單元格區(qū)域C3:D6,并且擴(kuò)展的單元格區(qū)域可不在原單元格區(qū)域內(nèi)。
因此,可以知道Resize屬性是相對于當(dāng)前活動單元格或某單元格區(qū)域中左上角單元格按指定的行數(shù)或列數(shù)擴(kuò)展單元格區(qū)域。
問題五:在VBA代碼中,如何在當(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屬性從所指定的單元格開始按指定的行數(shù)和列數(shù)偏移,從而到達(dá)目的單元格,但偏移的行數(shù)和列數(shù)不包括指定單元格本身。
問題六:在VBA代碼中,如何在當(dāng)前工作表中引用交叉區(qū)域? 回答:可以使用Intersect方法,例如:
Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示單元格區(qū)域D5:E6,即單元格區(qū)域C3:E6與D5:F8相重迭的區(qū)域。
問題七:在VBA代碼中,如何在當(dāng)前工作表中引用多個(gè)區(qū)域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示單元格區(qū)域C3:D4和E5:F6所組成的區(qū)域。
Union方法可以將多個(gè)非連續(xù)區(qū)域連接起來成為一個(gè)區(qū)域,從而可以實(shí)現(xiàn)對多個(gè)非連續(xù)區(qū)域一起進(jìn)行操作。(2)也可以使用下面的代碼:
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ū)域。
問題八:在VBA代碼中,如何引用當(dāng)前工作表中活動單元格或指定單元格所在的區(qū)域(當(dāng)前區(qū)域)?
回答:可以使用CurrentRegion屬性,例如:
(1)ActiveCell.CurrentRegion,表示活動單元格所在的當(dāng)前區(qū)域。(2)Range(“D5”).CurrentRegion,表示單元格D5所在的當(dāng)前區(qū)域。當(dāng)前區(qū)域是指周圍由空行或空列所圍成的區(qū)域。該屬性的詳細(xì)使用參見《CurrentRegion屬性示例》一文。
問題九:在VBA代碼中,如何引用當(dāng)前工作表中已使用的區(qū)域? 回答:可以使用UsedRange屬性,例如:
(1)Activesheet.UsedRange,表示當(dāng)前工作表中已使用的區(qū)域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的區(qū)域。與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區(qū)域,包括顯示為空行,但已進(jìn)行過格式的單元格區(qū)域。該屬性的詳細(xì)使用參見《解析UsedRange屬性》一文。
問題十:如何在單元格區(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)屬性,因此也可以簡寫為: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是開始于區(qū)域中左上角單元格D4起的第2行第2列)。(4)也能使用一個(gè)單個(gè)的索引數(shù)值進(jìn)行引用。計(jì)數(shù)方式為從左向右,即在區(qū)域中的第一行開始從左向右計(jì)數(shù),第一行結(jié)束后,然后從第二行開始從左到右接著計(jì)數(shù),依次 類推。(注:從區(qū)域中第一行第一個(gè)單元格開始計(jì)數(shù),當(dāng)?shù)谝恍薪Y(jié)束時(shí),轉(zhuǎn)入第二行最左邊的單元格,這樣按一行一行從左向右依次計(jì)數(shù)。以單元格區(qū)域中第1個(gè)單 元格開始,按上述規(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è)索引值的方法對遍歷列是有用的,例如,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)與對象變量配合使用時(shí),Item屬性能提供簡潔并有效的代碼,例如: Set rng = Worksheets(1).[a1] 定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個(gè)索引數(shù)值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。(By Chip Pearson)
問題十一:在VBA代碼中,如何引用當(dāng)前工作表中的整行或整列? 回答:見下面的示例代碼:
(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方法對整列或整行進(jìn)行調(diào)整。
問題十二:在VBA代碼中,如何引用當(dāng)前工作表中的所有單元格? 回答:可以使用下面的代碼:
(1)Cells,表示當(dāng)前工作表中的所有單元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
問題十三:在VBA代碼中,如何引用工作表中的特定單元格區(qū)域?
回答:在工作表中,您可能使用過“定位條件”對話框。可以通過選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個(gè)對話框可以允許用戶選擇特定的單元格。例如:(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區(qū)域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當(dāng)前工作表中活動單元格所在區(qū)域中所有空白單元格所組成的區(qū)域。
當(dāng)然,還有很多常量和值的組合,可以讓您實(shí)現(xiàn)特定單元格的查找并引用。參見《探討在工作表中找到最后一行》一文。
問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區(qū)域? 回答:要引用其它工作表或其它工作簿中的單元格區(qū)域,只需在單元格對象前加上相應(yīng)的引用對象即可,例如:(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ù)字來選擇單元格,其計(jì)數(shù)順序?yàn)樽宰笾劣摇纳系较?,又如Cells(257),表示單元格B1。(2)Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯(cuò)誤。
結(jié)語
我們用VBA對Excel進(jìn)行處理,一般是對其工作表中的數(shù)據(jù)進(jìn)行處理,因此,引用單元格區(qū)域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區(qū)域,才能使用相應(yīng)的屬性和方法進(jìn)行下一步的操作。上面列舉了一些引用單元格區(qū)域的情形和方式,可以看出,引用單元格區(qū)域有很多方式,有一些可能不常用,可以根據(jù)工作表的所處的環(huán)境和個(gè)人編程習(xí)慣進(jìn)行選擇使用。
當(dāng)然,在編寫程序時(shí),也可能會將上面的一些屬性聯(lián)合使用,以達(dá)到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。MsgBox 函數(shù)
作用:在對話框中顯示消息,等待用戶單擊按鈕,并返回一個(gè) Integer 告訴用戶單擊哪一個(gè)按鈕。語法:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])參數(shù)說明:
MsgBox 函數(shù)的語法具有以下幾個(gè)命名參數(shù):
Prompt-------必需的。字符串表達(dá)式,作為顯示在對話框中的消息。prompt 的最大長度大約為 1024 個(gè)字符,由所用字符的寬度決定。如果 prompt 的內(nèi)容超過一行,則可以在每一行之間用回車符(Chr(13))、換行符(Chr(10))或是回車與換行符的組合(Chr(13)& Chr(10))將各行分隔開來。
Buttons-------可選的。數(shù)值表達(dá)式是值的總和,指定顯示按鈕的數(shù)目及形式,使用的圖標(biāo)樣式,缺省按鈕是什么以及消息框的強(qiáng)制回應(yīng)等。如果省略,則 buttons 的缺省值為 0。Title-------可選的。在對話框標(biāo)題欄中顯示的字符串表達(dá)式。如果省略 title,則將應(yīng)用程序名放在標(biāo)題欄中。
Helpfile--------可選的。字符串表達(dá)式,識別用來向?qū)υ捒蛱峁┥舷挛南嚓P(guān)幫助的幫助文件。如果提供了 helpfile,則也必須提供 context。
Context-------可選的。數(shù)值表達(dá)式,由幫助文件的作者指定給適當(dāng)?shù)膸椭黝}的幫助上下文編號。如果提供了 context,則也必須提供 helpfile。
用于MsgBox函數(shù)中Button參數(shù)的常量 常量 值 說明 vbOKOnly 0 只顯示“確定”按鈕
VbOKCancel 1 顯示“確定”和“取消”按鈕
VbAbortRetryIgnore 2 顯示“終止”、“重試”和“忽略” 按鈕 VbYesNoCancel 3 顯示“是”、“否”和“取消”按鈕 VbYesNo 4 顯示“是”和“否”按鈕 VbRetryCancel 5 顯示“重試”和“取消”按鈕 VbCritical 16 顯示“關(guān)鍵信息”圖標(biāo) VbQuestion 32 顯示“警告詢問”圖標(biāo) VbExclamation 48 顯示“警告消息”圖標(biāo) VbInformation 64 顯示“通知消息”圖標(biāo)
vbDefaultButton1 0 第一個(gè)按鈕是缺省值(缺省設(shè)置)vbDefaultButton2 256第二個(gè)按鈕是缺省值 vbDefaultButton3 512第三個(gè)按鈕是缺省值 vbDefaultButton4 768第四個(gè)按鈕是缺省值
vbApplicationModal 0應(yīng)用程序強(qiáng)制返回;應(yīng)用程序一直被掛起,直到用戶對消息框 作出響應(yīng)才繼續(xù)工作
vbSystemModal 4096系統(tǒng)強(qiáng)制返回;全部應(yīng)用程序都被掛起,直到用戶對消息框作 出響應(yīng)才繼續(xù)工作
vbMsgBoxHelpButton 16384將Help按鈕添加到消息框 VbMsgBoxSetForeground 65536指定消息框窗口作為前景窗口 vbMsgBoxRight 524288文本為右對齊
vbMsgBoxRtlReading 1048576指定文本應(yīng)為在希伯來和阿拉伯語系統(tǒng)中的從右到左顯示 說明:
(1)第一組值(0–5)描述了消息框中顯示的按鈕的類型與數(shù)目;第二組值(16,32,48,64)描述了圖標(biāo)的樣式;第三組值(0,256,512,768)說明哪一個(gè)按鈕是缺省值;而第四組值(0,4096)則決定消息框的強(qiáng)制返回性。將這些數(shù)字相加以生成Buttons參數(shù)值的時(shí)候,只能由每組值取用一個(gè)數(shù)字。(2)這些常數(shù)都是 Visual Basic for Applications(VBA)指定的。結(jié)果,可以在程序代碼中到處使用這些常數(shù)名稱,而不必使用實(shí)際數(shù)值。實(shí)際數(shù)值與常數(shù)名稱是等價(jià)的。返回值
用于MsgBox函數(shù)返回值的常量 常數(shù) 值 說明 vbOK 1 確定 vbCancel 2 取消 vbAbort 3 終止 vbRetry 4 重試 vbIgnore 5 忽略 vbYes 6 是 vbNo 7 否
(1)如果同時(shí)提供了Helpfile與Context參數(shù),可以按F1鍵來查看與Context相應(yīng)的幫助主題,Excel通常會在輸入框中自動添加一個(gè)幫助(Help)按鈕。
(2)若在消息框中顯示“取消”按鈕,則按下ESC鍵與單擊“取消”按鈕效果相同。若消息框中有“幫助”按鈕,則提供相關(guān)的幫助信息。
(3)如果要輸入多個(gè)參數(shù)并省略中間的某些參數(shù),則必須在相應(yīng)位置加入逗號分界符。示例
(1)(1)使用 MsgBox 函數(shù),在具有“是”及“否”按鈕的對話框中顯示一條嚴(yán)重錯(cuò)誤信息。示例中的缺省按鈕為“否”,MsgBox函數(shù)的返回值視用戶按哪一個(gè)鈕而定。并假設(shè)DEMO.HLP為一幫助文件,其中有一個(gè)幫助主題代碼為1000。
Dim Msg,Style,Title,Help,Ctxt,Response,MyString Msg=“Do you want to continue ?” ’定義消息文本
Style = vbYesNo + vbCritical + vbDefaultButton2 ' 定義按鈕 Title = “MsgBox Demonstration” ' 定義標(biāo)題文本 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)將消息框返回的結(jié)果賦值給變量 Ans=MsgBox(“Continue?”,vbYesNo)
If MsgBox(“Continue?”,vbYesNo)<>vbYes Then Exit Sub(4)使用常量的組合,賦值組Config變量,并設(shè)置第二個(gè)按鈕為缺省按鈕 Config=vbYesNo+vbQuestion+vbDefaultButton2(5)若要在消息中強(qiáng)制換行,可在文本中使用vbCrLf(或vbNewLine)常量,用&加空格與字符隔開。如
MsgBox “This is the first line.” & vbNewLine & “Second line.”
(6)可以在消息框中使用vbTab常量插入一個(gè)制表符。下面的過程使用一個(gè)消息框來顯示5×5單元格區(qū)域中的所有值,用vbTab常量分隔列并使用vbCrLf常量插入一個(gè)新行。注意在MsgBox函數(shù)最多只顯示1024個(gè)字符,因此限制了可顯示的單元格數(shù)。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)在消息框語句中運(yùn)用工作表函數(shù)以及設(shè)置顯示的數(shù)置格式,如下面語句所示:
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代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié).txt大人物的悲哀在于他們需要不停地做出選擇;而小人物的悲哀在于他們從來沒有選擇的機(jī)會。男人因滄桑而成熟,女人因成熟而滄桑。男人有了煙,有了酒,也就有了故事;女人有了錢,有了資色,也就有了悲劇。在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
問題一:在VBA代碼中,如何引用當(dāng)前工作表中的單個(gè)單元格(例如引用單元格C3)? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中的單元格(C3)進(jìn)行引用。(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)
------------------問題二:在VBA代碼中,我要引用當(dāng)前工作表中的B2:D6單元格區(qū)域,有哪些方式? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中單元格區(qū)域B2:D6進(jìn)行引用。(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為當(dāng)前單元格,則可使用語句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若單元格D6為當(dāng)前單元格,則可使用語句:Range(“B2”, ActiveCell)
------------------問題三:在VBA代碼中,如何使用變量實(shí)現(xiàn)對當(dāng)前工作表中不確定單元格區(qū)域的引用? 回答:有時(shí),我們需要在代碼中依次獲取工作表中特定區(qū)域內(nèi)的單元格,這通??梢圆扇∠旅娴膸追N方式:
(1)Range(“A” & i)(2)Range(“A” & i & “:C” & i)(3)Cells(i,1)(4)Cells(i,j)其中,i、j為變量,在循環(huán)語句中指定i和j的范圍后,依次獲取相應(yīng)單元格。------------------問題四:在VBA代碼中,如何擴(kuò)展引用當(dāng)前工作表中的單元格區(qū)域? 回答:可以使用Resize屬性,例如:
(1)ActiveCell.Resize(4, 4),表示自當(dāng)前單元格開始創(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屬性,則只是相對于單元格區(qū)域左上角單元格擴(kuò)展區(qū)域,例如: 代碼Range(“C3:E6”).Resize(, 2),表示單元格區(qū)域C3:D6,并且擴(kuò)展的單元格區(qū)域可不在原單元格區(qū)域內(nèi)。因此,可以知道Resize屬性是相對于當(dāng)前活動單元格或某單元格區(qū)域中左上角單元格按指定的行數(shù)或列數(shù)擴(kuò)展單元格區(qū)域。
------------------問題五:在VBA代碼中,如何在當(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屬性從所指定的單元格開始按指定的行數(shù)和列數(shù)偏移,從而到達(dá)目的單元格,但偏移的行數(shù)和列數(shù)不包括指定單元格本身。
------------------問題六:在VBA代碼中,如何在當(dāng)前工作表中引用交叉區(qū)域? 回答:可以使用Intersect方法,例如: Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示單元格區(qū)域D5:E6,即單元格區(qū)域C3:E6與D5:F8相重迭的區(qū)域。
------------------問題七:在VBA代碼中,如何在當(dāng)前工作表中引用多個(gè)區(qū)域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示單元格區(qū)域C3:D4和E5:F6所組成的區(qū)域。Union方法可以將多個(gè)非連續(xù)區(qū)域連接起來成為一個(gè)區(qū)域,從而可以實(shí)現(xiàn)對多個(gè)非連續(xù)區(qū)域一起進(jìn)行操作。
(2)也可以使用下面的代碼:
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ū)域。
------------------問題八:在VBA代碼中,如何引用當(dāng)前工作表中活動單元格或指定單元格所在的區(qū)域(當(dāng)前區(qū)域)?
回答:可以使用CurrentRegion屬性,例如:
(1)ActiveCell.CurrentRegion,表示活動單元格所在的當(dāng)前區(qū)域。(2)Range(“D5”).CurrentRegion,表示單元格D5所在的當(dāng)前區(qū)域。
當(dāng)前區(qū)域是指周圍由空行或空列所圍成的區(qū)域。該屬性的詳細(xì)使用參見《CurrentRegion屬性示例》一文。
------------------問題九:在VBA代碼中,如何引用當(dāng)前工作表中已使用的區(qū)域? 回答:可以使用UsedRange屬性,例如:
(1)Activesheet.UsedRange,表示當(dāng)前工作表中已使用的區(qū)域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的區(qū)域。
與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區(qū)域,包括顯示為空行,但已進(jìn)行過格式的單元格區(qū)域。該屬性的詳細(xì)使用參見《解析UsedRange屬性》一文。
------------------問題十:如何在單元格區(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)屬性,因此也可以簡寫為: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是開始于區(qū)域中左上角單元格D4起的第2行第2列)。
(4)也能使用一個(gè)單個(gè)的索引數(shù)值進(jìn)行引用。計(jì)數(shù)方式為從左向右,即在區(qū)域中的第一行開始從左向右計(jì)數(shù),第一行結(jié)束后,然后從第二行開始從左到右接著計(jì)數(shù),依次類推。(注:從區(qū)域中第一行第一個(gè)單元格開始計(jì)數(shù),當(dāng)?shù)谝恍薪Y(jié)束時(shí),轉(zhuǎn)入第二行最左邊的單元格,這樣按一行一行從左向右依次計(jì)數(shù)。以單元格區(qū)域中第1個(gè)單元格開始,按上述規(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è)索引值的方法對遍歷列是有用的,例如,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)與對象變量配合使用時(shí),Item屬性能提供簡潔并有效的代碼,例如: Set rng = Worksheets(1).[a1] 定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個(gè)索引數(shù)值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。(By Chip Pearson)
------------------問題十一:在VBA代碼中,如何引用當(dāng)前工作表中的整行或整列? 回答:見下面的示例代碼:
(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方法對整列或整行進(jìn)行調(diào)整。
------------------問題十二:在VBA代碼中,如何引用當(dāng)前工作表中的所有單元格? 回答:可以使用下面的代碼:
(1)Cells,表示當(dāng)前工作表中的所有單元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
------------------問題十三:在VBA代碼中,如何引用工作表中的特定單元格區(qū)域?
回答:在工作表中,您可能使用過“定位條件”對話框??梢酝ㄟ^選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個(gè)對話框可以允許用戶選擇特定的單元格。例如:
(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區(qū)域。(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當(dāng)前工作表中活動單元格所在區(qū)域中所有空白單元格所組成的區(qū)域。
當(dāng)然,還有很多常量和值的組合,可以讓您實(shí)現(xiàn)特定單元格的查找并引用。參見《探討在工作表中找到最后一行》一文。------------------問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區(qū)域?
回答:要引用其它工作表或其它工作簿中的單元格區(qū)域,只需在單元格對象前加上相應(yīng)的引用對象即可,例如:
(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ù)字來選擇單元格,其計(jì)數(shù)順序?yàn)樽宰笾劣?、從上到下,又如Cells(257),表示單元格B1。
(2)Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯(cuò)誤。
------------------結(jié)語
我們用VBA對Excel進(jìn)行處理,一般是對其工作表中的數(shù)據(jù)進(jìn)行處理,因此,引用單元格區(qū)域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區(qū)域,才能使用相應(yīng)的屬性和方法進(jìn)行下一步的操作。
上面列舉了一些引用單元格區(qū)域的情形和方式,可以看出,引用單元格區(qū)域有很多方式,有一些可能不常用,可以根據(jù)工作表的所處的環(huán)境和個(gè)人編程習(xí)慣進(jìn)行選擇使用。
當(dāng)然,在編寫程序時(shí),也可能會將上面的一些屬性聯(lián)合使用,以達(dá)到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。
找到最后一行的一些方法探討 使用End屬性
在ExcelVBA中,使用End(xlUp)查找最后一行是最常使用且最為簡單的方法,它假設(shè)要有一列總包含有數(shù)據(jù)(數(shù)字、文本和公式等),并且在該列中最后輸入數(shù)據(jù)的單元格的下一行不會包含數(shù)據(jù),因此不必?fù)?dān)心會覆蓋掉已有數(shù)據(jù)。但該方法有兩個(gè)缺點(diǎn):(1)僅局限于查找指定列的最后一行。
(2)如果該列中最后一行被隱藏,那么該隱藏行將被視作最后一行。因此,在最后一行被隱藏時(shí),其數(shù)據(jù)可能會被覆蓋。但該列中間的隱藏行不會影響查找的結(jié)果。[示例代碼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 “沒有發(fā)現(xiàn)公式或數(shù)據(jù)!” End Sub [示例代碼02] Sub NextRowInColumnUsedAsSub()'包含所有數(shù)據(jù)和公式,忽略隱藏的最后一行
Range(“A” & Range(“A” & Rows.Count).End(xlUp).Row + 1).Select End Sub [示例代碼03] Sub NextRowInColumnUsedAsFunction()'包含所有數(shù)據(jù)和公式,忽略隱藏的最后一行
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 注意,要輸入新數(shù)據(jù)的列可能與我們所查找最后一行時(shí)所使用的列不同,例如,在上例中,我們可以修改為在B列中查找該列的最后一行,而在A列相應(yīng)行的下一行中輸入新的數(shù)據(jù)。
------------------使用Find方法
Find方法在當(dāng)前工作有數(shù)據(jù)中進(jìn)行查找,不需要指定列,也可以確保不會意外地覆蓋掉已有數(shù)據(jù)。其中,參數(shù)LookIn指定所查找的類型,有三個(gè)常量可供選擇,即xlValues、xlFormulas和xlComments。
(1)常量xlFormulas將包含零值的單元格作為有數(shù)據(jù)的單元格。(當(dāng)設(shè)置零值不顯示時(shí),該單元格看起來為空,但該參數(shù)仍將該單元格視為有數(shù)據(jù)的單元格)(2)常量xlValues將包含零值的單元格(如果設(shè)置零值不顯示時(shí))作為空白單元格,此時(shí),若該單元格在最后一行,則Find方法會認(rèn)為該單元格所在的行為空行,因此,該單元格中的內(nèi)容可能會被新數(shù)據(jù)所覆蓋。
[注:在Excel中,選擇菜單“工具”——“選項(xiàng)”,在打開的“選項(xiàng)”對話框中,選擇“視圖”選項(xiàng)卡,將其中的“零值”前的復(fù)選框取消選中,則工作表中的零值都不會顯示] 如果在參數(shù)LookIn中使用常量xlValues的話,還存在一個(gè)問題是:如果您將最后一行隱藏,則Find方法會認(rèn)為倒數(shù)第二行是最后一行,此時(shí)您在最后一行的下一行輸入數(shù)據(jù),則會將實(shí)際的最后一行的數(shù)據(jù)覆蓋。
您可以在隱藏最后一行與不隱藏最后一行,或者是最后一行顯示零值與不顯示零值時(shí),運(yùn)行下面的示例代碼04,看看所得的結(jié)果有什么不同。[示例代碼04] Sub Find_LastRowxlValues()On Error GoTo Finish '獲取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlValues, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “沒有發(fā)現(xiàn)數(shù)值!” End Sub 因此,在使用Find方法時(shí),您應(yīng)該考慮所選參數(shù)設(shè)置的常量,以及工作表最后一行是否有可能被隱藏或不顯示零值。如果您忽視這些情況,很可能得不到您想要的結(jié)果,或者是覆蓋掉已有數(shù)據(jù)。使用常量xlFormulas可以避免這個(gè)問題,如下面的示例代碼05所示。[示例代碼05] Sub Find_LastRowxlFormulas()On Error GoTo Finish '獲取最后一行
MsgBox “最后一行是第” & Cells.Find(“*”, _ SearchOrder:=xlByRows, LookIn:=xlFormulas, _ SearchDirection:=xlPrevious).EntireRow.Row & “行” Exit Sub Finish: MsgBox “沒發(fā)現(xiàn)數(shù)值或公式!” End Sub 下面再列舉幾個(gè)示例代碼。[示例代碼06] Sub NextRowUsedAsSub()'選取最后一行的下一行 Range(“A” & Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row + 1).Select End Sub [示例代碼07] Sub NextRowUsedAsFunction()'選取最后一行的下一行(調(diào)用函數(shù))Range(“A” & LastRow + 1).Select End Sub '-------Public Function LastRow()As Long '本代碼包含隱藏行
'使用常量xlFormulas,因?yàn)槌A縳lValues會忽略隱藏的最后一行 LastRow = Cells.Find(“*”, LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row End Function 注:Find方法中,參數(shù)LookIn的默認(rèn)值為xlFormulas。
------------------使用SpecialCells方法
SpecialCells方法用于查找指定類型的值,其語法為SpecialCells(Type,Value),有兩種主要的使用方式:
(1)若參數(shù)Type僅考慮常量,則在查找時(shí)會忽略和覆蓋由公式生成的任何數(shù)據(jù),如示例代碼08所示。
(2)若參數(shù)Type僅考慮由公式生成的數(shù)據(jù),則在查找時(shí)會忽略和覆蓋任何常量數(shù)據(jù),如示例代碼09所示。如果參數(shù)Type是xlCellTypeConstants或者是xlCellTypeFormulas,則Value參數(shù)可使用常量決定哪種類型的單元格將被包含在結(jié)果中,這些常量值能組合而返回多個(gè)類型,其缺省設(shè)置是選擇所有的常量或公式,而不管是何類型,可使用下面四個(gè)可選的常量: 1)xlTextValues(包含文本);2)xlNumbers(包含數(shù)字);3)xlErrors(包含錯(cuò)誤值);4)xlLogical(包含邏輯值)自已在工作表輸入一些含有數(shù)值和公式的數(shù)據(jù),隱藏或不隱藏最后一行或公式所在的行,先體驗(yàn)下面的兩段示例代碼。[示例代碼08] '當(dāng)最后一行為公式或隱藏了最后行時(shí),會忽略,即認(rèn)為倒數(shù)第二行為最后一行 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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” 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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” End Function 下面的示例代碼10忽略最后一行帶有公式的單元格,即當(dāng)最后一行的單元格中含有公式時(shí),將倒數(shù)第二行作為最后一行,即只考慮直接輸入到工作表中的數(shù)據(jù)。當(dāng)最后一行沒有公式但被隱藏時(shí),并不影響該方法的判斷。[示例代碼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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” End Sub 注:因?yàn)樯鲜龃a使用了’Split’函數(shù),故只適合于Office2000及以上的版本。該方法也允許我們指定單個(gè)數(shù)據(jù)類型,諸如數(shù)字?jǐn)?shù)據(jù)或文本數(shù)據(jù),如下所示。
下面,我們查找的最后一行是僅在行中有數(shù)字(而不包含公式)的單元格的最后一行。[示例代碼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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” 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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” 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 “沒有發(fā)現(xiàn)數(shù)據(jù)!” End Sub 同上面所講述的一樣,我們也能使用SpecailCells方法去找到其它特定類型的單元格所在的最后一行,下面是這些常量的一個(gè)完整的列表:
XlCellTypeAllFormatConditions(任何格式的單元格)XlCellTypeAllValidation(帶有數(shù)據(jù)有效性的單元格)XlCellTypeBlanks(所使用區(qū)域中的空白單元格)XlCellTypeComments(包含有批注的單元格)XlCellTypeConstants(包含有常量的單元格)XlCellTypeFormulas(包含有公式的單元格)XlCellTypeLastCell(已使用區(qū)域中的最后一個(gè)單元格(看下面))XlCellTypeSameFormatConditions(有相同格式的單元格)XlCellTypeSameValidation(有相同數(shù)據(jù)有效性條件的單元格)XlCellTypeVisible(工作表中所有可見的單元格)
第三篇:在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
在VBA代碼中引用Excel工作表中單元格區(qū)域的方式小結(jié)
問題一:在VBA代碼中,如何引用當(dāng)前工作表中的單個(gè)單元格(例如引用單元格C3)? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中的單元格(C3)進(jìn)行引用。(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”)問題二:在VBA代碼中,我要引用當(dāng)前工作表中的B2:D6單元格區(qū)域,有哪些方式? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中單元格區(qū)域B2:D6進(jìn)行引用。(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為當(dāng)前單元格,則可使用語句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若單元格D6為當(dāng)前單元格,則可使用語句:Range(“B2”, ActiveCell)問題三:在VBA代碼中,如何使用變量實(shí)現(xiàn)對當(dāng)前工作表中不確定單元格區(qū)域的引用? 回答:有時(shí),我們需要在代碼中依次獲取工作表中特定區(qū)域內(nèi)的單元格,這通??梢圆扇∠旅娴膸追N方式:(1)Range(“A”& i)(2)Range(“A”& i &“:C”& i)(3)Cells(i,1)(4)Cells(i,j)其中,i、j為變量,在循環(huán)語句中指定i和j的范圍后,依次獲取相應(yīng)單元格。問題四:在VBA代碼中,如何擴(kuò)展引用當(dāng)前工作表中的單元格區(qū)域? 回答:可以使用Resize屬性,例如:
(1)ActiveCell.Resize(4, 4),表示自當(dāng)前單元格開始創(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屬性,則只是相對于單元格區(qū)域左上角單元格擴(kuò)展區(qū)域,例如: 代碼Range(“C3:E6”).Resize(, 2),表示單元格區(qū)域C3:D6,并且擴(kuò)展的單元格區(qū)域可不在原單元格區(qū)域內(nèi)。因此,可以知道Resize屬性是相對于當(dāng)前活動單元格或某單元格區(qū)域中左上角單元格按指定的行數(shù)或列數(shù)擴(kuò)展單元格區(qū)域。
問題五:在VBA代碼中,如何在當(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屬性從所指定的單元格開始按指定的行數(shù)和列數(shù)偏移,從而到達(dá)目的單元格,但偏移的行數(shù)和列數(shù)不包括指定單元格本身。問題六:在VBA代碼中,如何在當(dāng)前工作表中引用交叉區(qū)域? 回答:可以使用Intersect方法,例如:
Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示單元格區(qū)域D5:E6,即單元格區(qū)域C3:E6與D5:F8相重迭的區(qū)域。
問題七:在VBA代碼中,如何在當(dāng)前工作表中引用多個(gè)區(qū)域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示單元格區(qū)域C3:D4和E5:F6所組成的區(qū)域。Union方法可以將多個(gè)非連續(xù)區(qū)域連接起來成為一個(gè)區(qū)域,從而可以實(shí)現(xiàn)對多個(gè)非連續(xù)區(qū)域一起進(jìn)行操作。
(2)也可以使用下面的代碼:
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ū)域。
問題八:在VBA代碼中,如何引用當(dāng)前工作表中活動單元格或指定單元格所在的區(qū)域(當(dāng)前區(qū)域)?
回答:可以使用CurrentRegion屬性,例如:
(1)ActiveCell.CurrentRegion,表示活動單元格所在的當(dāng)前區(qū)域。(2)Range(“D5”).CurrentRegion,表示單元格D5所在的當(dāng)前區(qū)域。
當(dāng)前區(qū)域是指周圍由空行或空列所圍成的區(qū)域。該屬性的詳細(xì)使用參見《CurrentRegion屬性示例》一文。
問題九:在VBA代碼中,如何引用當(dāng)前工作表中已使用的區(qū)域? 回答:可以使用UsedRange屬性,例如:
(1)Activesheet.UsedRange,表示當(dāng)前工作表中已使用的區(qū)域。(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的區(qū)域。
與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區(qū)域,包括顯示為空行,但已進(jìn)行過格式的單元格區(qū)域。該屬性的詳細(xì)使用參見《解析UsedRange屬性》一文。問題十:如何在單元格區(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)屬性,因此也可以簡寫為: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是開始于區(qū)域中左上角單元格D4起的第2行第2列)。
(4)也能使用一個(gè)單個(gè)的索引數(shù)值進(jìn)行引用。計(jì)數(shù)方式為從左向右,即在區(qū)域中的第一行開始從左向右計(jì)數(shù),第一行結(jié)束后,然后從第二行開始從左到右接著計(jì)數(shù),依次
類推。(注:從區(qū)域中第一行第一個(gè)單元格開始計(jì)數(shù),當(dāng)?shù)谝恍薪Y(jié)束時(shí),轉(zhuǎn)入第二行最左邊的單元格,這樣按一行一行從左向右依次計(jì)數(shù)。以單元格區(qū)域中第1個(gè)單 元格開始,按上述規(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è)索引值的方法對遍歷列是有用的,例如,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)與對象變量配合使用時(shí),Item屬性能提供簡潔并有效的代碼,例如: Set rng = Worksheets(1).[a1] 定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個(gè)索引數(shù)值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。(By Chip Pearson)問題十一:在VBA代碼中,如何引用當(dāng)前工作表中的整行或整列? 回答:見下面的示例代碼:
(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方法對整列或整行進(jìn)行調(diào)整。問題十二:在VBA代碼中,如何引用當(dāng)前工作表中的所有單元格? 回答:可以使用下面的代碼:
(1)Cells,表示當(dāng)前工作表中的所有單元格。(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。問題十三:在VBA代碼中,如何引用工作表中的特定單元格區(qū)域? 回答:在工作表中,您可能使用過“定位條件”對話框??梢酝ㄟ^選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個(gè)對話框可以允許用戶選擇特定的單元格。例如:(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區(qū)域。(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當(dāng)前工作表中活動單元格所在區(qū)域中所有空白單元格所組成的區(qū)域。
當(dāng)然,還有很多常量和值的組合,可以讓您實(shí)現(xiàn)特定單元格的查找并引用。參見《探討在工作表中找到最后一行》一文。
問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區(qū)域? 回答:要引用其它工作表或其它工作簿中的單元格區(qū)域,只需在單元格對象前加上相應(yīng)的引用對象即可,例如:(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ù)字來選擇單元格,其計(jì)數(shù)順序?yàn)樽宰笾劣摇纳系较?,又如Cells(257),表示單元格B1。
(2)Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯(cuò)誤。結(jié)語
我們用VBA對Excel進(jìn)行處理,一般是對其工作表中的數(shù)據(jù)進(jìn)行處理,因此,引用單元格區(qū)域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區(qū)域,才能使用相應(yīng)的屬性和方法進(jìn)行下一步的操作。
上面列舉了一些引用單元格區(qū)域的情形和方式,可以看出,引用單元格區(qū)域有很多方式,有一些可能不常用,可以根據(jù)工作表的所處的環(huán)境和個(gè)人編程習(xí)慣進(jìn)行選擇使用。當(dāng)然,在編寫程序時(shí),也可能會將上面的一些屬性聯(lián)合使用,以達(dá)到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。
如何選擇當(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 如何選擇不同工作簿中的單元格?
例如,要選擇另一工作簿中的一個(gè)工作表上的單元格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),否則會出錯(cuò)。如何選擇與另一單元格(不是當(dāng)前單元格)相關(guān)的單元格?
例如,要選擇距單元格C7下方5行右側(cè)4列的單元格,可以使用下面的代碼: ActiveSheet.Cells(7, 3).Offset(5, 4).Select 或:ActiveSheet.Range(“C7”).Offset(5, 4).Select 如何選擇偏離指定區(qū)域的一個(gè)單元格區(qū)域?
例如,要選擇與名為“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 如何選擇一個(gè)指定的區(qū)域并擴(kuò)展區(qū)域的大???
例如,要選擇當(dāng)前工作表中名為“Database”區(qū)域,然后將該區(qū)域向下擴(kuò)展5行,可以使用下面的代碼:
Range(“Database”).Select Selection.Resize(Selection.Rows.Count + 5, Selection.Columns.Count).Select 如何選擇一個(gè)指定的區(qū)域,再偏離,然后擴(kuò)展區(qū)域的大???
例如,選擇名為“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 如何選擇兩個(gè)或多個(gè)指定區(qū)域?
例如,為了同時(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”))將會出錯(cuò)。如何選擇兩個(gè)或多個(gè)指定區(qū)域的交叉區(qū)域?
例如,要選擇名為“Test”和“Sample”的兩個(gè)區(qū)域的交叉區(qū)域,可以使用下面的代碼: Application.Intersect(Range(“Test”), Range(“Sample”)).Select 注意,兩個(gè)區(qū)域必須在同一工作表中。= = = = = = = = = = = = = = = = = = = = = = = = = 下面的示例使用了如下圖所示的工作表。
如何選擇連續(xù)數(shù)據(jù)列中的最后一個(gè)單元格?
例如,要選擇一個(gè)連續(xù)列中的最后一個(gè)單元格,可以使用下面的代碼: 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將被選擇。如何選擇一個(gè)矩形(規(guī)則的)單元格區(qū)域?
要選擇圍繞某單元格的一個(gè)矩形區(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 = = = = = = = = = = = = = = = = = = = = 如何選擇多個(gè)不同長度的非連續(xù)列? 例如,有下圖所示的工作表:
要同時(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 = = = = = = = = = = = = = = = = = = = = 注:使用Application.Goto方法,如果指定另一工作表(不是當(dāng)前工作表)中的指定區(qū)域,在Range屬性中使用兩個(gè)Cells屬性時(shí),則必須包括Sheets對象,如:
Application.Goto Sheets(“Sheet1”).Range(Sheets(“Sheet1”).Range(Sheets(“Sheet1”).Cells(2, 3), Sheets(“Sheet1”).Cells(4, 5)))= = = = = = = = = = = = = = = = = = = = 在VBA中,Range 對象既可表示單個(gè)單元格,也可表示單元格區(qū)域。下面的內(nèi)容說明了標(biāo)識和處理Range對象最常用的方法。引用工作表上的所有單元格
如果對工作表應(yīng)用 Cells 屬性時(shí)不指定索引號,該方法將返回代表工作表上所有單元格的 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 屬性來處理整行或整列。這兩個(gè)屬性返回代表單元格區(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 工作表上所有的列
若要同時(shí)處理若干行或列,可創(chuàng)建一個(gè)對象變量并使用 Union 方法,將對 Rows 屬性或 Columns 屬性的多個(gè)調(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 屬性引用單個(gè)單元格。該屬性返回代表單個(gè)單元格的 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 如果要同時(shí)更改某個(gè)區(qū)域中所有單元格的屬性(或?qū)⒎椒☉?yīng)用于該區(qū)域中的所有單元格),建議使用 Range 屬性。使用快捷表示法引用單元格
可用方括號將 A1 引用樣式或命名區(qū)域括起來,作為 Range 屬性的快捷方式。這樣就不必鍵入單詞“Range”或使用引號了,如下例中所示。Sub ClearRange()Worksheets(“Sheet1”).[A1:B5].ClearContents End Sub
第四篇:vba單元格區(qū)域引用方式的小結(jié)
vba單元格區(qū)域引用方式的小結(jié)
在使用ExcelVBA進(jìn)行編程時(shí),我們通常需要頻繁地引用單元格區(qū)域,然后再使用相應(yīng)的屬性和方法對區(qū)域進(jìn)行操作。所謂單元格區(qū)域,指的是單個(gè)的單元格、或者是由多個(gè)單元格組成的區(qū)域、或者是整行、整列等。下面,我們設(shè)定一些情形,以問答的形式對引用單元格區(qū)域的方式進(jìn)行歸納。------------------問題一:在VBA代碼中,如何引用當(dāng)前工作表中的單個(gè)單元格(例如引用單元格C3)? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中的單元格(C3)進(jìn)行引用。(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”)------------------問題二:在VBA代碼中,我要引用當(dāng)前工作表中的B2:D6單元格區(qū)域,有哪些方式? 回答:可以使用下面列舉的任一方式對當(dāng)前工作表中單元格區(qū)域B2:D6進(jìn)行引用。(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為當(dāng)前單元格,則可使用語句:Range(ActiveCell, ActiveCell.Offset(4, 2))(10)若單元格D6為當(dāng)前單元格,則可使用語句:Range(“B2”, ActiveCell)------------------問題三:在VBA代碼中,如何使用變量實(shí)現(xiàn)對當(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)語句中指定i和j的范圍后,依次獲取相應(yīng)單元格。------------------問題四:在VBA代碼中,如何擴(kuò)展引用當(dāng)前工作表中的單元格區(qū)域? 回答:可以使用Resize屬性,例如:
(1)ActiveCell.Resize(4, 4),表示自當(dāng)前單元格開始創(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屬性,則只是相對于單元格區(qū)域左上角單元格擴(kuò)展區(qū)域,例如:
代碼Range(“C3:E6”).Resize(, 2),表示單元格區(qū)域C3:D6,并且擴(kuò)展的單元格區(qū)域可不在原單元格區(qū)域內(nèi)。
因此,可以知道Resize屬性是相對于當(dāng)前活動單元格或某單元格區(qū)域中左上角單元格按指定的行數(shù)或列數(shù)擴(kuò)展單元格區(qū)域。
------------------問題五:在VBA代碼中,如何在當(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屬性從所指定的單元格開始按指定的行數(shù)和列數(shù)偏移,從而到達(dá)目的單元格,但偏移的行數(shù)和列數(shù)不包括指定單元格本身。
------------------問題六:在VBA代碼中,如何在當(dāng)前工作表中引用交叉區(qū)域? 回答:可以使用Intersect方法,例如:
Intersect(Range(“C3:E6”), Range(“D5:F8”)),表示單元格區(qū)域D5:E6,即單元格區(qū)域C3:E6與D5:F8相重迭的區(qū)域。
------------------問題七:在VBA代碼中,如何在當(dāng)前工作表中引用多個(gè)區(qū)域? 回答:
(1)可以使用Union方法,例如:
Union(Range(“C3:D4”), Range(“E5:F6”)),表示單元格區(qū)域C3:D4和E5:F6所組成的區(qū)域。Union方法可以將多個(gè)非連續(xù)區(qū)域連接起來成為一個(gè)區(qū)域,從而可以實(shí)現(xiàn)對多個(gè)非連續(xù)區(qū)域一起進(jìn)行操作。
(2)也可以使用下面的代碼:
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ū)域。------------------問題八:在VBA代碼中,如何引用當(dāng)前工作表中活動單元格或指定單元格所在的區(qū)域(當(dāng)前區(qū)域)? 回答:可以使用CurrentRegion屬性,例如:
(1)ActiveCell.CurrentRegion,表示活動單元格所在的當(dāng)前區(qū)域。(2)Range(“D5”).CurrentRegion,表示單元格D5所在的當(dāng)前區(qū)域。
當(dāng)前區(qū)域是指周圍由空行或空列所圍成的區(qū)域。該屬性的詳細(xì)使用參見《CurrentRegion屬性示例》一文。[NextPage]------------------問題九:在VBA代碼中,如何引用當(dāng)前工作表中已使用的區(qū)域? 回答:可以使用UsedRange屬性,例如:
(1)Activesheet.UsedRange,表示當(dāng)前工作表中已使用的區(qū)域。
(2)Worksheets(“sheet1”).UsedRange,表示工作表sheet1中已使用的區(qū)域。
與CurrentRegion屬性不同的是,該屬性代表工作表中已使用的單元格區(qū)域,包括顯示為空行,但已進(jìn)行過格式的單元格區(qū)域。該屬性的詳細(xì)使用參見《解析UsedRange屬性》一文。
------------------問題十:如何在單元格區(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)屬性,因此也可以簡寫為: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是開始于區(qū)域中左上角單元格D4起的第2行第2列)。
(4)也能使用一個(gè)單個(gè)的索引數(shù)值進(jìn)行引用。計(jì)數(shù)方式為從左向右,即在區(qū)域中的第一行開始從左向右計(jì)數(shù),第一行結(jié)束后,然后從第二行開始從左到右接著計(jì)數(shù),依次類推。(注:從區(qū)域中第一行第一個(gè)單元格開始計(jì)數(shù),當(dāng)?shù)谝恍薪Y(jié)束時(shí),轉(zhuǎn)入第二行最左邊的單元格,這樣按一行一行從左向右依次計(jì)數(shù)。以單元格區(qū)域中第1個(gè)單元格開始,按上述規(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è)索引值的方法對遍歷列是有用的,例如,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)與對象變量配合使用時(shí),Item屬性能提供簡潔并有效的代碼,例如: Set rng = Worksheets(1).[a1] 定義了對象變量后,像單元格方法一樣,Item屬性允許使用兩個(gè)索引數(shù)值引用工作表中的任一單元格,例如,rng(3,4)指定單元格D3。(By Chip Pearson)------------------問題十一:在VBA代碼中,如何引用當(dāng)前工作表中的整行或整列? 回答:見下面的示例代碼:
(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方法對整列或整行進(jìn)行調(diào)整。------------------問題十二:在VBA代碼中,如何引用當(dāng)前工作表中的所有單元格? 回答:可以使用下面的代碼:
(1)Cells,表示當(dāng)前工作表中的所有單元格。
(2)Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells.Columns.Count)),其中Cells.Rows表示工作表所有行,Cells.Columns表示工作表所有列。
------------------問題十三:在VBA代碼中,如何引用工作表中的特定單元格區(qū)域?
回答:在工作表中,您可能使用過“定位條件”對話框??梢酝ㄟ^選擇菜單“編輯——定位”,單擊“定位”對話框中的“定位條件”按鈕顯示該對話框。這個(gè)對話框可以允許用戶選擇特定的單元格。例如:
(1)Worksheets(“sheet1”).Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由帶有條件格式的單元格所組成的區(qū)域。
(2)ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示當(dāng)前工作表中活動單元格所在區(qū)域中所有空白單元格所組成的區(qū)域。
當(dāng)然,還有很多常量和值的組合,可以讓您實(shí)現(xiàn)特定單元格的查找并引用。參見《探討在工作表中找到最后一行》一文。
------------------問題十四:在VBA代碼中,如何引用其它工作表或其它工作簿中的單元格區(qū)域?
回答:要引用其它工作表或其它工作簿中的單元格區(qū)域,只需在單元格對象前加上相應(yīng)的引用對象即可,例如:
(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ù)字來選擇單元格,其計(jì)數(shù)順序?yàn)樽宰笾劣?、從上到下,又如Cells(257),表示單元格B1。
(2)Cells(, 256),表示單元格IV1,但是如果Cells(, 257),則會返回錯(cuò)誤。
------------------結(jié)語
我們用VBA對Excel進(jìn)行處理,一般是對其工作表中的數(shù)據(jù)進(jìn)行處理,因此,引用單元格區(qū)域是ExcelVBA編程中最基本的操作之一,只有確定了所處理的單元格區(qū)域,才能使用相應(yīng)的屬性和方法進(jìn)行下一步的操作。
上面列舉了一些引用單元格區(qū)域的情形和方式,可以看出,引用單元格區(qū)域有很多方式,有一些可能不常用,可以根據(jù)工作表的所處的環(huán)境和個(gè)人編程習(xí)慣進(jìn)行選擇使用。
當(dāng)然,在編寫程序時(shí),也可能會將上面的一些屬性聯(lián)合使用,以達(dá)到選取特定操作對象的目的,例如Offset屬性、Resize屬性、CurrentRegion屬性、UsedRange屬性等的組合。文章標(biāo)簽: ExcelVBA引用單元格
第五篇:在Word文檔中引用Excel工作表
在Word文檔中引用Excel工作表數(shù)據(jù)
用戶在使用Word編輯文檔的過程中,往往會用到大量的數(shù)據(jù)。尤其在一些諸如技術(shù)方案、技術(shù)總結(jié)等類型的文章中,文章中的同一組數(shù)據(jù)可能要反復(fù)使用很多次。有些數(shù)據(jù)還可能來自于Excel工作表,甚至整個(gè)表格都由Excel復(fù)制而來。對于這些數(shù)據(jù)的輸入工作,大多數(shù)用戶會采取直接輸入或復(fù)制粘貼的方法。通過這樣的方法輸入的數(shù)據(jù)在Word文檔中是死板的數(shù)據(jù),一旦實(shí)際數(shù)據(jù)調(diào)整變更,Word文檔中的所有數(shù)據(jù)需要重新輸入,為用戶帶來很大的工作量。如果借助Word 2003“編輯”菜單中的“選擇性粘貼”命令,用戶可以非常靈活地在Excel工作表中的數(shù)據(jù)。方法1:當(dāng)整個(gè)表格來源于Excel工作表時(shí),首先在Excel工作表中選中需要Word文檔中引用的數(shù)據(jù)區(qū)域,并執(zhí)行復(fù)制操作。然后運(yùn)行“編輯”→“選擇性粘貼”菜單命令,打開“選擇性粘貼”對話框。在“形式”列表中選中“Microsoft Office Excel工作表 對象”選項(xiàng),并單擊“確定”按鈕。通過這種方式引用的Excel數(shù)據(jù)可以使用Excel編輯數(shù)據(jù),方法2:當(dāng)Word文檔中的數(shù)據(jù)來源于Excel工作表中的某個(gè)單元格時(shí),可以首先在Excel工作表中復(fù)制該單元格,然后在Word文檔中依次單擊“編輯”→“選擇性粘貼”菜單命令,打開“選擇性粘貼”對話框。在“形式”列表中選中“無格式文本”選項(xiàng),并單擊“確定”按鈕。這樣操作可以既保持與數(shù)據(jù)源的鏈接,又能與Word文檔格式融為一體。如果數(shù)據(jù)源有格式特別是有上下標(biāo)時(shí),可以選擇“帶格式文本(RTF)”選項(xiàng),方法3:如果需要在Word文檔中對同一數(shù)據(jù)進(jìn)行反復(fù)引用,可以把其中一個(gè)數(shù)據(jù)作為數(shù)據(jù)源,然后通過選擇性粘貼為鏈接的方式在其他未知對該數(shù)據(jù)進(jìn)行引用。鏈接的方式可以選擇“帶格式文本(RTF)”、“HTML格式”和“無格式文本”,其中“無格式文本”可以使粘貼后內(nèi)容的格式與Word文檔格式保持一致;另外兩種形式則保持原有格式。需要注意的是,在編輯修改數(shù)據(jù)源時(shí)不能選擇全部數(shù)據(jù)后再修改,而必須把光標(biāo)定位到數(shù)據(jù)源中間再輸入新數(shù)據(jù),并刪除原來的數(shù)據(jù),否則選擇性粘貼的數(shù)據(jù)不能被更新。