Workbook 對象 應用實例續

Worksheet對象 應用示例 

 

.net技術 2010-09-16 11:57:55 閱讀44 評論0   字號: 訂閱

Worksheet對象代表Excel工作表,Worksheets集合對象代表Excel工作表的集合。下面,我們來探討Worksheet對象和Worksheets集合的一些屬性和方法的應用。
Worksheet(s)對象應用基礎
[應用1]激活工作表(Activate方法)
使用Activate方法來激活某工作表,例如:
ThisWorkbook.Worksheets("Sheet1").Activate
上述代碼使得含有該代碼的工作簿中工作表Sheet1成爲活動工作表。
[應用2]增加工作表(Add方法)
使用Worksheets對象的Add方法增加工作表,其語法爲:
Worksheets.Add(Before,After,Count,Type)
其中,參數Before指定一個工作表,新增的工作表將放置在該工作表之前。參數After指定一個工作表,新增的工作表將放置在該工作表之後。這兩個參數不能同時使用。若兩個參數都沒有使用,則新增的工作表會放置在當前工作表之前。
參數Count指定增加的工作表數目,默認值爲1。參數Type指定增加的工作表類型,爲XlSheetType常量之一:xlWorksheet、xlChart、xlExcel4MacroSheet或xlExcel4IntlMacroSheet,默認值爲標準工作表(xlWorksheet)。如果希望基於現有模板插入工作表,則指定該模板的路徑。
[應用3]複製工作表(Copy方法)
使用Copy方法複製指定的工作表,其語法爲:
工作表對象.Copy(Before,After)
其中,參數Before和After均可選,用來指定所複製的工作表放置的位置,但不能同時使用這兩個參數。使用參數Before將所複製的工作表放置在該參數指定的工作表之前,同理,使用參數After將所複製的工作表放置在該參數指定的工作表之後。
例如,下面的代碼複製當前工作表,並將其放置在所有工作表的末尾:
ActiveSheet.Copy After:=Worksheets(Worksheets.Count)
如果沒有指定參數,那麼Excel將新建一個工作簿,該工作簿包含所複製的工作表。
[應用4]移動工作表(Move方法)
使用Move方法將工作表移動到工作簿的指定位置,其語法爲:
工作表對象.Move(Before,After)
其語法與Copy方法相同。例如,下面的代碼將工作表Sheet1移到工作表Sheet3的後面:
Worksheets("Sheet1").Move After:=Worksheets("Sheet3")
[應用5]獲取或者設置工作表名稱(Name屬性)
可以使用Name屬性返回指定工作表的名稱,也可以設置指定工作表的名稱,例如,下面的代碼將工作表Sheet1重命名爲“示例”:
Worksheets("Sheet1").Name = "示例" 
下面的過程使用用戶輸入的名稱重命名當前工作表:
Sub ReNameSheet() Dim xStr As String Retry: Err.Clear xStr = InputBox("請輸入工作表的新名稱:" _ , "重命名工作表", ActiveSheet.Name) If xStr = "" Then Exit Sub On Error Resume Next ActiveSheet.Name = xStr If Err.Number <> 0 Then MsgBox Err.Number & " " & Err.Description Err.Clear GoTo Retry End If On Error GoTo 0 '.........  End Sub 
[應用6]使用工作表代碼名稱(CodeName屬性)
工作表對象的CodeName屬性返回工作表代碼名稱,其語法爲:
工作表對象.CodeName
能夠在屬性窗口中設置工作表代碼名稱。假設我們在屬性窗口將工作表Sheet1的代碼名稱設置爲Sheet1CodeName,那麼下面的兩句代碼是等價的:
Worksheets("Sheet1").Activate Sheet1CodeName.Activate
當我們第一次創建工作表時,工作表名稱和代碼名稱是相同的,然而兩個名稱可以各自單獨修改,但是工作表代碼名稱僅能在設計時修改而不能在運行時修改。
[應用7]刪除工作表(Delete方法)
使用Delete方法刪除指定的工作表,其語法爲:
工作表對象.Delete
例如,下面的語句刪除工作簿中名爲“示例”的工作表:
Worksheets("示例").Delete
默認情況下,在刪除工作表時會顯示一個對話框。此時,Delete方法返回一個布爾值,如果用戶單擊“取消”則返回False,單擊“刪除”則返回True。
[應用8]選擇工作表(Select方法)
可以使用Select方法選擇工作表。與Activate方法不同,使用Select方法可以同時選擇多個工作表,例如下面的代碼同時選擇當前工作表以及索引值爲1和2的工作表:
Worksheets(1).Select (False) Worksheets(2).Select (False)
其語法爲:
工作表對象.Select(Replace)
其中,參數Replace可選,設置爲True時使用指定的工作表的選區代替當前選擇,設置False時擴展當前所選內容以包括以前選擇的對象和指定的對象。
[應用9]選擇工作表(Previous屬性和Next屬性)
使用工作表對象的Previous屬性選擇指定工作表之前的工作表,例如:
Sub PreviousSheet() If ActiveSheet.Index <> 1 Then MsgBox "選取當前工作簿中當前工作表的前一個工作表" ActiveSheet.Previous.Activate Else MsgBox "已到第一個工作表" End If End Sub 
如果當前工作表是第一個工作表,則使用Previous屬性會出錯。
使用工作表對象的Next屬性選擇指定工作表之後的工作表,例如:
Sub NextSheet() If ActiveSheet.Index <> Worksheets.Count Then MsgBox "選取當前工作簿中當前工作表的下一個工作表" ActiveSheet.Next.Activate Else MsgBox "已到最後一個工作表" End If End Sub 
如果當前工作表是最後一個工作表,則使用Next屬性會出錯。
[應用10]獲取工作表數(Count屬性)
使用集合對象的Count屬性來獲取工作簿中工作表的數目。例如下面的兩段代碼:
Sub WorksheetNum() Dim i As Long i = Worksheets.Count MsgBox "當前工作簿的工作表數爲:" & Chr(10) & i End Sub  Sub WorksheetNum() Dim i As Long i = Sheets.Count MsgBox "當前工作簿的工作表數爲:" & Chr(10) & i End Sub 
在一個包含圖表工作表的工作簿中運行上述兩段代碼,將會得出不同的結果,原因是對於Sheets集合來講,工作表包含圖表工作表。應注意Worksheets集合與Sheets集合的區別。
[應用11]保存工作表(SaveAs方法)
使用SaveAs方法將更改後的工作表保存到另一個文件中,其語法爲:
工作表對象.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AddToMru, TextCodepage, TextVisualLayout, Local)
其中,參數FileName用來指定用來保存文件的路徑及文件名,若沒有包括路徑,則保存在當前文件夾中。參數FileFormat指定所保存的文件格式,爲XlFileFormat常量之一。參數Password指定在保存文件時用於保護文件的密碼,最大可以達到15個字符,區分大小寫。參數WriteResPassword指定文件的寫保護密碼,如果打開文件時沒有輸入寫保護密碼,那麼該文件將只讀。如果將參數ReadOnlyRecommended設置爲True,那麼在打開文件時顯示一條消息,提示該文件以只讀方式打開。將參數CreateBackup設置爲True,創建備份文件。將參數AddToMru設置爲True,添加工作簿到最近使用的文件列表中,默認爲False。
[應用12]隱藏工作表(Visible屬性)
可以通過將工作表對象的Visible屬性設置爲True或False,來控制該工作表是否可見。例如,下面的代碼隱藏工作表Sheet1:
Worksheets("Sheet1").Visible = False 
當然,也可以將Visible屬性設置爲XlSheetVisibility值:xlSheetVisible、xlSheetHidden、xlSheetVeryHidden,來控制工作表是否可見。其中,xlSheetVisible表示顯示工作表,xlSheetHidden表示隱藏工作表,但可以通過菜單命令顯示工作表,xlSheetVeryHidden表示隱藏工作表,只能通過代碼將Visible屬性設置爲True來顯示工作表,此時用戶無法使工作表可見。
下面的代碼新建一張工作表,然後將其Visible屬性設爲xlVeryHidden。要引用該工作表,可使用其對象變量newSheet。
Set NewSheet = Worksheets.Add NewSheet.Visible = xlVeryHidden NewSheet.Range("A1:D4").Formula = "=RAND()" 
下面的代碼取消隱藏工作簿中所有工作表。
Sub UnhideAllWorksheets() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws Set ws = Nothing End Sub 
[應用13]保護工作表(Protect方法)
使用Protect方法保護工作表,以防止被修改。其語法爲:
工作表對象.Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables)
其中,參數Password指定用於保護工作表的密碼,區分大小寫。設置參數DrawingObjects爲True以保護形狀,默認值爲False。設置參數Contents爲True,以保護內容,對於圖表則會保護整個圖表,對於工作表則會保護鎖定的單元格,默認值是True。參數Scenarios設置爲True以保護方案,此參數僅對工作表有效,默認值是True。
Protect方法允許單獨保護單元格以免被用戶和代碼修改。特別地,如果參數UserInterfaceOnly設置爲True,那麼用戶不能修改工作表,但能夠通過代碼修改。相反,如果參數UserInterfaceOnly設置爲False(默認值),那麼用戶和代碼都不能修改工作表。
注意,當保護工作表時,如果參數UserInterfaceOnly設置爲True,然後又保存工作簿,那麼再次打開該工作簿時,整張工作表將被完全保護,而不僅僅保護用戶界面。要在打開工作簿後重新啓用用戶界面保護,必須再次將UserInterfaceOnly參數設爲True並應用Protect方法。
[應用14]是否僅啓用用戶界面保護(ProtectionMode)
如果開啓了用戶界面保護,則ProtectionMode屬性返回True。默認值爲False。
[應用15]取消密碼保護(Unprotect方法)
使用Unprotect方法取消工作表的密碼保護,如果工作表沒有密碼保護則無效。其語法爲:
工作表對象.Unprotect(Password)
其中,參數Password代表用來保護工作表的密碼。如果工作表有密碼保護,而我們忽略此參數,那麼Excel將提示用戶輸入密碼。
[示例1]設置密碼保護工作表
Sub ProtectSheet() MsgBox "保護當前工作表並設定密碼" ActiveSheet.Protect Password:="fanjy" End Sub 
運行上述代碼後,當前工作表中將不允許編輯,除非撤銷工作表保護。
[示例2]撤銷工作表保護
Sub UnprotectSheet() MsgBox "撤銷當前工作表保護" ActiveSheet.Unprotect End Sub 
運行上述代碼後,如果原保護的工作表設置有密碼,則要求輸入密碼。
[示例3]保護當前工作簿中的所有工作表
Sub ProtectAllWorkSheets() On Error Resume Next Dim ws As Worksheet Dim myPassword As String myPassword = InputBox("請輸入您的密碼" & vbCrLf & _ "(不輸入表明無密碼)" & vbCrLf & vbCrLf & _ "確保您沒有忘記密碼!", "輸入密碼") For Each ws In ThisWorkbook.Worksheets ws.Protect (myPassword) Next ws End Sub 
[示例4]撤銷對當前工作簿中所有工作表的保護
Sub UnprotectAllWorkSheets() On Error Resume Next Dim ws As Worksheet Dim myPassword As String myPassword = InputBox("請輸入您的密碼" & vbCrLf & _ "(不輸入表示無密碼)", "輸入密碼") For Each ws In ThisWorkbook.Worksheets ws.Unprotect (myPassword) Next ws End Sub 
[示例5]僅能編輯未鎖定的單元格
Sub OnlyEditUnlockedCells() Sheets("Sheet1").EnableSelection = xlUnlockedCells ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub 
運行上述代碼後,在當前工作表中將只能對未鎖定的單元格進行編輯,而其它單元格將不能編輯。未鎖定的單元格是指在選擇菜單“格式——單元格”命令後在彈出的對話框中的“保護”選項卡中,未選中“鎖定”複選框的單元格或單元格區域。
[應用16]打印預覽工作表(PrintPreview方法)
使用PrintPreview方法完成打印預覽功能,即按對象打印後的外觀效果顯示對象的預覽。其語法爲:
工作表對象.PrintPreview(EnableChanges)
其中,參數EnableChanges指定用戶是否可更改邊距和打印預覽中可用的其他頁面設置選項。
[應用17]打印工作表(Print方法)
使用Print方法打印工作表,其語法爲:
工作表對象.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)
其中,參數From指定打印的第一頁的頁碼,參數To指定打印的最後一頁的頁碼,如果忽略則打印完整的對象。參數Copies指定打印的份數,默認值爲1。參數Preview爲True,Excel將在打印對象之前調用打印預覽,如果爲False(默認值),則立即打印對象。參數ActivePrinter設置活動打印機的名稱。如果設置參數PrintToFile爲True,則打印到文件,此時如果沒有指定參數PrToFileName,Excel將提示用戶輸入要使用的輸出文件的文件名。參數Collate設置爲True,逐份打印多份副本。參數IgnorePrintAreas設置爲True,則忽略打印區域並打印整個對象。
[應用18]顯示數據記錄單(ShowDataForm方法)
使用ShowDataForm方法顯示與指定工作表相關聯的數據記錄單,其語法爲:
工作表對象.ShowDataForm
注意,宏執行到顯示數據記錄單語句時運行會暫停。關閉數據記錄單後,宏將從ShowDataForm方法的下一語句開始繼續執行。如果存在自定義數據記錄單,則本方法將運行此記錄單。
在Excel 2007的功能區中並沒有顯示記錄單命令,該命令被隱藏,因此可以使用ShowDataForm方法調出記錄單。
[應用19]獲取工作表中已使用的區域(UsedRange屬性)
使用工作表對象的UsedRange屬性返回工作表中已使用的區域。該屬性返回Range對象,代表當前已使用的單元格組成的矩形區域,是非常有用的屬性。其語法爲:
工作表對象.UsedRange
注意,有時雖然徹底清除了某單元格,但該屬性仍返回包含該單元格的區域。
[應用20]在工作表中粘貼內容(PasteSpecial方法)
使用PasteSpecial方法以指定格式將剪貼板中的內容粘貼到工作表上。可使用本方法從其他應用程序中粘貼數據,或以特定格式粘貼數據。其語法爲:
工作表對象.PasteSpecial(Format, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, NoHTMLFormatting)
經常使用的語法爲:
工作表對象.PasteSpecial(Format)
其中,參數Format指定要粘貼的數據格式的字符串。
例如,下面的代碼將剪貼板中的Microsoft Word文檔對象粘貼到工作表Sheet1上的單元格D1中:
Worksheets("Sheet1").Range("D1").Select ActiveSheet.PasteSpecial Format:= _ "Microsoft Word 12.0 Document Object" 
注意,在使用PastSpecial方法之前,必須選擇目標區域。該方法可能會修改工作表的選定區域。
[應用21]計算工作表(Calculate方法)
可以使用Calculate方法計算指定的工作表、工作表中的單元格區域或者整個工作簿。例如,下面的代碼計算工作簿中的第一張工作表:
Worksheets(1).Calculate
[應用22]重新計算工作表(EnableCalculation屬性)
當EnableCalculation屬性設置爲True時,在必要情況下Excel自動重新計算工作表。否則,必須請求重新計算。
當該屬性第一次被設置爲True時,Excel將重新計算工作表。
[應用23]控制自動篩選下拉箭頭(AutoFilterMode屬性)
如果當前在工作表中顯示自動篩選下拉箭頭,則AutoFilterMode屬性爲True。我們可以將該屬性設置爲False,移除箭頭。然而,不能將該屬性設置爲True。要顯示自動篩選下拉箭頭,使用AutoFilter方法。
[應用24]工作表是否處於篩選模式(FilterMode屬性)
如果工作表處於篩選模式,則FilterMode屬性爲True。因此,如果顯示了自動篩選下拉箭頭但沒有發生篩選,那麼AutoFilterMode屬性爲True而FilterMode屬性爲False。一旦實際上執行了篩選,那麼FilterMode屬性就爲True。FilterMode屬性指明是否由於篩選而隱藏了行。
[應用25]轉換名稱(Evaluate方法)
使用工作表對象的Evaluate方法將名稱轉換爲對象或值。
[應用26]設置工作表滾動區域(ScrollArea屬性)
使用ScrollArea屬性返回或者設置允許滾動的區域,用戶不能選擇滾動區域之外的區域。設置時,必須爲A1樣式的單元格引用。例如,下面的代碼將單元格區域A1:C50設置爲允許滾動區域,僅能夠在單元格區域A1:C50範圍內滾動或選擇單元格:
Worksheets(1).ScrollArea = "A1:C50" 
要移除單元格滾動或選擇的限制,只須將該屬性的值設置爲空,例如:
Worksheets(1).ScrollArea = "" 
注意,設置滾動區域與凍結窗格無關。
[應用27]爲工作表設置背景(SetBackgroundPicture方法)
使用SetBackgroundPicture方法爲工作表設置背景圖片,其語法爲:
工作表對象.SetBackgroundPicture(FileName)
其中,參數FileName爲用於背景的圖片路徑和名稱。例如,下面的代碼爲第一張工作表設置背景圖片:
Worksheets(1).SetBackgroundPicture "c:\graphics\watermark.gif" 

[應用28] Worksheets集合與Sheets集合對於不熟悉Excel的人來說,可能會混淆Sheets集合和Worksheets集合之間的不同。Worksheets集合包含典型的Excel工作表(即通常我們說的工作表),即包含有行、列、單元格和公式等的工作表,而Sheets集合不僅僅是工作表的集合,而且也包含其它類型的工作表,例如圖表工作表、Excel 4.0宏工作表(也稱作XLM文件)和Excel 5.0對話框工作表(允許創建自定義對話框)。圖表工作表是佔用了整個工作表的圖表,而不是插入作爲工作表一部分的圖表。Excel 4工作表和Excel 5工作表用於保持Excel向後兼容,並且也很容易轉換爲新的工作表類型。進一步說,圖表工作表也組成了Charts集合。Worksheets集合的Count屬性返回工作簿中工作表的數量,而Sheets集合的Count屬性則返回工作簿中所有工作表的數量,包含圖表工作表和工作表。例如,使用下面的語句添加指定數量的工作表到工作簿中:
Do While Worksheets.Count < 5 ThisWorkbook.Sheets.Add Loop 
添加的工作表可以是圖表工作表或者是工作表,分別包含於Charts集合或Worksheets集合,或者是Sheets集合的成員。下面的代碼修改工作簿中最後一個工作表的名稱:
Dim wrkSheetName As String wrkSheetName = "Sample Chart" Sheets(Sheets.Count).Name = wrkSheetName
注意,因爲使用了Sheets集合,工作簿中最後一個工作表可能是工作表也可能是圖表工作表。
因爲Sheets集合包含有更多類型的工作表,所以其包含的方法比Worksheets集合更多。然而,兩個集合都有添加、刪除、複製和移動工作表的方法。
[應用29]組合工作表
在Excel中,我們可以通過在按下Shift鍵或Ctrl鍵的同時,單擊其它工作表標籤來手工組合工作簿中的工作表。在VBA中,可以通過使用Worksheets集合的Select方法並結合Array函數來組合工作表。例如,下面的代碼組合工作簿中的第1、第3和第5個工作表,並使第3個工作表成爲活動工作表:
Worksheets(Array(1, 3, 5)).Select Worksheets(3).Activate
也可以使用Worksheet對象的Select方法創建工作表組。首先按正常的方式選擇第1個工作表,然後通過使用Select方法並將其參數Replace設置爲False,從而將其他工作表添加到組中。
Sub GroupWorksheets() Dim arrstrNames(1 To 3) As String Dim i As Integer arrstrNames(1) = "Sample1" arrstrNames(2) = "Sample2" arrstrNames(3) = "Sample3" Worksheets(arrstrNames(1)).Select For i = 2 To 3 Worksheets(arrstrNames(i)).Select Replace:=False Next i End Sub 
然而,在VBA中組合工作表後,對工作表的更改將隻影響活動工作表,如果需要更改其他工作表,則需要使用循環語句遍歷工作表並作相應的更改。
Sub FormatWorksheetsGroup() Dim shts As Sheets Dim wks As Worksheet Set shts = Worksheets(Array(1, 3, 5)) For Each wks In shts wks.Range("A1").Value = 100 wks.Range("A1").Font.Bold = True Next wks End Sub 
[應用30]Activate方法與Select方法的區別
當需要激活或者是選擇某個工作表時,使用Sheets(1).Activate和Sheets(1).Select的作用表面上看起來是相同的。但是,如果將需要激活或者是選擇的工作表隱藏後,使用Sheets(1).Select將會出現錯誤,而使用Sheets(1).Activate則會正常運行,例如下面的代碼:
'- - - 下面的代碼運行正常 - - - - Sub test1() Sheets(1).Visible = xlHidden Sheets(1).Activate End Sub '- - - 下面的代碼運行錯誤,作用於對象的方法無效 - - - - Sub test2() Sheets(1).Visible = xlHidden Sheets(1).Select End Sub 
Activate方法是用來激活對象的方法,而Select方法是用來選取對象的方法,能使用Select方法一次選取多個工作表,但不能使用Activate方法一次激活多個工作表,一次只能激活一個工作表。詳見下面的代碼示例:
'- - - 下面的代碼運行正常 - - - - Sub Test3() ActiveWorkbook.Sheets(Array(1, 2, 3)).Select End Sub '- - - 下面的代碼運行錯誤,對象不支持該屬性和方法 - - - - Sub Test4() ActiveWorkbook.Sheets(Array(1, 2, 3)).Activate End Sub 
當然,上述內容同樣適用於Worksheets集合。
[應用31]工作表名稱的使用
可以在代碼中採用下面的三種方式引用工作表:
(1)該工作表在工作簿中的位置(索引號)。索引號自工作表標籤最左邊向右依次計數,最左邊的是第1個工作表,依次爲第2個、3個……等等。
(2)該工作表的名稱,即在工作表左下角中看到的工作表標籤中的名稱。
(3)該工作表的對象名稱,即在創建工作表時自動分配給該工作表的名稱(在VBE編輯器中的工程窗口中可以看到)。
通常,在代碼中引用工作表時,我們所使用的是工作表對象的Index屬性和Name屬性,例如 Worksheets(1).Select或者
Worksheets(”Sheet1″).Select。
但是,如果工作表的名稱被改變或者工作表被重新排序或者刪除其中的一些工作表後,則不能使用工作表對象的Name屬性或Index屬性引用所需要的工作表,這可能使已經編寫好的代碼出現錯誤。因此,我們應該考慮雖然工作簿中的工作表改變但不影響工作表引用的辦法,可以使用工作表對象的名稱避免這種情況,即上面所講的第3種方式,無論是在工作簿中增加或刪除其它工作表,還是對工作表排序,或者是重命名需要引用的該工作表,其對象名都不變(除非您刪除該工作表,或者是在VBE窗口中重命名該對象)。工作表對象的名稱可以在VBE編程器中看到。例如,Sheet1(Sheet1),左邊是工作表對象的名稱,右邊的括號中是工作表名,括號中的工作表名可以通過在工作簿界面中改變相應的工作表標籤名來改變,如果在工作表中重命名Sheet1工作表爲“數據工作表”,則工程屬性窗口中的名稱爲:Sheet1(數據工作表)。如果工作表Sheet3的對象名稱是“主工作表”,而在Excel中,如果將工作表Sheet3的名稱修改爲“數據工作表”,在VBE編程器的工程窗口中,“Sheet3”將變成“數據工作表”,但是該工作表的對象名稱仍爲“主工作表”。
改變工作表對象名稱的方法是,通過改變屬性窗口中的(名稱)或者在代碼中使用Properties(”_CodeName”)。下面的代碼將會添加一個工作表並將該工作表的對象名稱命名爲“ws_main”,這樣,在後面的代碼中就可以使用該對象名稱來引用這個工作表,而不必擔心工作表名稱改變或工作表順序改變。
Sub ChageWksObjectName() Dim ws As Worksheet Dim sPrevCodeName As String Dim sNewCodeName As String '設置新對象的名稱 sNewCodeName = "ws_main" '增加新工作表  Set ws = Worksheets.Add '獲取新增工作表的對象名稱 sPrevCodeName = ws.CodeName '變化新增工作表的對象名稱 ThisWorkbook.VBProject.VBComponents(sPrevCodeName). _ Properties("_CodeName") = sNewCodeName End Sub Sub Test() ws_main.Range("A1").Value = "This is it!" End Sub 
注意,雖然使用工作表代碼名稱有很多優點,例如不受用戶更改工作表名稱以及工作表順序的影響、容易處理複製粘貼操作等,但是不可以跨工作簿使用工作表代碼名稱,即不能在一個工作簿中使用另一個工作簿中的工作表代碼名稱。
[應用32]引用工作表的方法
下面的示例簡單的介紹了工作表的引用方法。在示例中,使用了工作表Sheet1。
(1)指定工作表的位置激活工作表。下面的代碼激活工作簿中的第1個工作表,即工作表標籤最左邊的工作表。(如果增加或刪除了其中某工作表,或者是對工作表進行排序後,可能引用的不是您想引用的工作表)
Sub ActivateFirstsheetInBook() Sheets(1).Activate End Sub 
或者:
Sub ReferenceShtByIndexNumber() Sheets(1).[A1:D4].Copy Sheets(2).[A1] End Sub 
(2)通過工作表的名稱激活工作表,而不管工作表處於工作簿中的什麼位置以及工作表對象的代碼名稱。(如果該工作表被重命名後,運行代碼會出錯)
Sub ActivateSheet1_1() Sheets("Sheet1").Activate End Sub 
或者:
Sub ReferenceShtByGivenName() [Sheet1!A1:D4].Copy [Sheet2!A1] End Sub 
(3)通過工作表對象的名稱激活工作表,而不管該工作表處於工作簿中的什麼位置以及該工作表的名稱
Sub ActivateSheet1_2() Sheet1.Activate End Sub 
或者:
Sub ReferenceShtByCodeName() Sheet1.[A1:D4].Copy Sheet2.[A1] End Sub 
[應用33]判斷工作簿中是否存在指定名稱的工作表
[代碼1]下面的函數判斷是否存在指定工作表名稱的工作表:
Function WorksheetExists(wb As Workbook, strName As String) As Boolean Dim str As String On Error GoTo worksheetExistsErr str = wb.Worksheets(strName).Name WorksheetExists = True Exit Function worksheetExistsErr: WorksheetExists = False End Function 
如果指定名稱的工作表存在,WorksheetExists函數返回True,否則返回False,表示該工作表不存在。
[代碼2]下面的函數判斷是否存在指定工作表代碼名稱的工作表:
Function WorksheetCodeNameExists(wb As Workbook, sCodeName As String) As Boolean Dim str As String Dim ws As Worksheet WorksheetCodeNameExists = False For Each ws In wb.Worksheets If StrComp(ws.CodeName, sCodeName, vbTextCompare) = 0 Then WorksheetCodeNameExists = True Exit For End If Next Set ws = Nothing End Function 
[代碼3]下面的函數判斷指定名稱的工作表是否存在
Function SheetExists(SheetName As String) As Boolean SheetExists = False On Error GoTo NoSuchSheet If Len(Sheets(SheetName).Name) > 0 Then SheetExists = True Exit Function End If NoSuchSheet: End Function 
[代碼4]下面的函數判斷指定名稱的工作表是否存在
Function DoesWksExist1(sWksName As String) As Boolean Dim i As Long For i = Worksheets.Count To 1 Step -1 If Sheets(i).Name = sWksName Then Exit For End If Next If i = 0 Then DoesWksExist1 = False Else DoesWksExist1 = True End If End Function 
[代碼5]下面的函數判斷指定名稱的工作表是否存在
Function DoesWksExist2(sWksName As String) As Boolean Dim wkb As Worksheet On Error Resume Next Set wkb = Sheets(sWksName) On Error GoTo 0 DoesWksExist2 = IIf(Not wkb Is Nothing, True, False) End Function 
[代碼6]下面的函數判斷指定名稱的工作表是否存在
Function SheetExists(sname) As Boolean '如果活動工作簿中存在該工作表則返回True  Dim x As Object On Error Resume Next Set x = ActiveWorkbook.Sheets(sname) If Err = 0 Then SheetExists = True Else SheetExists = False End Function 
[代碼7]下面的函數判斷工作表是否存在工作簿中
Function SheetExists(SName As String, Optional wb As Workbook) As Boolean Dim ws As Worksheet '默認使用活動工作表  If wb Is Nothing Then Set wb = ActiveWorkbook End If On Error Resume Next SheetExists = CBool(Not wb.Sheets(SName) Is Nothing) On Error GoTo 0 End Function 
[應用34]工作表行和列的操作
[示例1] 隱藏行
Sub HideRow() Dim iRow As Long MsgBox "隱藏當前單元格所在的行" iRow = ActiveCell.Row ActiveSheet.Rows(iRow).Hidden = True MsgBox "取消隱藏" ActiveSheet.Rows(iRow).Hidden = False End Sub 
[示例2] 隱藏列
Sub HideColumn() Dim iColumn As Long MsgBox "隱藏當前單元格所在列" iColumn = ActiveCell.Column ActiveSheet.Columns(iColumn).Hidden = True MsgBox "取消隱藏" ActiveSheet.Columns(iColumn).Hidden = False End Sub 
[示例3] 插入行
Sub InsertRow() Dim rRow As Long MsgBox "在當前單元格上方插入一行" rRow = Selection.Row ActiveSheet.Rows(rRow).Insert End Sub 
[示例4] 插入列
Sub InsertColumn() Dim cColumn As Long MsgBox "在當前單元格所在行的左邊插入一行" cColumn = Selection.Column ActiveSheet.Columns(cColumn).Insert End Sub 
[示例5] 插入多行
Sub InsertManyRow() MsgBox "在當前單元格所在行上方插入三行" Dim rRow As Long, i As Long For i = 1 To 3 rRow = Selection.Row ActiveSheet.Rows(rRow).Insert Next i End Sub 
[示例6] 設置行高
Sub SetRowHeight() MsgBox "將當前單元格所在的行高設置爲25" Dim rRow As Long, iRow As Long rRow = ActiveCell.Row iRow = ActiveSheet.Rows(rRow).RowHeight ActiveSheet.Rows(rRow).RowHeight = 25 MsgBox "恢復到原來的行高" ActiveSheet.Rows(rRow).RowHeight = iRow End Sub 
[示例7] 設置列寬
Sub SetColumnWidth() MsgBox "將當前單元格所在列的列寬設置爲20" Dim cColumn As Long, iColumn As Long cColumn = ActiveCell.Column iColumn = ActiveSheet.Columns(cColumn).ColumnWidth ActiveSheet.Columns(cColumn).ColumnWidth = 20 MsgBox "恢復至原來的列寬" ActiveSheet.Columns(cColumn).ColumnWidth = iColumn End Sub 
[示例8] 恢復行高列寬至標準值
Sub ReSetRowHeightAndColumnWidth() MsgBox "將當前單元格所在的行高和列寬恢復爲標準值" Selection.UseStandardHeight = True Selection.UseStandardWidth = True End Sub 
[應用35]工作表標籤操作
[示例1] 設置工作表標籤的顏色
Sub SetSheetTabColor() MsgBox "設置當前工作表標籤的顏色" ActiveSheet.Tab.ColorIndex = 7 End Sub 
[示例2] 恢復工作表標籤顏色
Sub SetSheetTabColorDefault() MsgBox "將當前工作表標籤顏色設置爲默認值" ActiveSheet.Tab.ColorIndex = -4142 End Sub 
[示例3] 交替隱藏或顯示工作表標籤
Sub HideOrShowSheetTab() MsgBox "隱藏/顯示工作表標籤" ActiveWindow.DisplayWorkbookTabs = Not ActiveWindow.DisplayWorkbookTabs End Sub 
[應用36]確定打印的頁數(HPageBreaks屬性與VPageBreaks屬性)
Sub PageCount() Dim i As Long i = (ActiveSheet.HPageBreaks.Count + 1) * (ActiveSheet.VPageBreaks.Count + 1) MsgBox "當前工作表共" & i & "頁." End Sub 
[應用37]排序工作表
方法1:下面是《Writing Excel Macros with VBA》中的一個示例,摘錄於此。
首先驗證用戶是否想排序工作表,如果是則調用SortAllSheets過程來完成排序。
Sub SortSheets() If MsgBox("想排序工作表嗎?", vbOKCancel + vbQuestion, "排序工作表") = vbOK Then SortAllSheets End If End Sub 
下面的代碼首先將工作表的名稱放置在數組中,然後添加新工作表,將代表工作表名稱的數組元素放置在新工作表的第1列,接着對該列排序,將排序好的元素放回數組,並刪除添加的工作表,最後使用Move方法重新排列工作表,從而完成工作表排序。
Sub SortAllSheets() '排序工作表  Dim wb As Workbook Dim ws As Worksheet Dim rng As Range, i As Integer Dim cSheets As Integer Dim sSheets() As String  Set wb = ActiveWorkbook  '獲取數組的實際大小 cSheets = wb.Sheets.Count ReDim sSheets(1 To cSheets)  '使用工作表名稱填充數組  For i = 1 To cSheets sSheets(i) = wb.Sheets(i).Name Next  '創建新的工作表並在其第一列放置名稱  Set ws = wb.Worksheets.Add For i = 1 To cSheets ws.Cells(i, 1).Value = sSheets(i) Next  '排序列 ws.Columns(1).Sort Key1:=ws.Columns(1), Order1:=xlAscending  '重新填充數組  For i = 1 To cSheets sSheets(i) = ws.Cells(i, 1).Value Next  '刪除臨時工作表 Application.DisplayAlerts = False ws.Delete Application.DisplayAlerts = True  '通過移動每個工作表到最後來重新排列工作表  For i = 1 To cSheets wb.Sheets(sSheets(i)).Move After:=wb.Sheets(cSheets) Next End Sub 
方法2:下面是《Mastering Excel 2003 Programming with VBA》一書中的示例,使用冒泡法排序,摘錄於此。
Sub AlphabetizeWorksheets(wb As Workbook) Dim bSorted As Boolean Dim nSheetsSorted As Integer Dim nSheets As Integer Dim n As Integer nSheets = wb.Worksheets.Count nSheetsSorted = 0 Do While (nSheetsSorted < nSheets) And Not bSorted bSorted = True nSheetsSorted = nSheetsSorted + 1 For n = 1 To nSheets - nSheetsSorted If StrComp(wb.Worksheets(n).Name, wb.Worksheets(n + 1).Name, vbTextCompare) > 0 Then wb.Worksheets(n + 1).Move Before:=wb.Worksheets(n) bSorted = False End If Next Loop End Sub 
方法3:
Sub SortWorksheets2() '根據字母對工作表排序  Dim i As Long, j As Long For i = 1 To Sheets.Count For j = 1 To Sheets.Count - 1 If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then Sheets(j).Move After:=Sheets(j + 1) End If Next j Next i End Sub 
方法4:
Sub SortWorksheets3() '以升序排列工作表  Dim sCount As Integer, i As Integer, j As Integer Application.ScreenUpdating = False sCount = Worksheets.Count If sCount = 1 Then Exit Sub For i = 1 To sCount - 1 For j = i + 1 To sCount If Worksheets(j).Name < Worksheets(i).Name Then Worksheets(j).Move Before:=Worksheets(i) End If Next j Next i End Sub 
若想排序所有工作表,將代碼中的Worksheets替換爲Sheets。
[應用38]刪除當前工作簿中的空工作表
Sub Delete_EmptySheets() Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets If Application.WorksheetFunction.CountA(sh.Cells) = 0 Then Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True End If Next End Sub 
[應用39]同步工作表
這是John Walkenbach的一個示例,在工作簿的所有工作表中,選擇與活動工作表所選單元格區域相同的區域,並使左上角單元格爲活動單元格。
Sub SynchSheets() '選擇工作簿其他工作表中與活動工作表所選單元格區域相同的區域  If TypeName(ActiveSheet) <> "Worksheet" Then Exit Sub Dim UserSheet As Worksheet, sht As Worksheet Dim TopRow As Long, LeftCol As Integer Dim UserSel As String   Application.ScreenUpdating = False  '記住當前工作表  Set UserSheet = ActiveSheet  '保存當前工作表的信息 TopRow = ActiveWindow.ScrollRow LeftCol = ActiveWindow.ScrollColumn UserSel = ActiveWindow.RangeSelection.Address  '遍歷工作表  For Each sht In ActiveWorkbook.Worksheets If sht.Visible Then '跳過隱藏的工作表 sht.Activate Range(UserSel).Select ActiveWindow.ScrollRow = TopRow ActiveWindow.ScrollColumn = LeftCol End If Next sht  '恢復原始的位置 UserSheet.Activate Application.ScreenUpdating = True End Sub 
[應用40]經驗提示
1、除非萬不得已,使用VBA對工作表進行操作時,無須先激活該工作表。最好先聲明一個代表工作表的變量,然後使用該變量來引用要操作的工作表。這樣,也會使得代碼的運行速度加快。
2、爲使代碼更健壯,應該採取預防性策略,以確定代碼所操作的工作表存在,否則會因爲重命名工作表或者刪除工作表而引起運行時錯誤。
 
關於UsedRange屬性的基本概念
UsedRange屬性應用於Worksheet對象,返回Range對象,代表指定工作表中已使用的區域,即返回工作表中已使用的單元格區域。因此,該屬性也可以用於選取單元格區域。
下面用一個簡單的例子來說明UsedRange屬性的功能。如下圖1所示的工作表:

圖1:一個帶有數據的工作表
然後,在VBE編輯器中輸入如下代碼:
Sub sample01() Worksheets("Sheet1").UsedRange.Select End Sub 
代碼運行後,上面的工作表顯示如下圖2所示:

圖2:代碼運行後的工作表
即在指定工作表中(本例爲工作表Sheet1)已使用的範圍被全部選中。可以看出,UsedRange屬性返回工作表中所有已使用範圍的單元格區域,而不管該區域數據間是否有空行或空格。
UsedRange屬性的一些常見用法
(1)返回工作表中已使用區域的行數或列數
語句Activesheet.UsedRange.Rows.count返回當前工作表中已使用單元格區域的行數。同樣,語句Activesheet.UsedRange.Columns.count返回當前工作表中已使用單元格區域的列數。在上例中,您可以在立即窗口中輸入下面語句,將返回相應的值。
?Activesheet.UsedRange.Rows.count
20
?Activesheet.UsedRange.Columns.count
4
一般寫法爲<在此輸入引用對象>.UsedRange.Rows.Count和<在此輸入引用對象>.UsedRange.Columns.Count。
(2)返回工作表中已使用單元格區域的地址
語句Activesheet.UsedRange.Address 返回當前工作表已使用單元格區域的地址。在上例中,您可以在立即窗口中輸入下面語句,將返回已使用單元格區域地址爲$A$1:$D$20。
?Activesheet.UsedRange.Address
$A$1:$D$20
一般寫法爲<在此輸入引用對象>.UsedRange.Address
(3)設置工作表中已使用單元格區域對象,並進行引用或操作。如下代碼所示:
Dim cellRange As Range,RowNum As Long,ColNum As Long Set cellRange=Worksheets("Sheet1").UsedRange '設置已用單元格區域並賦值給變量 RowNum=cellRange.Rows.Count '已用單元格區域的行數 ColNum=cellRange.Columns.Count '已用單元格區域的列數 <span style="color: #0000ff;">UsedRange屬性應用示例</span> 現在,我們舉幾個例子,進一步說明UsedRange屬性的用法。 <span style="color: #0000ff;">[示例一]</span>下面的程序在活動工作表已使用單元格區域中,當該區域不包含任何公式時,清除該區域不能打印的字符。其中,ActiveSheet.UsedRange 代表當前工作表中已使用單元格區域組成的Range對象。(By Chip Pearson) <pre lang="vb"> Sub CleanUp() Dim TheCell As Range For Each TheCell In ActiveSheet.UsedRange With TheCell If .HasFormula = False Then .Value = Application.WorksheetFunction.Clean(.Value) End If End With Next TheCell End Sub 
[示例二]下面的程序將當前工作表中已用單元格區域或所選單元格中第一個字符刪除,其中,ActiveSheet.UsedRange.Address代表當前工作表中已用單元格區域的地址。
Public Sub Delete_First_Character(Optional ByRef objRange As Range = Nothing) Dim objCell As Range On Error Resume Next  If (objRange Is Nothing) Then Set objRange = Application.InputBox(Prompt:="請選擇單元格區域", _ Title:="刪除第一個字符", _ Type:=8, _ Default:=ActiveSheet.UsedRange.Address) '設置缺省選區爲已用區域  End If   Err.Clear  Set objRange = objRange.SpecialCells(xlCellTypeConstants)  If (Err.Number <> 0&) Or (objRange Is Nothing) Then MsgBox "在指定的單元格區域中沒有符合要求的單元格.", _ vbExclamation Or vbOKOnly, _ ActiveWorkbook.Name Exit Sub End If  On Error GoTo Exit_Delete_First_Character   Application.ScreenUpdating = False  For Each objCell In objRange objCell = Mid$(objCell, 2) Next objCell   Exit_Delete_First_Character:  On Error Resume Next   Application.ScreenUpdating = True End Sub 
[示例三]在本示例中,當您在工作表的E列中的單元格中輸入“finish”後,點擊右側按鈕,將會對此行用指定的背景色進行標識,如圖3和圖4。

圖3:在E8單元格中輸入“finish”

圖4:點擊按鈕後的效果
當您刪除單元格E6中的數據,如下圖5所示。

圖5:刪除單元格E6中的數據

圖6:點擊按鈕後的效果
本示例中按鈕所附加的代碼如下,其中,UsedRange.Rows.Count表示當前工作表中已使用區域的行數。
Private Sub CommandButton1_Click() Dim r As Long  For r = UsedRange.Rows.Count To 1 Step -1 If Range("E" & r) = "finish" Then _ Range("A:G").Rows(r).Interior.ColorIndex = 10 Next r  For r = UsedRange.Rows.Count To 1 Step -1 If Range("E" & r) = "" Then _ Range("A:G").Rows(r).Interior.ColorIndex = 2 Next r End Sub 
[提示]您可以將此代碼放置在工作表變化事件中,這樣,當工作表變化時,符合條件的相應行會自動標記背景色。
[示例四]本示例演示了刪除行操作,即在活動工作表已使用單元格區域中,若某單元格中包含有“AND”(如爲ANDXXX或XXXANDXX或XXXAND等,不區分大小寫),則刪除該單元格所在行。ActiveSheet.UsedRange.Find(what)表示在當前工作表所有已使用單元格區域中查找含有變量what中的內容的單元格,程序代碼如下:(by Patrick Molloy)
Sub Find_AND() Dim rng As Range Dim what As String what = "AND" Do Set rng = ActiveSheet.UsedRange.Find(what) If rng Is Nothing Then Exit Do Else Rows(rng.Row).Delete End If Loop End Sub 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章