Excel Application物件 開發指南

zhengnx發表於2012-02-19
Excel Application物件 開發指南 2009-12-26 13:10:21
標籤:Excel VBA

概述

Application物件是Microsoft Office Excel 2007物件模型中最高階別的物件,表示Excel程式自身。Application物件提供正在執行的程式的資訊、應用於程式例項的選項以及例項中開啟的當前物件。因為它是物件模型中最高的物件,Application物件也包含組成一個工作簿的很多部件,包括如工作簿、工作表集合、單元格以及這些物件所包含的資料等。
Application物件包括:
  • 程式範圍的設定和選項。這些選項大部分同“工具”選單下的“選項”對話方塊裡的內容相同。
  • 頂級物件返回的方法,如ActiveCell、ActiveSheet等。
在下面幾節裡,你將透過使用VBA程式碼示例學習到一些Application物件中經常使用到的物件、方法和屬性。關於Application物件模型所有成員的詳細資料,請參考。

Application物件中其它物件的引用方法

你可以使用Application屬性返回Application物件。獲取一個Application物件後,如需訪問它下面的物件,可以在物件模型層級中往下移動。下面示例設定一個工作表的第一個單元格內容為20。
Application.Workbooks(1).Worksheets(1).Cells(1,1)=20
要表示一個單元格,上面的程式碼示例從Application物件開始,移到第一個工作簿,再移到第一個工作表,最後到這個單元格。
下面示例在另一個Excel程式中建立一個Excel工作簿物件,然後開啟一個工作簿。
Set xl=CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"
不需要使用“Application”限定詞,很多的屬性和方法也可以直接被用來返回那些最常用的使用者介面物件,如活動工作表 (ActiveSheet屬性)。例如,除了使用Application.ActiveSheet.Name = “Monthly Sales”,你也可以使用ActiveSheet.Name = “Monthly Sales”。然而,當使用這個簡便表示方法時必需小心,需要選擇正確的物件。例如透過使用Worksheet物件的Activate方確定你選擇了正確的工作簿和工作表後,你可以使用Cell(1,1)表示第一個單元格。
有幾種情況你必需使用Application限定詞。例如,OnTime物件(本文後面部分將討論)需要這個限定詞,還有程式視窗的Width和 Height屬性。一般來說,用來處理Excel視窗的外觀或影響程式全域性行為的屬性或方法需要使用Application限定詞;例如, DisplayFormlaBar屬性用來顯示或隱藏公式欄,Calculation方法也需要限定詞。

Application物件集合

這一節詳細介紹一些和Application物件相關的集合。
AddIns集合
AddIns集合表示所有當前載入的Excel Add-in。你可以像列舉其它物件一樣在你的程式中列舉出關於add-in的不同型別資訊。下面的示例列舉出當前載入到Excel中的Add-in的路徑和名稱。
Sub ListAddIns()
     Dim myAddin As AddIn
     For Each myAddin In AddIns
          MsgBox myAddin.FullName
     Next
End Sub
Columns和Rows集合
這兩個集合表示活動工作簿中的列和行。分別使用它們選擇指定的列和行。
Application.Columns(4).Select
這個語句選擇D列,就像你透過點選使用者介面中的列的頂部一樣。
Application.Rows(5).Select
這個語句選擇工作表中的第5行,就像你點選行的左邊框一樣。
Dialogs集合
Dialogs集合包括Excel程式中所有的對話方塊。將在本文中後面部分更詳細地討論Dialogs集合。
Sheets集合
Sheets集合返回指定或活動工作簿中所有工作表的集合。Sheets集合可以包含Chart或Worksheet物件。
下面示例列印出活動工作簿中所有的工作表。
Application.Sheets.PrintOut
這個示例迴圈工作簿中所有的工作表並列印出包含資料區域的任何工作表。
For iSheet = 1 To Application.Sheets.Count
    If Not IsEmpty(Application.Sheets(iSheet).UsedRange) Then
           Application.Sheets(iSheet).PrintOut copies:=1
    End If
Next iSheet

Application物件的屬性

有很多的屬性可以用來訪問Excel 2007程式的各種物件,多得不能記住或在這裡全部討論。幸運的是隻有一部分是你可能經常使用的。
  • ActiveCell
  • ActiveChart
  • ActiveSheet
  • ActiveWindow
  • ActiveWorkbook
  • RangeSelection
  • Selection
  • StatusBar
  • ThisWorkbook
下面的內容演示這些常用屬性的使用方法。
ActiveCell屬性
Application物件的ActiveCell屬性返回一個表示活動工作簿中活動工作表的活動單元格的Range物件。如果你沒有指定物件限定詞,這個屬性返回活動視窗的活動單元格。
注意區別活動單元格和選擇的單元格。活動單元格是當前選擇中的一個單元格。選擇(Selection)可能包括一個單元格集合,但只有其中一個是活動單元格。
下面的示例改變活動單元格的字型格式。注意為了確保你操作正確的單元格,工作表集合的Activate方法讓Sheet1成為活動工作表。
Worksheets("Sheet1").Activate
With ActiveCell.Font
    .Bold = True
    .Italic = True
End With
ActiveChart屬性
ActiveChart屬性返回表示活動圖表的Chart物件,不管它是嵌入的圖表還是圖表工作表。在一個嵌入的圖表被選擇或啟用時,它就是活動圖表。下面的示例使用ActiveChart屬性新增一個3維柱形圖到月銷售記錄工作表中。
Sub AddChart()
     Charts.Add
     With ActiveChart
         .ChartType = xl3DColumn
         .SetSourceData Source:=Sheets("Sheet1").Range("B3:H15")
         .Location Where:=xlLocationAsObject, Name:="Monthly Sales"
         .HasTitle = True
         .ChartTitle.Characters.Text = Monthly Sales by Category
     End With
End Sub
ActiveSheet屬性
ActiveSheet屬性返回一個表示當前選中的工作表(頂部工作表)的Worksheet物件。在一個工作簿中只有一個工作表能成為活動工作表。下面的示例顯示活動工作表的名稱。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
下面的示例將活動工作表複製使用者指定的次數並放置在Sheet1之前。
Sub CopyActiveSheet()
     Dim x As Integer
     x = InputBox("Enter number of times to copy active sheet")
     For numtimes = 1 To x
          ' Put copies in front of Sheet1.
          ActiveWorkbook.ActiveSheet.Copy _
             Before:=ActiveWorkbook.Sheets("Sheet1")
      Next
End Sub
ActiveWindow屬性
ActiveWindow屬性返回一個表示活動視窗(頂部視窗)的Window物件。下面的示例顯示活動視窗的名稱(Caption屬性)。
MsgBox "The name of the active window is " & ActiveWindow.Caption
Caption屬性作為活動視窗的名稱允許你透過使用友好的名稱而不是序號來獲得視窗。
下面的示例選擇並列印一個工作表,然後對第二個工作表重複此過程。
Sub PrintWorksheet()
      Application.ScreenUpdating = False
      Sheets("Sales").Select
      ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
      Sheets("Expenses").Select
      ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub
在這個例子中,你可能疑惑為什麼設定ScreenUpdating屬性為False。當Excel執行一系列任務時,螢幕被更新並重新整理很多次,這將導致螢幕閃爍。設定ScreenUpdating屬性為False可以消除閃爍。另外,因為電腦處理器不需要暫停來重新整理螢幕,這樣也可以讓大型程式執行得較快一點。
ActiveWorkbook屬性
ActiveWorkbook屬性返回一個表示活動視窗(頂部視窗)中的工作簿的Workbook物件。這個示例顯示活動工作簿的名稱。
MsgBox "The name of the active workbook is " & ActiveWorkbook.Name
下面示例設定計算模式為手動(這樣其它工作簿將不計算),然後迴圈並計算活動工作簿的每個工作表。
Sub CalcBook()
     Dim wks As Worksheet
     Application.Calculation = xlManual
     For Each wks In ActiveWorkbook.Worksheets
           wks.Calculate
     Next
     Set wks = Nothing
End Sub
RangeSelection屬性
RangeSelection屬性返回一個表示指定視窗中工作表裡選擇的單元格的Range物件,即使在工作表中一個圖表物件已經被選擇或啟用。這個示例顯示活動視窗中工作表所選擇單元格的地址。
MsgBox Application.ActiveWindow.RangeSelection.Address
當你選擇了一個範圍,RangeSelection屬性和Selection物件表示同樣一個範圍。當你選擇一個圖表,RangeSelection屬性返回之前選擇的範圍。Selection屬性將在下一節中詳細介紹。
這裡介紹的語法RangeSelection.Name.Name在Office2003和2007中使用時都出現錯誤,如果該程式碼生效,必須先設定單元格A1的名稱。並且應該不是單元格內容的前三個字元,而是名稱的前三個字元。這應該是原文的疏漏。
下面的示例顯示一個單元格中的前三個字元。
Range("A1").Select
MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
你可能奇怪為什麼使用這樣的語法
ActiveWindow.RangeSelection.Name.Name
當你選擇一個範圍,使用RangeSelection.Name方法可以獲取像Sheet1!$A$1:$B$15這樣的範圍地址。另外,使用RangeSelection.Name.Name方法可以獲取命名像MyRange1這樣的範圍本身的名稱。
Selection屬性
Selection屬性返回活動視窗中被選擇的物件。例如,對於單元格,這個屬性返回Range物件;對於圖表,它返回Chart物件。如果使用屬性而沒有物件限定符,等於使用Application.Selection。
這個示例清除Sheet1所選的內容。
Worksheets("Sheet1").Activate Selection.Clear
下面的例子將所選範圍的總行數儲存到變數NumRows。
NumRows = 0
For Each area In Selection.Areas
      NumRows = NumRows + area.Rows.Count
Next area
這個例子統計所選單元格的總數並在訊息框中顯示結果。
Sub Count_Selection()
Dim cell As Object
Dim count As Integer
count = 0
For Each cell In Selection
count = count + 1
Next cell
MsgBox count & " item(s) selected"
End Sub
StatusBar屬性
StatusBar屬性返回或設定狀態列的文字。這個屬性允許你更改在Excel視窗底部的狀態列中顯示的資訊。它對在運算過程需要較長時間來完成時讓使用者知道正在執行的進度非常有幫助。
如果Excel控制狀態列時StatusBar屬性返回False。另外,如需恢復預設狀態列文字,只需設定屬性值為False即可;甚至在狀態列隱藏時也有效。
例如,使用下面的方式對每個處理的檔案你可以給StatusBar屬性賦值。
Dim FileNum As Integer
FileNum = 0
For Each file in Files
' Do something here.
Application.StatusBar = "Now processing File " & FileNum
FileNum = FileNum + 1
Next
然後當過程結束,你需要使用下面的語句將狀態列設定回正常狀態。
Application.StatusBar = False
你可以建立你自己的過程使用StatusBar屬性顯示一個宏或其它過程的進度。
Sub ShowStatusBarProgress()
Dim i As Long
Dim pctDone As Double
Dim numSquares As Long
Const MAXSQR As Long = 15
For i = 1 To 30
pctDone = i / 30
numSquares = pctDone * MAXSQR
Application.StatusBar = Application.Rept(Chr(31), numSquares)
Application.Wait Now + TimeSerial(0, 0, 1)
Next i
Application.StatusBar = False
End Sub
這個例子在狀態列上顯示最大15個方塊(由常數MAXSQR定義)。這個方塊透過使用ASCII字元31來產生。這個缺少關於宏需要多長時間的視覺指示,它僅表明宏正在進行。Wait方法模擬一個宏需要長時間來執行。
ThisWorkbook屬性
ThisWorkbook屬性返回一個表示當前執行的宏程式碼所在工作簿的 Workbook物件。這個屬性允許載入宏定義包含程式碼的工作簿。這種情況下ActiveWorkbook屬性並不起作用,因為活動工作簿可能並不是包含載入宏程式碼的工作簿。換句話說,ActiveWorkbook屬性不返回載入宏工作簿;它返回撥用載入宏的工作簿。如果你使用你的Visual Basic程式碼建立載入宏,你應該使用ThisWorkbook屬性來限定任何必須執行在包含載入宏的工作簿上的語句。
下面示例關閉包含示例程式碼的工作簿。如果對工作簿的修改不被儲存。
ThisWorkbook.Close SaveChanges:=False
下面的示例迴圈每個開啟的工作簿並關閉它。然後關閉包含這個程式碼的工作簿。
Private oExcel As Excel.Application
Private wbk As Excel.Workbook
Sub CloseOpenWrkBks()
Dim wrkb As Workbook
For Each wbk In Application.Workbooks
If wrkb.Name <> ThisWorkbook.Name Then
wbk.Close True
End If
Next wbk
ThisWorkbook.Close True
End Sub

Application物件方法

除了Application物件屬性外,下面將介紹一些更加常用的方法。
FindFile方法和Dialogs集合
同GetOpenFilename方法不同,FindFile方法顯示Open對話方塊並允許使用者開啟一個檔案。如果新檔案成功開啟,此方法返回True。如果使用者取消對話方塊,此方法返回False。
下面示例顯示一個訊息框提示使用者開啟一個指定檔案,然後顯示Open對話方塊。如果使用者不能開啟檔案,顯示一個訊息框。
Sub OpenFile1( )
Dim bSuccess As Boolean
Msgbox "Please locate the MonthlySales.xls file."
bSuccess = Application.FindFile
If Not bSuccess Then
Msgbox "File not open."
End If
End Sub
你也可以透過使用Dialogs集合細目的其中一個開啟特別的對話方塊來完成同樣的事情。使用Dialogs集合的一個好處是當你使用Show方法時,你可以傳遞引數給它來修改內建對話方塊的預設行為。例如,xlDialogOpen的引數有:file_text, update_links, read_only, format, prot_pwd, write_res_pwd, ignore_rorec, file_origin, custom_delimit, add_logical, editable, file_access, notify_logical, converter.
注意:如需查詢某個特定的對話方塊的引數,在Excel幫助文件的“內建對話方塊引數列表”中找到相應的對話方塊常數。
下面的例子顯示“開啟”對話方塊並設定“Book1.xls”在檔名下拉選單框中,使用者不需要選擇檔案就可以在對話方塊中顯示檔名。
Sub OpenFile2( )
Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xls"
End Sub
Dialogs集合最激動人心的部分是你可以使用它顯示任何Excel對話方塊-大約250種。你可以透過下面的步驟檢視Dialogs集合的完整對話方塊列表。
  1. 開啟Visual Basic編輯器。
  2. 單擊選單“檢視”->“物件瀏覽器”,顯示物件瀏覽器視窗,也可以按F2。
  3. 在搜尋框中輸入xlBuiltInDialog。
  4. 單擊Search按鈕。
GetOpenFilename方法
GetOpenFilename 方法顯示標準“開啟”對話方塊並返回使用者選擇的檔名,實際上並未開啟任何檔案。GetOpenFilename方法給你最大的控制從你的程式中開啟一個工作簿,因為它所做的就是以字串返回使用者選擇的檔案完整路徑和檔名。獲得檔名後接著做什麼就取決於你自己了。例如,你可能傳遞結果給OpenText 方法。這個方法的語法如下(所有的引數都是可選的):
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
引數FileFilter是一個定義過濾條件(如*.txt,*.xla)的字串;FilterIndx指定預設檔案過濾條件的序號,從1到 FileFilter中的過濾器數目;Title指定對話方塊的標題;ButtonText只用於Macintosh系統;MultiSelect是一個 Boolean值,表示可以多選檔案。
下面的例子顯示“開啟”對話方塊,並在檔案型別下拉框中使用文字檔案(*.txt)過濾條件,然後使用訊息框顯示使用者的選擇。
Dim fileToOpen As String
fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If fileToOpen <> "" Then
MsgBox "Open " & fileToOpen
End If
InputBox方法
就像你估計的,InputBox方法顯示一個對話方塊提示使用者輸入一個值。這個方法透過指定期望從使用者獲取的資料型別允許你有選擇性地輸入。
InputBox方法語法如下:
InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
其中:
Prompt是顯示在對話方塊中的資訊,在這裡你可以讓使用者知道你期望的資料型別。
Title是在對話方塊頂部顯示的標題。
Default是最初顯示的預設值。
Left和Top用來指定對話方塊的位置。這些值以螢幕的左上角為參考點,單位是磅。
HelpFile和HelpContextID指定一個幫助檔案。如果使用這些引數,在對話方塊中將包括一個Help按鈕。
Type是返回的資料型別,預設值是Text。允許的資料型別如下表。
Value Type
0 公式,以字串返回,只需要此引數
1 數值,你也可以在此包括一個返回一個數值的公式
2 文字(字串)
4 邏輯數值(True或False)
8 一個單元格引用,Range物件
16 一個錯誤數值,如#N/A
64 數值列表
注意:如果Type為8,你必須使用Set語句將結果賦值給一個Range物件,如下例所示
Set myRange = Application.InputBox(prompt := "Sample", type := 8)
下面的例子要求使用者輸入列印活動工作表的份數。注意Type參數列明此方法要求輸入數字。
Sub PrintActiveSheet()
Dim TotalCopies As Long, NumCopies As Long
Dim sPrompt As String, sTitle As String
 
sPrompt = "How many copies do you want?"
sTitle = "Prints the active sheet"
TotalCopies = Application.InputBox(Prompt:=sPrompt, Title:=sTitle, Default:=1, Type:=1)
 
For NumCopies = 1 To TotalCopies
ActiveSheet.PrintOut
Next NumCopies
End Sub
Run方法
Run方法執行一個宏或呼叫一個函式。你可以使用這個方法執行一個用VBA或Excel宏語言寫的宏,或者執行一個動態連結庫(DLL)或Excel載入宏(XLL)中的函式。XLL是Excel的載入宏,你可以使用任何支援建立DLLs的編譯器來建立它。下面是此方法的語法:
Run(Macro, Arg1,    , Arg30)
Macro是要執行的宏或函式的名字。Arg1到Arg30是你需要傳遞給宏或函式的任何引數。
下面的例子使用Run方法呼叫一個過程來設定一個範圍中單元格的字型為粗體。注意你也可以使用Call方法來達到同樣的結果。
Sub UseRunMethod()
Dim wks As Worksheet
Dim rng As Range
Set wks = Worksheets("Sheet2")
Set rng = wks.Range("A1:A10")
Application.Run "MyProc ", rng
' You could accomplish the same thing with:
' Call MyProc(rng)
End Sub
Sub MyProc(rng As Range)
With rng.Font
.Bold = True
End With
End Sub

Application物件事件

Application物件也提供幾個事件讓你可以用來監控整個Excel程式的動作。要使用Application事件,你必須啟用Application事件監控。請按照以下步驟操作:
1. 建立一個類。在VBE視窗中,單擊“插入”–>“類模組”
2. 在“屬性”欄中,更改類的名稱為appEventClass。
3. 在類模組的程式碼視窗,輸入:
Public WithEvents Apply As Application
現在Application級的事件可以使用了。
4. 現在測試一下,在程式碼視窗的物件列表中,單擊“Apply”。
5. 在程式碼視窗中的過程列表中,單擊Apply_WorkbookOpen. 這樣將在程式碼視窗中新增一個自動生成的過程用於Apply_WorkbookOpen事件。
6. 修改該過程如下:
Private Sub Apply_WorkbookOpen(ByVal Wb As Workbook)
       MsgBox "你開啟了工作簿。"
End Sub
7. 重複以上步驟加入Apply_WorkbookBeforeClose事件。修改該事件的程式碼如下:
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    MsgBox "你關閉了工作簿。"
End Sub
8. 接著,建立一個變數用來代表在類模組中建立的Application物件。在VBA Project的Project欄,雙擊ThisWorkbook節點開啟程式碼視窗。
9. 加入下面的語句。
Dim ApplicationClass As New AppEventClass
透過在ThisWorkbook程式碼視窗中新增以下過程來建立一個宣告的物件到Application物件的關聯。
Private Sub Workbook_Open()
Set ApplicationClass.Appl = Application
End Sub
10. 儲存並關閉工作簿。
11. 現在開啟該工作簿來測試程式碼。Apply_WorkbookOpen事件將顯示對話方塊。
12. 關閉工作簿,Apply_WorkbookBeforeClose將顯示對話方塊。
13. 回到AppEventClass類模組,單擊過程列表將顯示很多你可以在程式中用來監控動作的事件。
理解事件怎樣被激發並以何種順序激發對理解你的程式很重要。在類模組中加入其它事件,並插入訊息框,然後嘗試不同的動作看看什麼時候什麼事件將被啟用。

Application物件的其它用法

除了一些常用的物件外,你還可以在Excel程式中使用Application物件的其它的一些功能。下面討論部分用法。
刪除工作表時不彈出提示視窗
在下面的例子中,首先關閉任何詢問是否需要刪除工作表的警告訊息框,然後刪除工作表,再設定使警告訊息框生效。
Sub DeleteSheet()
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End Sub
儲存工作簿時無提示
這個例子在儲存工作簿時沒有提示使用者。
Sub SaveWorksheet()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:MonthlySales.xls"
Application.DisplayAlerts = True
End Sub
使用SendKeys傳送資訊到Notepad程式
下面的例子使用SendKeys語句從Excel語句中複製一個區域的資料到Notepad程式中,並儲存為文字檔案。
Sub SKeys()
Range("A1:D15").Copy ' Copy the range.
SendKeys "% n", True ' Minimize Excel.
Shell "notepad.exe", vbNormalFocus ' Start Notepad.
SendKeys "^V", True ' Past the range data into Notepad.
SendKeys "%FA", True ' Specify SaveAs.
SendKeys "SalesData.txt", True ' Provide a file name.
SendKeys "%S", True ' Save the file.
Close notepad
End Sub
這個例子首先複製一個區域的資料到剪貼簿,然後最小化Excel,啟動Notepad,然後從剪貼簿複製資料到Notepad,最後指定檔名並儲存檔案,再關閉Notepad。
在指定時間或間隔執行一個宏
你可以使用Application物件的OnTime方法在指定的時間或以固定時間間隔執行一個過程。OnTime方法的語法如下:
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
引數EarliestTime表示什麼使用執行名稱為引數Procedure的過程。可選引數LatestTime和Schedule變數分別表示執行過程的最後時間和是否新建一個過程來執行還是取消現有的過程。假如開始執行時Excel很忙,你需要指定一個時間範圍來呼叫過程時引數 LatestTime很有幫助。
下面的示例每5分鐘執行指定的過程YourProc
Application.OnTime EarliestTime:= Now + TimeValue("00:05:00), _
Procedure := "YourProc"
下面的示例每天正午的時候執行過程YourProc.
Application.OnTime _
EarliestTime:=TimeValue("12:00:00"), _
Procedure:="YourProc"
下面的示例每5分鐘呼叫AutoSave過程。如果你關閉工作簿,呼叫Cleanup過程來取消前面設定的OnTime。
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:05:00"), "AutoSave"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime Now + TimeValue("00:05:00"), "CleanUp", , False
End Sub
注意:Workbook_Open和Workbook_BeforeClose事件包含在Workbook模組中。AutoSave和CleanUp過程應該位於標準模組中。

結論

這篇文章僅介紹Application物件的一部分成員。還有其他成員讓你的使用者以新的方式同Excel程式互動和改變你程式的外觀。熟悉Application物件的使用將讓你按照你自己的要求擴充套件和採用Excel的功能。
[@more@]Workbook 物件 應用示例 2009-12-29 21:37:01
標籤:vba 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盤中的工作簿以只讀方式開啟"
    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。由於該屬性值

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7868752/viewspace-1057393/,如需轉載,請註明出處,否則將追究法律責任。

Excel Application物件 開發指南
請登入後發表評論 登入
全部評論

相關文章