Workbook 對象 應用實例

 

 

Workbook對象代表一個工作簿,Workbooks集合對象則代表同一Excel進程中打開的所有工作簿對象。
[應用1] 創建新工作簿(Add方法)
使用Add方法在Workbooks集合中創建新工作簿,所創建的工作簿爲活動工作簿。其語法爲:
Workbooks.Add(Template)
參數Template可選,決定如何創建新工作簿。如果將該參數設置爲已存在的Excel模板文件名稱,那麼將以該文件作爲模板創建工作簿。該參數可以爲下列XlWBATemplate常量之一:xlWBATChart(值-4109,代表圖表)、xlWBATExcel4IntlMacroSheet(值4)、xlWBATExcel4MacroSheet(值3)、xlWBATWorksheet(值-4167,代表工作表)。在創建新工作簿時,如果指定該參數,那麼將創建包含指定類型工作表的工作簿;如果省略該參數,那麼將創建包含一定數量空工作表的工作簿,工作表數爲SheetsInNewWorkbook屬性所設置的數量。
應用示例1:創建一個新工作簿
Sub CreateNewWorkbook1() MsgBox "將創建一個新工作簿." Workbooks.Add End Sub 
應用示例2:創建一個新工作簿並命名工作表且添加數據
Sub CreateNewWorkbook2() Dim wb As Workbook Dim ws As Worksheet Dim i As Long MsgBox "將創建一個新工作簿,並預設工作表格式." Set wb = Workbooks.Add Set ws = wb.Sheets(1) ws.Name = "產品彙總表" ws.Cells(1, 1) = "序號" ws.Cells(1, 2) = "產品名稱" ws.Cells(1, 3) = "產品數量" For i = 2 To 10 ws.Cells(i, 1) = i - 1 Next i End Sub 
應用示例3:創建帶有指定數量工作表的工作簿
Sub testNewWorkbook() MsgBox "創建一個帶有10個工作表的新工作簿" Dim wb As Workbook Set wb = NewWorkbook(10) End Sub  Function NewWorkbook(wsCount As Integer) As Workbook '創建帶有由變量wsCount提定數量工作表的工作簿,工作表數在1至255之間  Dim OriginalWorksheetCount As Long Set NewWorkbook = Nothing If wsCount < 1 Or wsCount > 255 Then Exit Function OriginalWorksheetCount = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = wsCount Set NewWorkbook = Workbooks.Add Application.SheetsInNewWorkbook = OriginalWorksheetCount End Function 
自定義函數NewWorkbook可以創建最多帶有255個工作表的工作簿。本測試示例創建一個帶有10個工作表的新工作簿。
[應用2] 打開工作簿(Open方法)
Open方法用於打開一個現有的工作簿,其語法爲:
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
可以看到,該方法具有很多參數,但大多數參數都很少用到。在這些參數中,除參數FileName必須外,其它參數都可選。
參數FileName指定要打開的工作簿文件的名稱,參數UpdateLinks指定更新工作簿中鏈接的方式,參數ReadOnly用來設置是否以只讀方式打開工作簿。如果需要使用密碼來打開工作簿,則應該將參數Password設置爲該密碼;如果需要使用密碼打開工作簿但沒有指定密碼,則會彈出詢問密碼的對話框。參數AddToMru指定是否將工作簿添加到最近使用的文件列表中,建議將其設置爲True,默認值爲False。
應用示例4:以只讀方式打開某工作簿
Sub openWorkbook2() Dim fname As String MsgBox "將D盤中的<測試.xls>工作簿以只讀方式打開" fname = "D:\測試.xls" Workbooks.Open Filename:=fname, ReadOnly:=True End Sub 
[應用3] 訪問特定的工作簿
使用Item屬性返回Workbooks集合中特定的工作簿。例如:
Workbooks.Item(1)
返回Workbooks集合中的第一個工作簿。由於Item屬性是缺省的屬性,因此上述代碼也可以簡寫爲:
Workbooks(1)
然而,使用索引號來指定工作簿是不可靠的,最好使用工作簿的具體名稱來指定特定的工作簿,例如:
Workbooks("MyBook.xlsx")
注意,當用戶使用“新建”命令創建一個新工作簿(假設該工作簿系統默認名稱爲Book2)時,在沒有保存該工作簿前,應該使用下面的代碼指定該工作簿:
Workbooks("Book2")
此時,如果使用下面的代碼指定該工作簿:
Workbooks("Book2.xlsx")
將會產生運行時錯誤:下標越界。
[應用4] 激活工作簿(Activate方法)
使用Activate方法激活指定的工作簿,例如:
Workbooks("MyWorkbook").Activate
[應用5] 獲得當前打開的工作簿數(Count屬性)
使用Workbooks集合對象的Count屬性來獲得當前打開的工作簿數,例如:
Workbooks.Count
[應用6] 判斷工作簿是否是隻讀的(ReadOnly屬性)
如果工作簿以只讀方式打開,那麼ReadOnly屬性的值爲True。
[應用7] 獲得工作簿的路徑和名稱(Name屬性、FullName屬性、Path屬性、CodeName屬性)
使用Workbook對象的Name屬性可以返回工作簿的名稱。例如,下面的函數可以返回當前工作簿的名稱:
Function MyName() As String MyName = ThisWorkbook.Name End Function 
使用Workbook對象的FullName屬性可以返回工作簿的路徑和名稱。例如,下面的函數可以返回當前工作簿的路徑和名稱:
Function MyName() As String MyName = ThisWorkbook.Name End Function 
使用Workbook對象的Path屬性可以返回工作簿文件的路徑。使用Workbook對象的CodeName屬性返回工作簿對象的代碼名。
上述屬性均爲只讀屬性。
應用示例5:一些工作簿通用屬性示例
Sub testGeneralWorkbookInfo() MsgBox "本工作簿的名稱爲" & ActiveWorkbook.Name MsgBox "本工作簿帶完整路徑的名稱爲" & ActiveWorkbook.FullName MsgBox "本工作簿對象的代碼名爲" & ActiveWorkbook.CodeName MsgBox "本工作簿的路徑爲" & ActiveWorkbook.Path If ActiveWorkbook.ReadOnly Then MsgBox "本工作簿已經是以只讀方式打開" Else MsgBox "本工作簿可讀寫." End If If ActiveWorkbook.Saved Then MsgBox "本工作簿已保存." Else MsgBox "本工作簿需要保存." End If End Sub 
[應用8] 保存工作簿(Save方法)
使用Save方法保存對工作簿所作的所有更改,其語法爲:
Workbook.Save
應用示例6:保存已存在的所有工作簿
Sub SaveAllWorkbooks() Dim wbk As Workbook For Each wbk In Workbooks If wbk.Path <> "" Then wbk.Save Next wbk End Sub 
如果某工作簿的Path屬性值爲空,則表明該工作簿爲新建工作簿,還沒有保存。而本過程僅保存所有已存在的(即已經保存過的)工作簿。
[應用9] 保存工作簿(SaveAs方法)
使用SaveAs方法在指定的文件中保存對工作簿所做的更改,其語法爲:
Workbook.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
所有參數均爲可選參數。其中參數FileName指定要保存文件的文件名,可以包含完整的路徑,如果不指定路徑,Excel將文件保存到當前文件夾中。參數FileFormat指定保存文件時使用的文件格式。如果文件夾中存在相同名稱的工作簿,則提示是否替換原工作簿。
參數Password用於指定文件的保護密碼,是一個區分大小寫的字符串(最長不超過 15 個字符)。參數WriteResPassword指定文件的寫保護密碼,如果文件保存時帶有密碼,但打開文件時沒有輸入密碼,則該文件以只讀方式打開。
將參數ReadOnlyRecommended設置爲True,則在打開文件時顯示一條消息,提示該文件以只讀方式打開。將參數CreateBackup設置爲True,以創建一個備份文件。
參數AccessMode和參數ConflictResolution用來解決訪問和衝突問題。
將參數AddToMru設置爲True,以添加工作簿到最近使用的文件列表中。默認值爲False。
應用示例7:創建新工作簿並保存
Sub AddSaveAsNewWorkbook() Dim Wk As Workbook Set Wk = Workbooks.Add Application.DisplayAlerts = False Wk.SaveAs Filename:="D:\SalesData.xlsx" End Sub 
這裏使用了Add方法和SaveAs方法,添加一個新工作簿並將該工作簿以文件名SalesData.xlsx保存在D盤中。其中,語句Application.DisplayAlerts = False表示禁止彈出警告對話框。
應用示例8:另存已有的工作簿
Sub SaveWorkbook2() Dim oldName As String, newName As String Dim folderName As String, fname As String oldName = ActiveWorkbook.Name newName = "new" & oldName MsgBox "將<" & oldName & ">以<" & newName & ">的名稱保存" folderName = Application.DefaultFilePath fname = folderName & "" & newName ActiveWorkbook.SaveAs fname End Sub 
上述代碼將當前工作簿以一個新名(即new加原名)保存在默認文件夾中。
應用示例9:備份工作簿
Sub CreateBak1() MsgBox "保存工作簿並建立備份工作簿" ActiveWorkbook.SaveAs CreateBackup:=True End Sub 
上述代碼在當前文件夾中建立工作簿的備份。
Sub CreateBak2() MsgBox "保存工作簿時,若已建立了備份,則將出現包含True的信息框,否則出現False." MsgBox ActiveWorkbook.CreateBackup End Sub 
[應用10] 保存工作簿副本(SaveCopyAs方法)
使用SaveCopyAs方法保存指定工作簿的一份副本,但不會修改已經打開的工作簿,其語法爲:
Workbook.SaveCopyAs(Filename)
參數Filename用來指定副本的文件名。
應用示例10:使用與活動工作簿相同的名稱但後綴名爲.bak來備份工作簿
Sub SaveWorkbookBackup() Dim awb As Workbook, BackupFileName As String, i As Integer, OK As Boolean If TypeName(ActiveWorkbook) = "Nothing" Then Exit Sub Set awb = ActiveWorkbook If awb.Path = "" Then Application.Dialogs(xlDialogSaveAs).Show Else BackupFileName = awb.FullName i = 0 While InStr(i + 1, BackupFileName, ".") > 0 i = InStr(i + 1, BackupFileName, ".") Wend If i > 0 Then BackupFileName = Left(BackupFileName, i - 1) BackupFileName = BackupFileName & ".bak" OK = False On Error GoTo NotAbleToSave With awb Application.StatusBar = "正在保存工作簿..." .Save Application.StatusBar = "正在備份工作簿..." .SaveCopyAs BackupFileName OK = True End With End If NotAbleToSave: Set awb = Nothing Application.StatusBar = False If Not OK Then MsgBox "備份工作簿未保存!", vbExclamation, ThisWorkbook.Name End If End Sub 
在當前工作簿中運行本示例代碼後,將以與工作簿相同的名稱但後綴名爲.bak備份工作簿,且該備份與當前工作簿在同一文件夾中。
應用示例11:保存當前工作簿的副本到其它位置來備份工作簿
Sub SaveWorkbookBackupToFloppyD() Dim awb As Workbook, BackupFileName As String, i As Integer, OK As Boolean If TypeName(ActiveWorkbook) = "Nothing" Then Exit Sub Set awb = ActiveWorkbook If awb.Path = "" Then Application.Dialogs(xlDialogSaveAs).Show Else BackupFileName = awb.Name OK = False On Error GoTo NotAbleToSave If Dir("D:" & BackupFileName) <> "" Then Kill "D:" & BackupFileName End If With awb Application.StatusBar = "正在保存工作簿..." .Save Application.StatusBar = "正在備份工作簿..." .SaveCopyAs "D:" & BackupFileName OK = True End With End If NotAbleToSave: Set awb = Nothing Application.StatusBar = False If Not OK Then MsgBox "備份工作簿未保存!", vbExclamation, ThisWorkbook.Name End If End Sub 
上述程序將當前工作簿進行復制並以與當前工作簿相同的名稱保存在D盤中。其中,使用了Kill方法來刪除已存在的工作簿。
[應用11] 判斷工作簿是否發生變化(Saved屬性)
如果工作簿自上次保存以來沒有發生任何變化,那麼該工作簿的Saved屬性值爲True。由於該屬性值是可讀寫的,因此我們能將該屬性的值設置爲True,即使該工作簿自上次保存之後發生過變化。這樣,我們能設置該屬性的值爲True,關閉被修改過的工作簿而不提示保存當前已發生的變化,即讓Excel誤認爲已經保存了所作的變化。
[應用12] 關閉工作簿(Close方法)
使用Workbooks對象的Close方法關閉所有工作簿,其語法爲:
Workbooks.Close 
使用Workbook對象的Close方法關閉指定的工作簿,其語法爲:
Workbook.Close(SaveChanges, Filename, RouteWorkbook)
參數均爲可選參數。其中,參數SaveChanges用於在關閉工作簿前保存工作簿所發生的變化。特別地,如果工作簿中沒有變化,則忽略該參數;如果工作簿中有變化但工作簿顯示在其他打開的窗口中,則忽略該參數;如果工作簿中有改動且工作簿未顯示在任何其他打開的窗口中,則由該參數指定是否應保存更改。如果將該參數設置爲True,則保存對工作簿所做的更改;如果工作簿尚未命名,則使用參數FileName指定的名稱保存。如果忽略參數Filename,則要求用戶提供文件名。如果將該參數設置爲False,則不會保存工作簿中的變化。如果忽略該參數,那麼Excel將顯示一個對話框詢問是否保存工作簿中的變化。
參數RouteWorkbook指出工作簿傳送的問題。如果工作簿不需要傳送給下一個收件人(沒有傳送名單或已經傳送),則忽略該參數。否則,Excel將根據該參數的值傳送工作簿。如果將該參數設置爲True,則將工作簿傳送給下一個收件人。如果設置爲False,則不發送工作簿。如果忽略,則要求用戶確認是否發送工作簿。
注意,Close方法檢查工作簿的Saved屬性,以決定是否提示用戶保存工作簿所發生的變化。如果將Saved屬性的值設置爲True,那麼Close方法將不會警告而直接關閉工作簿,並不會保存工作簿中所發生的任何變化。
應用示例12:保存並關閉所有工作簿
Sub SaveAndCloseAllWorkbooks() Dim wbk As Workbook For Each wbk In Workbooks If wbk.Name <> ThisWorkbook.Name Then wbk.Close SaveChanges:=True End If Next wbk ThisWorkbook.Close SaveChanges:=True End Sub 
應用示例13:不保存而關閉工作簿
Sub CloseWorkbook1() MsgBox "不保存所作的改變而關閉本工作簿" ActiveWorkbook.Close False '或ActiveWorkbook.Close SaveChanges:=False  '或ActiveWorkbook.Saved=True End Sub<pre> <span style="color: #0000ff;">應用示例14:保存而關閉工作簿</span> <pre lang="vb">Sub CloseWorkbook2() MsgBox "保存所作的改變並關閉本工作簿" ActiveWorkbook.Close True End Sub 
應用示例15:關閉工作簿並將其徹底刪除
Sub KillMe() With ThisWorkbook .Saved = True .ChangeFileAccess Mode:=xlReadOnly Kill .FullName .Close False End With End Sub 
[應用13] 打印預覽工作簿(PrintPreview方法)
使用PrintPreview方法按工作簿打印後的外觀效果顯示工作簿的預覽,其語法爲:
Workbook.PrintPreview(EnableChanges)
參數EnableChanges指定用戶是否可更改邊距和打印預覽中可用的其他頁面設置選項。
[應用14] 打印工作簿(PrintOut方法)
使用PrintOut方法打印完整的工作簿(當然,該方法也應用於其它一些對象,例如Range、Worksheet、Chart),其語法爲:
Workbook.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)
所有參數均爲可選參數。參數From指定需要打印第一頁的頁碼,參數To指定要打印的最後一頁的頁碼,如果忽略這些參數,將打印整個對象。
參數Copies指定要打印副本的數量,默認值爲1。
如果參數Preview設置爲True,那麼將彈出打印預覽而不是立即打印。默認值爲False。
使用參數ActivePrinter設置活動打印機的名稱。
如果將參數PrintToFile設置爲True,那麼將工作簿打印到文件。此時,如果沒有指定參數PrToFileName的值,那麼Excel將提示用戶輸入要使用的輸出文件的文件名。使用參數PrToFileName指定要打印到的文件名。
將參數Collate設置爲True,以逐份打印副本。
將參數IgnorePrintAreas設置爲真,則忽略打印區域而打印整個對象。
[應用15] 保護工作簿(Protect方法)
使用Protect方法保護工作簿,使其不能夠被修改,其語法爲:
Workbook.Protect(Password, Structure, Windows)
所有參數均爲可選參數。其中,參數Password用來指定一個密碼,所設置的密碼區分大小寫。如果省略該參數,不用密碼就可以取消對工作簿的保護。否則,必須指定密碼才能取消對工作簿的保護。
將參數Structure的值設置爲True,以保護工作簿的結構,即工作簿中工作表的相關位置。此時不能對工作簿中的工作表進行插入、複製、刪除等操作。默認值爲False。
將參數Windows的值設置爲False,以保護工作簿窗口。此時,該工作簿右上角的最小化、最大化和關閉按鈕消失。默認值爲False。
應用示例16:保護工作簿示例代碼
Sub ProtectWorkbook() MsgBox "保護工作簿結構,密碼爲123" ActiveWorkbook.Protect Password:="123", Structure:=True MsgBox "保護工作簿窗口,密碼爲123" ActiveWorkbook.Protect Password:="123", Windows:=True MsgBox "保護工作簿結構和窗口,密碼爲123" ActiveWorkbook.Protect Password:="123", Structure:=True, Windows:=True End Sub 
[應用16] 解除工作簿保護(Unprotect方法)
使用Unprotect方法取消工作簿保護,其語法爲:
Workbook.Unprotect(Password)
參數Password爲一個字符串,指定用於解除工作表或工作簿保護的密碼,區分大小寫。如果工作簿不設密碼保護,則省略該參數。如果對工作簿省略該參數,而該工作簿又設有密碼保護,則該方法將失效。
應用示例17:解除工作簿保護
Sub UnprotectWorkbook() MsgBox "取消工作簿保護" ActiveWorkbook.Unprotect "123" End Sub 
[應用17] 判斷工作簿是否有密碼保護(HasPassword屬性)
如果指定工作簿有密碼保護,則HasPassword屬性值爲 True。
應用示例18:檢查工作簿是否有密碼保護
Sub IsPassword() If ActiveWorkbook.HasPassword = True Then MsgBox "本工作簿有密碼保護,請在管理員處獲取密碼." Else MsgBox "本工作簿無密碼保護,您可以自由編輯." End If End Sub 
[應用18] ThisWorkbook對象和ActiveWorkbook對象
有時,在代碼中經常會碰到ThisWorkbook對象和ActiveWorkbook對象,雖然在某些情況下其所代表的工作簿相同,但是在某些情況下還是有較大的差別,特別是製作加載項時。
ThisWorkbook對象代表的是代碼所在的工作簿,而ActiveWorkbook對象代表的是活動工作簿。
[應用19] 工作簿的屬性(BuiltinDocumentProperties屬性)
“文件—屬性”或者“Office按鈕—準備—屬性”將顯示一個對話框,包含了有關當前工作簿的信息,可以從VBA訪問工作簿的屬性。
應用示例19:顯示已經保存的當前工作簿的日期和時間
Sub LastSaved() Dim SaveTime As String On Error Resume Next SaveTime = ActiveWorkbook.BuiltinDocumentProperties("Last Save Time").Value If SaveTime = "" Then MsgBox ActiveWorkbook.Name & "還沒有被保存." Else MsgBox "保存於:" & SaveTime, , ActiveWorkbook.Name End If End Sub 
如果沒有保存過工作簿,那麼對Last Save Time屬性的訪問將產生錯誤,使用On Error語句忽略這個錯誤。
應用示例20:列出當前工作簿的內置屬性
Sub listWorkbookProperties() On Error Resume Next '在名爲"工作簿屬性"的工作表中添加信息,若該工作表不存在,則新建一個工作表 Worksheets("工作簿屬性").Activate If Err.Number <> 0 Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "工作簿屬性" Else ActiveSheet.Clear End If On Error GoTo 0 ListProperties End Sub  Sub ListProperties() Dim i As Long Cells(1, 1) = "名稱" Cells(1, 2) = "類型" Cells(1, 3) = "值" Range("A1:C1").Font.Bold = True With ActiveWorkbook For i = 1 To .BuiltinDocumentProperties.Count With .BuiltinDocumentProperties(i) Cells(i + 1, 1) = .Name Select Case .Type Case msoPropertyTypeBoolean Cells(i + 1, 2) = "Boolean" Case msoPropertyTypeDate Cells(i + 1, 2) = "Date" Case msoPropertyTypeFloat Cells(i + 1, 2) = "Float" Case msoPropertyTypeNumber Cells(i + 1, 2) = "Number" Case msoPropertyTypeString Cells(i + 1, 2) = "string" End Select On Error Resume Next Cells(i + 1, 3) = .Value On Error GoTo 0 End With Next i End With Range("A:C").Columns.AutoFit End Sub 
[應用20] 重命名工作簿(Name方法)
Name方法用來重命名一個文件、目錄或文件夾,其語法爲:
Name oldpathname As newpathname
應用示例21:重命名未打開的工作簿
Sub rename() Name "<工作簿路徑>\<舊名稱>.xlsx" As "<工作簿路徑>\<新名稱>.xlsx" End Sub 
代碼中<>的內容爲需要重命名的工作簿所在路徑及新舊名稱。該方法只是對未打開的文件進行重命名,如果該文件已經打開,使用該方法會提示錯誤。
[應用21] 獲取或設置工作簿密碼(Password屬性)
使用Password屬性返回或設置在打開指定工作簿時必須提供的密碼。
應用示例22:設置工作簿密碼
Sub UsePassword() Dim wb As Workbook Set wb = Application.ActiveWorkbook wb.Password = InputBox("請輸入密碼:") wb.Close End Sub 
代碼運行後,提示設置密碼,然後關閉工作簿;再次打開工作簿時,要求輸入密碼。
[應用22] 工作簿中形狀的顯示方式(DisplayDrawingObjects屬性)
使用DisplayDrawingObjects屬性返回或設置工作簿中形狀的顯示方式,可以是下列常量之一:xlDisplayShapes(顯示所有形狀)、xlPlaceholders(僅顯示佔位符)、xlHide(隱藏所有形狀)。
應用示例23:控制工作簿中圖形顯示方式
Sub testDraw() MsgBox "隱藏當前工作簿中的所有圖形" ActiveWorkbook.DisplayDrawingObjects = xlHide MsgBox "僅顯示當前工作簿中所有圖形的佔位符" ActiveWorkbook.DisplayDrawingObjects = xlPlaceholders MsgBox "顯示當前工作簿中的所有圖形" ActiveWorkbook.DisplayDrawingObjects = xlDisplayShapes End Sub 
[應用23] 工作簿文件格式(FileFormat屬性)
使用FileFormat屬性返回工作簿文件格式或類型。
[應用24] 決定工作簿計算使用的數值(PrecisionAsDisplayed屬性)
在工作簿進行計算時,如果將PrecisionAsDisplayed屬性設置爲True,則僅使用工作表中所顯示的數值進行計算,而不是單元格中實際存儲的值。該屬性的默認值爲False,表明工作簿計算基於單元格中實際存儲的值。
應用示例24:設置數字精度
Sub SetPrecision() Dim pValue MsgBox "在當前單元格中輸入1/3,並將結果算至小數點後兩位" ActiveCell.Value = 1 / 3 ActiveCell.NumberFormatLocal = "0.00" pValue = ActiveCell.Value * 3 MsgBox "當前單元格中的數字乘以3等於:" & pValue MsgBox "然後,將數值分類設置爲[數值],即單元格中顯示的精度" ActiveWorkbook.PrecisionAsDisplayed = True pValue = ActiveCell.Value * 3 MsgBox "此時,當前單元格中的數字乘以3等於:" & pValue & "而不是1" ActiveWorkbook.PrecisionAsDisplayed = False End Sub 
上述代碼在計算前將PrecisionAsDisplayed屬性的值設置爲True,則表明採用單元格中所顯示的數值進行計算。
[應用25] 刪除自定義數字格式(DeleteNumberFormat方法)
使用DeleteNumberFormat方法從工作簿中刪除一個自定義數字格式,其語法爲:
Workbook.DeleteNumberFormat(NumberFormat)
參數NumberFormat爲要刪除的數字格式。
應用示例25:刪除自定義數字格式
Sub DeleteNumberFormat() MsgBox "從當前工作簿中刪除000-00-0000的數字格式" ActiveWorkbook.DeleteNumberFormat ("000-00-0000") End Sub 
[應用26] 添加名稱(Names屬性)
Workbook對象的Names屬性返回Names集合,代表指定工作簿中的所有名稱。
應用示例26:在活動工作簿中添加名稱
Sub testNames() MsgBox "將當前工作簿中工作表Sheet1內單元格A1命名爲myName." ActiveWorkbook.Names.Add Name:="myName", RefersToR1C1:="=Sheet1!R1C1" End Sub 
上述代碼將活動工作簿單元格A1命名爲MyName。
[應用27] 獲取工作簿用戶狀態信息(UserStatus屬性)
UserStatus屬性返回一個基爲 1 的二維數組,該數組提供有關每一個以共享列表模式打開工作簿的用戶的信息。數組第二維的第一個元素爲用戶名,第二個元素是用戶打開工作簿的日期和時間,第三個元素是一個表示清單類型的數字(1表示獨佔,2表示共享)。UserStatus屬性不返回有關以只讀方式打開指定工作簿的用戶的信息。
應用示例27:列出工作簿用戶狀態信息
Sub UsePassword() Dim Users As Variant Dim Row As Long Users = ActiveWorkbook.UserStatus Row = 1 With Workbooks.Add.Sheets(1) .Cells(Row, 1) = "用戶名" .Cells(Row, 2) = "日期和時間" .Cells(Row, 3) = "使用方式" For Row = 1 To UBound(Users, 1) .Cells(Row + 1, 1) = Users(Row, 1) .Cells(Row + 1, 2) = Users(Row, 2) Select Case Users(Row, 3) Case 1 .Cells(Row + 1, 3).Value = "個人工作簿" Case 2 .Cells(Row + 1, 3).Value = "共享工作簿" End Select Next End With Range("A:C").Columns.AutoFit End Sub 
示例代碼運行後,將創建一個新工作簿並帶有用戶使用當前工作簿的信息,即用戶名、打開的日期和時間及工作簿使用方式。
[應用28] 操作工作簿中的樣式(Styles集合和Style對象)
每個工作簿都有一個Styles集合,包含該工作簿的所有已定義樣式。一個Style對象代表單元格區域的一組格式選項,可以使用Add方法創建Style對象,其語法爲:
Styles.Add(Name, BasedOn)
參數Name必需,用來指定樣式的名稱。參數BasedOn可選,用來指定單元格,新樣式即基於該單元格生成。如果省略此參數,就基於“常規”樣式創建新樣式。
如果指定名稱的樣式已經存在,該方法將基於參數BasedOn指定的單元格重新定義已存在的樣式。
Style對象的屬性代表了不同的格式特徵,例如字體名稱、字體大小、數字格式、對齊等。也有內置的樣式,例如Normal、Currency和Percent,這些內置樣式能在樣式對話框中找到。
應用示例28:創建一個新樣式並將其應用到當前工作表的單元格區域中
Sub test() Dim st As Style '如果該樣式已存在則刪除  For Each st In ActiveWorkbook.Styles If st.Name = "Bordered" Then st.Delete Next st '創建新樣式  With ActiveWorkbook.Styles.Add(Name:="Bordered") .Borders(xlTop).LineStyle = xlDouble .Borders(xlBottom).LineStyle = xlDouble .Borders(xlLeft).LineStyle = xlDouble .Borders(xlRight).LineStyle = xlDouble .Font.Bold = True .Font.Name = "Arial" .Font.Size = 36 End With '應用樣式 Application.ActiveSheet.Range("A1:B3").Style = "Bordered" End Sub 
[應用29] 打開文本文件(OpenText方法)
OpenText方法用於在一個新工作簿中裝入文本文件,並將其轉換爲工作表,其語法爲:
Workbooks.OpenText(Filename, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local)
與Open方法一樣,除參數Filename必須外,其它參數都可選。
參數Filename指定要打開的文本文件的名稱。參數Origin指定文本文件的來源,可以爲下列XlPlatform常量之一:xlMacintosh、xlWindows或xlMSDOS,此外它還可以是一個整數,表示所需代碼頁的代碼頁編號,例如“1256”指定源文本文件的編碼是阿拉伯語(Windows)。如果省略該參數,則此方法將使用“文本導入嚮導”中“文件原始格式”選項的當前設置。
參數StartRow指定從文本文件中開始進行分析處理的文本的行號,默值爲1。參數DataType指定字段中的文本格式,可以是下列XlTextParsingType常量之一:xlDelimited或xlFixedWidth,如果忽略該參數,則Excel將嘗試在打開文件時確定字段格式。參數TextQualifier用來指定文本識別符,可以是下列XlTextQualifier常量之一:xlTextQualifierNone(值-4142,代表無分隔符)、xlTextQualifierDoubleQuote(值1,代表雙引號)、xlTextQualifierSingleQuote(值2,代表單引號)。應將參數ConsecutiveDelimiter設置爲True,這樣將連續分隔符當作一個分隔符,默認值爲False。
有幾個參數需要參數DataType必須設置爲xlDelimited,包括參數Tab、參數Semicolon、參數Comma、參數Space和參數Other。當這些參數中的任何一個設置爲True時,表示Excel應該使用與文本分隔符相應的字符,這些分隔符描述如下(所有參數的缺省值均爲False):
參數Tab設置爲True時,使用製表符作爲分隔符;參數Semicolon設置爲True時,使用分號作爲分隔符;參數Comma設置爲True時,使用逗號作爲分隔符;參數Space設置爲True時,使用空格作爲分隔符;參數Other設置爲True時,將使用參數OtherChar指定的字符作爲分隔符。如果參數OtherChar包含多個字符時,則僅使用第一個字符而忽略其它字符。
參數FieldInfo是包含單列數據相關分列信息的數組,取決於參數DataType的值。當參數DataType的值爲xlDelimited時,則參數FieldInfo爲由兩元素數組組成的數組,該數組的大小應該與被轉換數據的列的數量相同或更小。一個二維數組的第一維是列標(起始爲1),第二維是下列XlColumnDataType常量之一,用於指定列的數據類型:xlGeneralFormat(值1,常規)、xlTextFormat(值2,文本)、xlMDYFormat(值3,MDY日期格式)、xlDMYFormat(值4,DMY日期格式)、xlYMDFormat(值5,YMD日期格式)、xlMYDFormat(值6,MYD日期格式)、xlDYMFormat(值7,DYM日期格式)、xlYDMFormat(值8,YDM日期格式)、xlSkipColumn(值9,列未分列即跳過列)、xlEMDFormat(值10,EMD日期格式)。
如果提供給二維數組的列沒有找到,那麼該列將使用常規設置。例如,將下面的數據設置爲參數FieldInfo的值,則第一列爲文本,而第三列被跳過,其它列被視爲常規數據:
Array(Array(1,2),Array(3,9))
參數TextVisualLayout代表文本的可視佈局,參數DecimalSeparator指定小數分隔符,參數ThousandsSeparator指定千位分隔符,參數TrailingMinusNumbers用於處理末尾爲減號的數字。參數Local用來指定是否分隔符、數字和數據格式應使用計算機的區域設置。
應用示例29:打開帶有分隔符的文本文件
在D盤的excel文件夾中有一個名爲temp1.txt的文本文件,其內容爲:
"張三","工人","A工廠",1/2/2009 "李四","職員","B公司",3/3/2009 "王五","教師","C學校",2/2/2009 "趙六","學生","D學院",1/1/2009
在Excel工作簿中放置下面的代碼:
Sub test() Workbooks.OpenText Filename:="D:\excel\temp1.txt", _ Origin:=xlMSDOS, _ StartRow:=1, _ DataType:=xlDelimited, _ TextQualifier:=xlTextQualifierDoubleQuote, _ ConsecutiveDelimiter:=True, _ Comma:=True, _ FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 6)) End Sub 
運行後,將生成如下圖1所示的工作表。注意,列D中的單元格放置日期。
workbooksample1
圖1:在Excel中打開逗號分隔的文本文件
應用示例30:打開固定寬度的文本文件
如果參數DataType設置爲xlFixedWidth,那麼參數FieldInfo中每個二維數組的第一維指定字符在列中開始的位置(第一個字符的位置是0),第二維指定列的數據類型(如上面在參數介紹中所描述的)。
在D盤的excel文件夾中有一個名爲temp2.txt的文本文件,其內容爲:
0-125-689 2-523-489 3-424-664 4-125-160
在Excel工作簿中放置下面的代碼:
Sub test() Workbooks.OpenText Filename:="D:\excel\temp2.txt", _ Origin:=xlMSDOS, _ StartRow:=1, _ DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 2), Array(1, 9), Array(2, 2), Array(5, 9), Array(6, 2)) End Sub 
運行後,將生成如下圖2所示的工作表。注意看代碼是如何使用數組跳過這些連字符的。
workbooksample2
圖2:在Excel中打開固定寬度的文本文件
注意到圖1和圖2中打開的文本文件並沒有被轉換爲Excel 工作簿文件,因此使用下面的代碼將其保存爲Excel工作簿文件:
 Application.ActiveWorkbook.SaveAs _ Filename:="D:\excel\temp.xlsx", FileFormat:=xlWorkbookNormal
[應用30] 判斷工作簿是否存在
下面的示例使用自定義函數FileExists判斷工作簿是否存在,若該工作簿已存在,則打開它。代碼中,“C:\文件夾\子文件夾\文件.xls”代表工作簿所在的文件夾名、子文件夾名和工作簿文件名。
Sub testFileExists() MsgBox "如果文件不存在則用信息框說明,否則打開該文件." If Not FileExists("C:\文件夾\子文件夾\文件.xls") Then MsgBox "這個工作簿不存在!" Else Workbooks.Open "C:\文件夾\子文件夾\文件.xls" End If End Sub  Function FileExists(FullFileName As String) As Boolean '如果工作簿存在,則返回True FileExists = Len(Dir(FullFileName)) > 0 End Function 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章