- Excel VBA范例大全
- 羅剛君編著
- 175字
- 2018-12-29 15:15:19
第1部分 單元格選擇技巧與選區統計
單元格是Excel 2007儲存數據的最小單位,也是電子表格的儲存和運算基礎。靈活而快速地掌握單元格選擇技巧有助于制表效率的提升,以及數據運算的準確性。本部分通過27個實例向讀者展示單元格與區域選擇及其基本統計方面的運用,讓讀者迅速掌握并發揮VBA在制表中的優勢。
本部分主要知識點:
● 單元格與區域選擇技巧
● 多表單元格選擇
● 對選區進行基本統計
第1章 單元格與區域選擇技巧
對于固定地址的單元格選擇,手工操作就能輕易完成。但基于指定條件選擇單元格,且條件可能因單元格數據變化而相應變化時,手工操作則會捉襟見肘了。對此,可以利用VBA(Visual Basic for Application)對單元的屬性識別來精確且快速地定位。
● 實例1選擇A列最后一個非空單元格
● 實例2基于指定位置的偏移量的選取
● 實例3選擇當前列最大值
● 實例4選擇負數單元格
● 實例5選擇單元格所在區域及工作表已用區域
● 實例6選擇數組公式區域
● 實例7返回單元格合集與交集
● 實例8選擇背景色為黃色的單元格
● 實例9選擇字體為藍色之單元格
● 實例10選擇粗線邊框之單元格
● 實例11反向選擇工作表
● 實例12選擇單元格區域但排除首行標題
● 實例13每隔三行選一行
● 實例14選擇奇數列
實例1 選擇A列最后一個非空單元格
【技巧說明】 定位至第一行的最后一個有數據的單元格。
【案例介紹】 工廠的產量表數據行一般較多,本例中有350行。當要查看合計項時則需要將光標定位于最后一個非空行,數據如圖1.1所示。

圖1.1 產量表
【案例實現】 假設當前光標在單元格A350以外的任何區域,實現定位步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼,如圖1.2所示。
Sub選擇A列最后一個非空單元格() Range("a1048576").End(xlUp).Select End Sub

圖1.2 VBE環境
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,如圖1.3所示。
[6] 運行程序后光標將自動跳轉至A列最后一個有數據的單元格,即“合計”所在行。

圖1.3 運行宏窗口
提示
本實例參見光盤樣本:..\第1部分\實例1.xlsm
【相關知識說明】
(1)Range():返回一個Range對象,它代表一個單元格或單元格區域。區域的大小由其參數決定。格式為雙引號之中寫入單元格地址,如Range("A10");也可以用逗號分隔寫入多個單元格地址,如Range("a1,a10,a20") 表示三個單元格。Range()還可以有多個參數,即Range()的嵌套使用,如Range(Range("a1"), Range("a10"))表示單元格區域A1∶A10,共10個單元格,而不是A1和A10兩個單元格。
(2)Range("a1048576"):Excel 2003升級至2007后,可用行數從65536行提升至1048576行,所以表示A列最大行數時使用Range("a1048576").Row。
(3)End(xlUp):Range.End屬性返回一個Range對象,代表包含源區域的區域尾端的單元格。End有一個參數,代表移動方向,本例中xlUp表示向上,也可以將xlUp改為-4162,功能相同。Range("a1048576").End(xlUp)整句含義則是A列最后一個單元格向上第一個非空單元格。End屬性參數列表如下(見表1.1),可以根據不同需求選擇相應的參數。
(4)Range.Select:選擇單元格。要選擇單元格或單元格區域,使用Select方法。要使單個單元格成為活動單元格,請使用Activate方法。它們兩者的區別是Select方法可選擇多單元格,而Activate方法只能選擇單個單元格。
表1.1 End屬性參數

實例2 基于指定位置的偏移量的選取
【技巧說明】 選擇當前單元格下一行已用區域外第一個空白單元格。
【案例介紹】 常規報表一般是整行或者整列之數據對齊,輸入數據時直接按回車鍵即可跳到下一個輸入單元格。但針對特殊狀況,如圖1.4所示,各行已用單元格數量不同,按回車鍵時無法每次都進入下一個待輸入單元格,從而造成輸入效率降低。本案例代碼則用來解決此問題。

圖1.4 罰金表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 使用快捷鍵Ctrl+R,顯示工程資源管理器。
[3] 雙擊左邊列表中的“產量表”,打開工作表代碼窗口。
[4] 在右邊代碼窗口輸入以下代碼,如圖1.5所示。
Private Sub Worksheet_Change(ByVal Target As Range) Cells(Target.Row+1, 16384).End(xlToLeft).Offset(0, 1).Select End Sub

圖1.5 工作表代碼窗口
[5] 關閉VBE窗口返回到工作表。
[6] 光標定位至單元格C3,輸入任意字符并回車,可以發現程序已激活下一行空白單元格D4;D4中輸入數據后光標將定位至單元格C3,完全符合需求。
提示
1.本實例參見光盤樣本:..\第1部分\實例2.xlsm。
2.本實例中,在任意單元格輸入數據并回車,光標都跳轉至下一行已用區域外第一個空白單元格,但某行未輸入數據時,按回車鍵或者鍵盤上向下箭頭鍵,光標將按常規方式跳轉。如果需要光標仍然跳轉至下一行已用區域外第一個空白單元格,則必須在當前的空白單元格中以鍵盤上的Delete鍵替代回車鍵或者向下箭頭鍵。
【相關知識說明】
(1)Sub Worksheet_Change(ByVal Target As Range):工作表事件,在工作表中數據被修改時發生。代碼加入到Sub Worksheet_Change(ByVal Target As Range)事件中將在工作表中任意單元格數據被修改時就執行代碼,而不需要手動運行(見實例1)。需要特別指出的是,單元格中函數與公式結果改變時將不引發此事件。
(2)Cells():單元格對象,等同于Range。如Range("A10")表示單元格A10,Cells(10,1)也表示單元格A10。但它們在使用上有一些區別:Range()代表某一單元格、某一行、某一列、某一選定區域或者某一三維區域。而Cells()帶參數時只能表示單個單元格,不帶參數時表示工作表中所有單元格,不及range()表示單元格那么靈活。但Cells()的行和列兩個參數都是數字變量,較之Range()的一個數字變量和一個字母變量在使用上方便許多,特別是需要單元格循環引用時。
(3)Cells(Target.Row+1, 16384):Target是一個單元格對象,表示當前選中單元格區域;16384表示Excel 2007的最大列數;Cells(Target.Row+1, 16384)則表示相對于當前行的下一行最后一個單元格。
(4)Offset:表示指定單元格區域一定的偏移量位置上的區域,它有兩個參數,一個為偏移行數,一個為偏移列數,可以是負數。本例中為偏移1列,從最后一個非空單元格偏移至第一個空白單元格。故使用參數0和1表示行不變,偏移一列。
實例3 選擇當前列最大值
【技巧說明】 選擇光標所在列的最大值所在的單元格,如果存在多個單元格等于最大值,僅選擇第一個。
【案例介紹】 在大容量報表中查找最大值,當數據少時可用目視比較;數據多時,常規辦法是先升序排序再找其首行值。但此方法會破壞原工作表數據分布方式。使用VBA處理此類事件則可以得心應手。本例采用實例1之數據,工作表有350行,利用代碼循環檢測單元格的數據是否等于該列最大值。
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼。
Sub選擇當前列最大值() Dim rng As Range, rng2 As Range '聲明變量 Set rng2=Application.Intersect(ActiveCell.EntireColumn, ActiveCell.CurrentRegion) '將本列已用區域賦值給rng2 For Each rng In rng2 '開始循環檢測單元格值 If rng.Value=WorksheetFunction.Max(rng2) Then '如果等于最大值 rng.Select '選擇該單元格 Exit For '退出循環 End If Next End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 光標定位于C列有數據的任意單元格,使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,光標已定位于單元格C310,可以在G1輸入公式“=MAX(C:C)”來驗證值是否正確,結果如圖1.6所示。

圖1.6 選擇并驗算C列最大值
提示
1.本實例參見光盤樣本:..\第1部分\實例3.xlsm。
2.代碼中單引號后面的文字是當前行代碼的含義解釋,使用戶可以快速了解代碼編寫者的思路和代碼用意。在執行程序時會跳過該文字。
3.本程序代碼中每行前有不同數量的空格,這不是編寫程序所必需的,但為了使代碼更美觀,以及使代碼與代碼之間更能體現其層級關系,使用空格是有其價值的。
【相關知識說明】
(1)Intersect:返回一個Range對象,該對象表示兩個或多個區域重疊的矩形區域。本例中兩個區域分別為ActiveCell.EntireColumn(表示當前列)和ActiveCell.CurrentRegion(表示當前單元格所在區域,當前區域是以空行與空列的組合為邊界的區域),所以Intersect (ActiveCell.EntireColumn, ActiveCell.CurrentRegion)則表示當前列的已用區域,排除空白區。也許以圖片來表示這個區域可以更形象化,讓讀者更易于理解Intersect的用法。
如圖1.7所示,當前單元格(ActiveCell)為C4;當前列(ActiveCell.EntireColumn)是C列,即雙線框之內的區域;當前單元格所在的已用區域(ActiveCell.CurrentRegion)是單線框之內的區域B2∶E6;而當前列與當前區域的重疊區域Intersect(ActiveCell. EntireColumn, ActiveCell.CurrentRegion)則是C2∶C6,即圖中灰色底紋的區域。

圖1.7 Intersect示意圖
(2)For Each…Next:這是一種循環語句,針對一個數組或集合中的每個元素,重復執行一組語句。本例中將區域中每一個值與C列最大值進行比較,若不相等則繼續比較下一個單元格,直到找到目標時停止循環。
(3)WorksheetFunction.Max:VBA中沒有直接求最大值的函數,但Excel工作表函數中有MAX可求最大值。在VBA中則可以通過WorksheetFunction前綴來調用工作表函數。
(4)Dim:聲明變量(變量:命名的存儲位置與數據范圍,包含在程序執行階段可修改的數據。變量名在其聲明范圍內必須只有唯一名稱不可重復。)并分配存儲空間,每一個變量都需要聲明方可使用。聲明變量時除指定變量名稱外,還會指定變量類型,不同類型占用空間不同,運行速度也不相同。當在過程中使用Dim語句時,通常將Dim語句放在過程的開始處。當然,在程序中不用Dim語句聲明變量,程序也會執行,但速度會慢很多。用戶需要養成聲明所有變量的習慣。
(5)在過程中使用變量時一般需要先聲明其名稱和儲存空間。如“Dim aa as byte”,其中Dim是聲明變量的語句,“aa”表示變量名稱,“byte”即變量的儲存空間或稱范圍。用Dim語句聲明變量時可以同時聲明多個變量。如“dim a as byte,b as intger”,此語句聲明了兩個變量,在第二個變量處不需要再用Dim前綴。本例中聲明了兩個變量,類型為單元格對象。
提示
VBA中可以調用大部分工作表函數,只要前綴WorksheetFunction加點后即可列出可在VBA中使用的工作表函數,如圖1.8所示。并非所有工作表函數都可以在VBA中使用,如Concatenate。

圖1.8 VBA中調用工作表函數
實例4 選擇負數單元格
【技巧說明】 一次性選擇A1∶D13區域中所有負數所在的單元格。
【案例介紹】 如圖1.9所示,獎懲表存在正數和負數。本例利用單元格循環,逐個檢測數值,最后一次選定所有負數所在的單元格。

圖1.9 獎懲表數據
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇所有負數單元格() Dim rng As Range, rg As Range For Each rng In Range("a1:d13") If rng < 0 Then If rg Is Nothing Then Set rg=rng Else Set rg=Application.Union(rg, rng) End If End If Next rg.Select End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到所有負數據單元格已被選中,其背景呈灰暗效果,如圖1.10所示。

圖1.10 選中負數后的獎懲表
提示
本實例參見光盤樣本:..\第1部分\實例4.xlsm。
【相關知識說明】
Application.Union:返回兩個或多個區域的合并區域,支持30個參數。本例中它將查找到的多個負數所在單元格地址合并為一個區域,最后一次選擇所有負數區域。
實例5 選擇單元格所在區域及工作表已用區域
【技巧說明】 選擇單元格所在區域及工作表已用區域。
【案例介紹】 已用區域也稱為當前區域,是指以空行與空列的組合為邊界的區域。本例中將演示當前單元格區域和當前工作表區域之異同。案例數據車間員工分組表如圖1.11所示。

圖1.11 車間員工分組表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇已用區域() ActiveCell.CurrentRegion.Select MsgBox "已選擇單元格所在區域。", 64, "提示" ActiveSheet.UsedRange.Select MsgBox "已選擇本工作表已用區域。", 52, "提示" End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 單元格定位于D1∶E11中任意單元格,使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕。
[6] 程序執行時將彈出一個提示窗口,如圖1.12所示,同時B組成員列表之區域D1∶E11已被選中。

圖1.12 已選擇單元格所在區域

圖1.13 已選擇當前表已用區域
[7] 單擊“確定”按鈕后再次彈出一個窗口,如圖1.13所示,同時A1:H11區域已被選中。
提示
本實例參見光盤樣本:..\第1部分\實例5.xlsm。
【相關知識說明】
(1)CurrentRegion:返回一個Range對象,該對象表示當前區域,本例中表示當前單元格所在區域D1∶E11,其他兩個區域因中間有一個空白區而被分隔開。
(2)ActiveSheet.UsedRange:返回一個Range對象,該對象表示指定工作表上所使用的區域,以使用區域的最大行、最大列為邊界。
(3)MsgBox:在對話框中顯示消息,等待用戶單擊按鈕,并返回一個Integer告訴用戶單擊哪一個按鈕。本函數一般用于告知用戶程序在執行中取得的值或者用以暫時中斷程序的執行,本例作用為后者。MsgBox函數參數如下:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
其中,[buttons]參數表示顯示按鈕的數目及形式,使用的圖標樣式,默認按鈕是什么,以及消息框的強制回應等。本例中第一個消息框顯示了一個按鈕和消息提示圖標;第二個消息框顯示了兩個按鈕和一個三角驚嘆號圖標。這兩項都由[buttons]參數控制,使用該參數時可以用常數,也可以使用值。[buttons]參數列表如下(見表1.2)。
表1.2 MsgBox之buttons參數列表


提示
MsgBox之buttons參數可以用表1.2中各參數值相加產生信息按鈕與圖標的組合。例如:使用參數65,可產生OK及Cancel兩個按鈕及一個Information Message圖標,即1+64;使用參數259將產生是、否及取消三個按鈕,默認按鈕為第二個,參數259為3+256而得出。
實例6 選擇數組公式區域
【技巧說明】 選擇當前單元格所在的多單元格數組公式區域。
【案例介紹】 如圖1.14所示,工作表定義了一個名稱“星期”,其引用為數組公式={"星期一";"星期二";"星期三";"星期四";"星期五";"星期六";"星期天"},在工作表中輸入多單元格數組公式時因錯誤地多選擇了一個單元格,使公式結果產生一個錯誤值。而數組公式是不可以單獨修改其中某單元格的數據的,如刪除A9則出錯,如圖1.15所示。此時就需要先選中整個數組區域才可以進行下一步操作。

圖1.14 數組公式結果

圖1.15 修改數組公式時出錯
【案例實現】 選中數組區域之步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼。
Sub選擇數組區域() ActiveCell.CurrentArray.Select End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 將鼠標定位于單元格A9,使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,數組公式單元格區域A2∶A9已被選中,如圖1.16所示。

圖1.16 已選中的數據區域
提示
本實例參見光盤樣本:..\第1部分\實例6.xlsm。
【相關知識說明】
ActiveCell.CurrentArray:表示當前單元格所在的數組區域。
實例7 返回單元格合集與交集
【技巧說明】 選擇兩個區域之合集及兩個重疊區域之交集。
【案例介紹】 如圖1.17所示,數據分別為“原料倉”、“零用品倉”、“成品倉”三個倉庫數據區,同時選擇“原料倉”區域A3∶F5及“成品倉”區域A9∶F12則為單元格合集;選中“零用品倉”區域A6∶F8及“入倉”數據列之重疊區域E6∶E8即為單元格交集。

圖1.17 倉庫進出表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub合集與交集() Application.Union(Range("A3:F5"), Range("A9:F12")).Select MsgBox "兩個區域的合集已選中。", 64, "提示" Application.Intersect([a6:f8], Columns("E:E")).Select MsgBox "兩個區域的交集已選中。", 64, "提示" End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,將彈出消息窗口,同時單元格合集已選中,如圖1.18所示。
[6] 單擊“確定”按鈕后將彈出下一個消息框,同時單元格交集已選中,如圖1.19所示。

圖1.18 選擇合集

圖1.19 選擇交集
提示
本實例參見光盤樣本:..\第1部分\實例7.xlsm。
【相關知識說明】
(1)Application.Union:返回兩個或多個區域的合并區域。
(2)Application.Intersect:該對象表示兩個或多個區域重疊的矩形區域。
(3)[a6:f8]:這是range("a6:f8")的另一種寫法,作用相同。
實例8 選擇背景色為黃色的單元格
【技巧說明】 選擇背景色為黃色的單元格。
【案例介紹】 公司接單表中為了區分下單企業所在城市,將每一個城市的企業下單數據以不同顏色設置背景色,假設廣州方向的訂單取消需要清除資料時,則需要先選中黃色背景數據所在行。

圖1.20 以顏色區分下單企業的接單表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇黃色區域() Dim rng As Range, rg As Range '聲明變量 For Each rng In ActiveSheet.UsedRange '進入循環 If rng.Interior.Color=65535 Then '檢查背景色是否為黃色 If rg Is Nothing Then Set rg=rng Else Set rg=Application.Union(rg, rng) '將黃色背景單元格合并為一個單元格合集 End If End If Next '檢查下一個 rg.Select '選擇黃色背景區域 End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到所有黃色背景之單元格已被選中,如圖1.21所示。

圖1.21 選擇所有黃色背景之單元格
提示
本實例參見光盤樣本:..\第1部分\實例8.xlsm。
【相關知識說明】
(range).Interior.Color:表示(單元格)內部顏色。也可以用RGB(0,0,0)形式表示。例如,以下代碼將單元格A5背景色設置為紅色(RGB三個參數都是0~255的阿拉伯數字表示):
Sub單元格顏色() [a5].Interior.Color=RGB(255, 0, 0) End Sub
實例9 選擇字體為藍色之單元格
【技巧說明】 選擇字體為藍色之單元格。
【案例介紹】 以實例8數據為基準,假設該接單表不是使用背景色,而是以字體色區分下單企業所在城市,如圖1.22所示。

圖1.22 以字體色區分下單企業的接單表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇藍色字體區域() Dim rng As Range, rg As Range '聲明變量 For Each rng In ActiveSheet.UsedRange '進入循環 If rng.Font.ColorIndex=5 Then '檢查字體色是否為藍色 If rg Is Nothing Then Set rg=rng Else Set rg=Application.Union(rg, rng) '將字體色為藍色單元格合并為一個單元格合集 End If End If Next '檢查下一個 rg.Select '選擇藍色字體區域 End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到所有藍色字體色之單元格已被選中,如圖1.23所示。

圖1.23 選擇所有藍色字體色之單元格
提示
本實例參見光盤樣本:..\第1部分\實例9.xlsm。
【相關知識說明】
(range).Font.ColorIndex:表示(單元格)字體顏色地址,可用1~56表示。可以用以下代碼列出所有顏色地址對應的顏色:
Sub顏色() Dim i As Byte For i=1 To 56 Cells(i, 1)="ColorIndex" & i Cells(i, 2).Interior.ColorIndex=i Next End Sub
實例10 選擇粗線邊框之單元格
【技巧說明】 選擇當前表已用區域中粗線邊框之單元格。
【案例介紹】 如圖1.24所示之成績表,表中部分單元格邊框為虛線,部分為加粗實線,加粗實線邊框表示未及格人員成績,現需選擇所有未及格成績的單元格。

圖1.24 成績表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇粗線邊框之單元格() On Error Resume Next Dim rng As Range, rg As Range For Each rng In ActiveSheet.UsedRange If rng.Borders(xlEdgeRight).Weight=xlMedium And rng.Borders (xlEdgeTop).Weight=xlMedium _ And rng.Borders(xlEdgeBottom).Weight=xlMedium And rng.Borders (xlEdgeLeft).Weight=xlMedium Then If rg Is Nothing Then Set rg=rng Else Set rg=Application.Union(rg, rng) End If End If Next rg.Select End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到所有加粗實線邊框之單元格已被選中,如圖1.25所示。

圖1.25 選擇所有加粗實線邊框之單元格
提示
本實例參見光盤樣本:..\第1部分\實例10.xlsm。
【相關知識說明】
(1)Borders.Weight:指定某一區域周圍邊框的寬度。
Borders有一個參數表示方向,xlEdgeRight表示單元格的右邊框;xlEdgeTop、xlEdgeBottom、xlEdgeLeft則分別表示上邊框、下邊框和左邊框。
(2)xlMedium:表示單元格邊框的粗細,共有4種可選值,本例中為中等粗細。具體見表1.3。
表1.3 表示邊框粗細的4種可選值

(3)On Error Resume Next:當程序錯誤時繼續運行下句代碼。本例中最后一步是選擇帶有粗線邊框的單元格,假設在指定區域中不存在粗線邊框的單元格,則程序運行到此句時要出錯,加上“On Error Resume Next”則可以跳過錯誤。
實例11 反向選擇工作表
【技巧說明】 選擇當前已選擇區域以外的區域。
【案例介紹】 資源管理器中有反向選擇,可以選擇已選文件以外的所有文件;Excel區域(必須是多單元格)中也可反向選擇。如圖1.26所示,已選中B組成員之區域D1∶E11,而反向區域則是A1∶H11中排除D1∶E11的區域。

圖1.26 已選中B組成員區域
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub反向選擇() Application.DisplayAlerts=False '禁用警告提示 Application.ScreenUpdating=False '禁止屏幕更新 Dim raddress As String, taddress As String '聲明變量 raddress=Selection.Address taddress=ActiveSheet.UsedRange.Address With Sheets.Add '添加一個新工作表 .Range(taddress)=0 '對新表賦值 .Range(raddress)="=0" '對新表賦值 raddress=.Range(taddress).SpecialCells(xlCellTypeConstants, 1).Address '重新設置raddress為含有常量的單元格地址 .Delete '刪除新工作表 End With ActiveSheet.Range(raddress).Select '反向區域選擇 Application.ScreenUpdating=True '開啟屏幕更新 End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 選中B組成員之區域D1∶E11,使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到選中區域以外的單元格已被選中,如圖1.27所示。

圖1.27 反向選擇后的區域
提示
本實例參見光盤樣本:..\第1部分\實例11.xlsm。
【相關知識說明】
(1)DisplayAlerts:如果宏運行時Microsoft Excel顯示特定的警告和消息,則該屬性值為True。Boolean類型,可讀寫。本例中作用為刪除工作表時不彈出警告消息框。
(2)ScreenUpdating:如果啟用屏幕更新,則該屬性值為True。Boolean類型,可讀寫。本例中程序運行前將之設為False,即關閉屏幕更新,可以加快程序運行,在程序完畢后恢復更新。
(3)Sheets.Add:新建一個工作表。
(4)Range.SpecialCells:返回一個Range對象,該對象代表與指定類型和值匹配的所有單元格。本例中xlCellTypeConstants參數表示函數有常量的單元格。
實例12 選擇單元格區域但排除首行標題
【技巧說明】 選擇當前表已用區域但排除首行標題。
【案例介紹】 以實例11的數據為例,首行為標題行A1∶H1,若需要對正文區A2∶H11(標題以外的區域)進行排序、背景標示等,則都需要先選擇標首除外的區域。
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub排除標題行() Application.Intersect(ActiveSheet.UsedRange, ActiveSheet.UsedRange. Offset(1, 0)).Select End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到標題行以外的區域已被選中,如圖1.28所示。

圖1.28 選擇標題行以外的區域
提示
本實例參見光盤樣本:..\第1部分\實例12.xlsm。
實例13 每隔三行選一行
【技巧說明】 將當前表已用區域每隔三行選一行。
【案例介紹】 如圖1.29所示之簡易工資表,其中行數為3的N次方的單元格存放的是員工薪資,現需要為薪資行添加背景以突出顯示,則需每隔三行選擇一行。

圖1.29 簡易工資表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub隔三行選一行() Dim rng As Range, i As Long Application.ScreenUpdating=False '關閉屏幕刷新 i=ActiveSheet.UsedRange.Rows.Count '計算已用行數 With Range("XFD1:XFD" & i) '在最末列輸入公式作為輔助區 .Formula="=if(mod(row(),3),1,0/0)" '列號為除以3余數為1時顯示1 '否則顯示一個0/0的錯誤值 Set rng=.SpecialCells(xlCellTypeFormulas, 16).EntireRow '參數16表示錯誤值 rng.Select '選擇目標行 .Value="" '清空輸入區數據 End With Application.ScreenUpdating=True '恢復屏幕更新 End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到行號為3的N次方的行已被選中,如圖1.30所示。

圖1.30 每隔三行選一行
提示
本實例參見光盤樣本:..\第1部分\實例13.xlsm。
【相關知識說明】
(1)Range.Formula:即在單元格中輸入公式,本例中公式為“=if(mod(row (),3),1,0/0)”。
(2)SpecialCells(xlCellTypeFormulas, 16):表示包含錯誤值的所有單元格。
(3)EntireRow:表示整行,如[a3]. EntireRowg表示第3行。
實例14 選擇奇數列
【技巧說明】 選擇當前表已用區域之奇數列。
【案例介紹】 如圖1.31所示之員工資料表,其中奇數列存放員工姓名,現需提取員工姓名,則需先選中奇數列并排除首行之數據。

圖1.31 員工資料表
【案例實現】 操作步驟如下:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub選擇奇數列() Dim rng As Range, rang As Range, i As Long Application.ScreenUpdating=False '關閉屏幕刷新 i=ActiveSheet.UsedRange.Columns.Count '計算已用列數 Set rang=ActiveSheet.UsedRange With Range(Range("A1048576"), Cells(1048576, i)) '在最末行輸入公式作為輔助區 .Formula="=if(mod(column(),2),0/0,1)" '列號為除以2余數為1時顯示一個0/0的錯誤值,否則顯示1 Set rng=.SpecialCells(xlCellTypeFormulas, 16).EntireColumn '參數16表示錯誤值 Application.Intersect(rng, rang, rang.Offset(1, 0)).Select '選擇目標列與已用區域的交集 .Value="" '清空輸入區數據 End With Application.ScreenUpdating=True '恢復屏幕更新 End Sub
[4] 關閉VBE窗口返回到工作表。
[5] 使用快捷鍵Alt+F8調出運行宏窗口,然后單擊“執行”按鈕,可以看到所有姓名已被選中,可以隨意粘貼至其他區域,如圖1.32所示。

圖1.32 選擇奇數列且排除標題
提示
本實例參見光盤樣本:..\第1部分\實例14.xlsm。
- 完全掌握Office 2010高效辦公超級手冊
- Word/Excel 2016商務辦公實戰從新手到高手
- Office 2016入門與提高
- OpenCV Computer Vision Application Programming Cookbook Second Edition
- Excel高效辦公:市場與銷售管理(修訂版)
- Office 2003辦公應用實戰從入門到精通
- Excel 2010高效辦公:會計實務與財務管理
- 一看即會:電腦組裝·系統安裝·日常維護與故障排除(超值視頻教學版)
- 精英演示:PPT的商務演示藝術
- Excel 2010電子表格
- 實訓教程:電腦入門
- PPT 設計實戰從入門到精通(第2版)
- 電腦辦公實戰從入門到精通(超值版)
- WPS Office辦公應用基礎教程
- Excel函數、圖表與透視表從入門到精通(全新版)