1. 程式人生 > >Excel Application操作指南

Excel Application操作指南

不返回 文本文 取消 books origin 做的 ring 模板文件 general

概述

Application對象是Microsoft Office Excel 2007對象模型中最高級別的對象,表示Excel程序自身。Application對象提供正在運行的程序的信息、應用於程序實例的選項以及實例中打開的當前對象。因為它是對象模型中最高的對象,Application對象也包含組成一個工作簿的很多部件,包括如工作簿、工作表集合、單元格以及這些對象所包含的數據等。 Application對象包括:
  • 程序範圍的設置和選項。這些選項大部分同“工具”菜單下的“選項”對話框裏的內容相同。
  • 頂級對象返回的方法,如ActiveCell、ActiveSheet等。
在下面幾節裏,你將通過使用VBA代碼示例學習到一些Application對象中經常使用到的對象、方法和屬性。關於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) Nexti 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 EndSub

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 "?", 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 AsBoolean) 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.AddSet 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 AsInteger) As Workbook ‘創建帶有由變量wsCount提定數量工作表的工作簿,工作表數在1至255之間 Dim OriginalWorksheetCount As Long Set NewWorkbook = Nothing IfwsCount < 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 EndSub
[應用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 = 0While 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。由於該屬性值

Excel Application操作指南