這個(gè)是MSDN上的文章,內(nèi)容是介紹怎樣對(duì)Excel2007的Application對(duì)象的成員進(jìn)行編程,但是實(shí)際內(nèi)容也適用于Excel2003或之前的版本。
概述
Application對(duì)象是Microsoft Office Excel 2007對(duì)象模型中最高級(jí)別的對(duì)象,表示Excel程序自身。Application對(duì)象提供正在運(yùn)行的程序的信息、應(yīng)用于程序?qū)嵗倪x項(xiàng)以及實(shí)例中打開(kāi)的當(dāng)前對(duì)象。因?yàn)樗菍?duì)象模型中最高的對(duì)象,Application對(duì)象也包含組成一個(gè)工作簿的很多部件,包括如工作簿、工作表集合、單元格以及這些對(duì)象所包含的數(shù)據(jù)等。
Application對(duì)象包括:
- 程序范圍的設(shè)置和選項(xiàng)。這些選項(xiàng)大部分同“工具”菜單下的“選項(xiàng)”對(duì)話框里的內(nèi)容相同。
- 頂級(jí)對(duì)象返回的方法,如ActiveCell、ActiveSheet等。
在下面幾節(jié)里,你將通過(guò)使用VBA代碼示例學(xué)習(xí)到一些Application對(duì)象中經(jīng)常使用到的對(duì)象、方法和屬性。關(guān)于Application對(duì)象模型所有成員的詳細(xì)資料,請(qǐng)參考Application對(duì)象成員。
Application對(duì)象中其它對(duì)象的引用方法
你可以使用Application屬性返回Application對(duì)象。獲取一個(gè)Application對(duì)象后,如需訪問(wèn)它下面的對(duì)象,可以在對(duì)象模型層級(jí)中往下移動(dòng)。下面示例設(shè)置一個(gè)工作表的第一個(gè)單元格內(nèi)容為20。
Application.Workbooks(1).Worksheets(1).Cells(1,1)=20
要表示一個(gè)單元格,上面的代碼示例從Application對(duì)象開(kāi)始,移到第一個(gè)工作簿,再移到第一個(gè)工作表,最后到這個(gè)單元格。
下面示例在另一個(gè)Excel程序中創(chuàng)建一個(gè)Excel工作簿對(duì)象,然后打開(kāi)一個(gè)工作簿。
Set xl=CreateObject("Excel.Sheet") xl.Application.Workbooks.Open "newbook.xls"
不需要使用“Application”限定詞,很多的屬性和方法也可以直接被用來(lái)返回那些最常用的用戶界面對(duì)象,如活動(dòng)工作表 (ActiveSheet屬性)。例如,除了使用Application.ActiveSheet.Name = “Monthly Sales”,你也可以使用ActiveSheet.Name = “Monthly Sales”。然而,當(dāng)使用這個(gè)簡(jiǎn)便表示方法時(shí)必需小心,需要選擇正確的對(duì)象。例如通過(guò)使用Worksheet對(duì)象的Activate方確定你選擇了正確的工作簿和工作表后,你可以使用Cell(1,1)表示第一個(gè)單元格。
有幾種情況你必需使用Application限定詞。例如,OnTime對(duì)象(本文后面部分將討論)需要這個(gè)限定詞,還有程序窗口的Width和 Height屬性。一般來(lái)說(shuō),用來(lái)處理Excel窗口的外觀或影響程序全局行為的屬性或方法需要使用Application限定詞;例如, DisplayFormlaBar屬性用來(lái)顯示或隱藏公式欄,Calculation方法也需要限定詞。
Application對(duì)象集合
這一節(jié)詳細(xì)介紹一些和Application對(duì)象相關(guān)的集合。
AddIns集合
AddIns集合表示所有當(dāng)前加載的Excel Add-in。你可以像枚舉其它對(duì)象一樣在你的程序中列舉出關(guān)于add-in的不同類型信息。下面的示例列舉出當(dāng)前加載到Excel中的Add-in的路徑和名稱。
Sub ListAddIns() Dim myAddin As AddIn For Each myAddin In AddIns MsgBox myAddin.FullName Next End Sub
Columns和Rows集合
這兩個(gè)集合表示活動(dòng)工作簿中的列和行。分別使用它們選擇指定的列和行。
Application.Columns(4).Select
這個(gè)語(yǔ)句選擇D列,就像你通過(guò)點(diǎn)擊用戶界面中的列的頂部一樣。
Application.Rows(5).Select
這個(gè)語(yǔ)句選擇工作表中的第5行,就像你點(diǎn)擊行的左邊框一樣。
Dialogs集合
Dialogs集合包括Excel程序中所有的對(duì)話框。將在本文中后面部分更詳細(xì)地討論Dialogs集合。
Sheets集合
Sheets集合返回指定或活動(dòng)工作簿中所有工作表的集合。Sheets集合可以包含Chart或Worksheet對(duì)象。
下面示例打印出活動(dòng)工作簿中所有的工作表。
Application.Sheets.PrintOut
這個(gè)示例循環(huán)工作簿中所有的工作表并打印出包含數(shù)據(jù)區(qū)域的任何工作表。
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對(duì)象的屬性
有很多的屬性可以用來(lái)訪問(wèn)Excel 2007程序的各種對(duì)象,多得不能記住或在這里全部討論。幸運(yùn)的是只有一部分是你可能經(jīng)常使用的。
- ActiveCell
- ActiveChart
- ActiveSheet
- ActiveWindow
- ActiveWorkbook
- RangeSelection
- Selection
- StatusBar
- ThisWorkbook
下面的內(nèi)容演示這些常用屬性的使用方法。
ActiveCell屬性
Application對(duì)象的ActiveCell屬性返回一個(gè)表示活動(dòng)工作簿中活動(dòng)工作表的活動(dòng)單元格的Range對(duì)象。如果你沒(méi)有指定對(duì)象限定詞,這個(gè)屬性返回活動(dòng)窗口的活動(dòng)單元格。
注意區(qū)別活動(dòng)單元格和選擇的單元格。活動(dòng)單元格是當(dāng)前選擇中的一個(gè)單元格。選擇(Selection)可能包括一個(gè)單元格集合,但只有其中一個(gè)是活動(dòng)單元格。
下面的示例改變活動(dòng)單元格的字體格式。注意為了確保你操作正確的單元格,工作表集合的Activate方法讓Sheet1成為活動(dòng)工作表。
Worksheets("Sheet1").Activate With ActiveCell.Font .Bold = True .Italic = True End With
ActiveChart屬性
ActiveChart屬性返回表示活動(dòng)圖表的Chart對(duì)象,不管它是嵌入的圖表還是圖表工作表。在一個(gè)嵌入的圖表被選擇或激活時(shí),它就是活動(dòng)圖表。下面的示例使用ActiveChart屬性添加一個(gè)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屬性返回一個(gè)表示當(dāng)前選中的工作表(頂部工作表)的Worksheet對(duì)象。在一個(gè)工作簿中只有一個(gè)工作表能成為活動(dòng)工作表。下面的示例顯示活動(dòng)工作表的名稱。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
下面的示例將活動(dòng)工作表復(fù)制用戶指定的次數(shù)并放置在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屬性返回一個(gè)表示活動(dòng)窗口(頂部窗口)的Window對(duì)象。下面的示例顯示活動(dòng)窗口的名稱(Caption屬性)。
MsgBox "The name of the active window is " & ActiveWindow.Caption
Caption屬性作為活動(dòng)窗口的名稱允許你通過(guò)使用友好的名稱而不是序號(hào)來(lái)獲得窗口。
下面的示例選擇并打印一個(gè)工作表,然后對(duì)第二個(gè)工作表重復(fù)此過(guò)程。
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
在這個(gè)例子中,你可能疑惑為什么設(shè)置ScreenUpdating屬性為False。當(dāng)Excel執(zhí)行一系列任務(wù)時(shí),屏幕被更新并刷新很多次,這將導(dǎo)致屏幕閃爍。設(shè)置ScreenUpdating屬性為False可以消除閃爍。另外,因?yàn)殡娔X處理器不需要暫停來(lái)刷新屏幕,這樣也可以讓大型程序運(yùn)行得較快一點(diǎn)。
ActiveWorkbook屬性
ActiveWorkbook屬性返回一個(gè)表示活動(dòng)窗口(頂部窗口)中的工作簿的Workbook對(duì)象。這個(gè)示例顯示活動(dòng)工作簿的名稱。
MsgBox "The name of the active workbook is " & ActiveWorkbook.Name
下面示例設(shè)置計(jì)算模式為手動(dòng)(這樣其它工作簿將不計(jì)算),然后循環(huán)并計(jì)算活動(dòng)工作簿的每個(gè)工作表。
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屬性返回一個(gè)表示指定窗口中工作表里選擇的單元格的Range對(duì)象,即使在工作表中一個(gè)圖表對(duì)象已經(jīng)被選擇或激活。這個(gè)示例顯示活動(dòng)窗口中工作表所選擇單元格的地址。
MsgBox Application.ActiveWindow.RangeSelection.Address
當(dāng)你選擇了一個(gè)范圍,RangeSelection屬性和Selection對(duì)象表示同樣一個(gè)范圍。當(dāng)你選擇一個(gè)圖表,RangeSelection屬性返回之前選擇的范圍。Selection屬性將在下一節(jié)中詳細(xì)介紹。
這里介紹的語(yǔ)法RangeSelection.Name.Name在Office2003和2007中使用時(shí)都出現(xiàn)錯(cuò)誤,如果該代碼生效,必須先設(shè)置單元格A1的名稱。并且應(yīng)該不是單元格內(nèi)容的前三個(gè)字符,而是名稱的前三個(gè)字符。這應(yīng)該是原文的疏漏。
下面的示例顯示一個(gè)單元格中的前三個(gè)字符。
Range("A1").Select
MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
你可能奇怪為什么使用這樣的語(yǔ)法
ActiveWindow.RangeSelection.Name.Name
當(dāng)你選擇一個(gè)范圍,使用RangeSelection.Name方法可以獲取像Sheet1!$A$1:$B$15這樣的范圍地址。另外,使用RangeSelection.Name.Name方法可以獲取命名像MyRange1這樣的范圍本身的名稱。
Selection屬性
Selection屬性返回活動(dòng)窗口中被選擇的對(duì)象。例如,對(duì)于單元格,這個(gè)屬性返回Range對(duì)象;對(duì)于圖表,它返回Chart對(duì)象。如果使用屬性而沒(méi)有對(duì)象限定符,等于使用Application.Selection。
這個(gè)示例清除Sheet1所選的內(nèi)容。
Worksheets("Sheet1").Activate Selection.Clear
下面的例子將所選范圍的總行數(shù)保存到變量NumRows。
NumRows = 0 For Each area In Selection.Areas NumRows = NumRows + area.Rows.Count Next area
這個(gè)例子統(tǒng)計(jì)所選單元格的總數(shù)并在消息框中顯示結(jié)果。
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屬性返回或設(shè)置狀態(tài)欄的文本。這個(gè)屬性允許你更改在Excel窗口底部的狀態(tài)欄中顯示的信息。它對(duì)在運(yùn)算過(guò)程需要較長(zhǎng)時(shí)間來(lái)完成時(shí)讓用戶知道正在運(yùn)行的進(jìn)度非常有幫助。
如果Excel控制狀態(tài)欄時(shí)StatusBar屬性返回False。另外,如需恢復(fù)默認(rèn)狀態(tài)欄文本,只需設(shè)置屬性值為False即可;甚至在狀態(tài)欄隱藏時(shí)也有效。
例如,使用下面的方式對(duì)每個(gè)處理的文件你可以給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
然后當(dāng)過(guò)程結(jié)束,你需要使用下面的語(yǔ)句將狀態(tài)欄設(shè)置回正常狀態(tài)。
Application.StatusBar = False
你可以創(chuàng)建你自己的過(guò)程使用StatusBar屬性顯示一個(gè)宏或其它過(guò)程的進(jìn)度。
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
這個(gè)例子在狀態(tài)欄上顯示最大15個(gè)方塊(由常數(shù)MAXSQR定義)。這個(gè)方塊通過(guò)使用ASCII字符31來(lái)產(chǎn)生。這個(gè)缺少關(guān)于宏需要多長(zhǎng)時(shí)間的視覺(jué)指示,它僅表明宏正在進(jìn)行。Wait方法模擬一個(gè)宏需要長(zhǎng)時(shí)間來(lái)執(zhí)行。
ThisWorkbook屬性
ThisWorkbook屬性返回一個(gè)表示當(dāng)前運(yùn)行的宏代碼所在工作簿的 Workbook對(duì)象。這個(gè)屬性允許載入宏定義包含代碼的工作簿。這種情況下ActiveWorkbook屬性并不起作用,因?yàn)榛顒?dòng)工作簿可能并不是包含載入宏代碼的工作簿。換句話說(shuō),ActiveWorkbook屬性不返回載入宏工作簿;它返回調(diào)用載入宏的工作簿。如果你使用你的Visual Basic代碼創(chuàng)建載入宏,你應(yīng)該使用ThisWorkbook屬性來(lái)限定任何必須運(yùn)行在包含載入宏的工作簿上的語(yǔ)句。
下面示例關(guān)閉包含示例代碼的工作簿。如果對(duì)工作簿的修改不被保存。
ThisWorkbook.Close SaveChanges:=False
下面的示例循環(huán)每個(gè)打開(kāi)的工作簿并關(guān)閉它。然后關(guān)閉包含這個(gè)代碼的工作簿。
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對(duì)象方法
除了Application對(duì)象屬性外,下面將介紹一些更加常用的方法。
FindFile方法和Dialogs集合
同GetOpenFilename方法不同,F(xiàn)indFile方法顯示Open對(duì)話框并允許用戶打開(kāi)一個(gè)文件。如果新文件成功打開(kāi),此方法返回True。如果用戶取消對(duì)話框,此方法返回False。
下面示例顯示一個(gè)消息框提示用戶打開(kāi)一個(gè)指定文件,然后顯示Open對(duì)話框。如果用戶不能打開(kāi)文件,顯示一個(gè)消息框。
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
你也可以通過(guò)使用Dialogs集合細(xì)目的其中一個(gè)打開(kāi)特別的對(duì)話框來(lái)完成同樣的事情。使用Dialogs集合的一個(gè)好處是當(dāng)你使用Show方法時(shí),你可以傳遞參數(shù)給它來(lái)修改內(nèi)置對(duì)話框的默認(rèn)行為。例如,xlDialogOpen的參數(shù)有: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.
注意:如需查找某個(gè)特定的對(duì)話框的參數(shù),在Excel幫助文檔的“內(nèi)置對(duì)話框參數(shù)列表”中找到相應(yīng)的對(duì)話框常數(shù)。
下面的例子顯示“打開(kāi)”對(duì)話框并設(shè)置“Book1.xls”在文件名下拉列表框中,用戶不需要選擇文件就可以在對(duì)話框中顯示文件名。
Sub OpenFile2( ) Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xls" End Sub
Dialogs集合最激動(dòng)人心的部分是你可以使用它顯示任何Excel對(duì)話框-大約250種。你可以通過(guò)下面的步驟查看Dialogs集合的完整對(duì)話框列表。
- 打開(kāi)Visual Basic編輯器。
- 單擊菜單“視圖”->“對(duì)象瀏覽器”,顯示對(duì)象瀏覽器窗口,也可以按F2。
- 在搜索框中輸入xlBuiltInDialog。
- 單擊Search按鈕。
GetOpenFilename方法
GetOpenFilename 方法顯示標(biāo)準(zhǔn)“打開(kāi)”對(duì)話框并返回用戶選擇的文件名,實(shí)際上并未打開(kāi)任何文件。GetOpenFilename方法給你最大的控制從你的程序中打開(kāi)一個(gè)工作簿,因?yàn)樗龅木褪且宰址祷赜脩暨x擇的文件完整路徑和文件名。獲得文件名后接著做什么就取決于你自己了。例如,你可能傳遞結(jié)果給OpenText 方法。這個(gè)方法的語(yǔ)法如下(所有的參數(shù)都是可選的):
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
參數(shù)FileFilter是一個(gè)定義過(guò)濾條件(如*.txt,*.xla)的字符串;FilterIndx指定默認(rèn)文件過(guò)濾條件的序號(hào),從1到 FileFilter中的過(guò)濾器數(shù)目;Title指定對(duì)話框的標(biāo)題;ButtonText只用于Macintosh系統(tǒng);MultiSelect是一個(gè) Boolean值,表示可以多選文件。
下面的例子顯示“打開(kāi)”對(duì)話框,并在文件類型下拉框中使用文本文件(*.txt)過(guò)濾條件,然后使用消息框顯示用戶的選擇。
Dim fileToOpen As String fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") If fileToOpen <> "" Then MsgBox "Open " & fileToOpen End If
InputBox方法
就像你估計(jì)的,InputBox方法顯示一個(gè)對(duì)話框提示用戶輸入一個(gè)值。這個(gè)方法通過(guò)指定期望從用戶獲取的數(shù)據(jù)類型允許你有選擇性地輸入。
InputBox方法語(yǔ)法如下:
InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
其中:
Prompt是顯示在對(duì)話框中的信息,在這里你可以讓用戶知道你期望的數(shù)據(jù)類型。
Title是在對(duì)話框頂部顯示的標(biāo)題。
Default是最初顯示的默認(rèn)值。
Left和Top用來(lái)指定對(duì)話框的位置。這些值以屏幕的左上角為參考點(diǎn),單位是磅。
HelpFile和HelpContextID指定一個(gè)幫助文件。如果使用這些參數(shù),在對(duì)話框中將包括一個(gè)Help按鈕。
Type是返回的數(shù)據(jù)類型,默認(rèn)值是Text。允許的數(shù)據(jù)類型如下表。
Value Type
0 公式,以字符串返回,只需要此參數(shù)
1 數(shù)值,你也可以在此包括一個(gè)返回一個(gè)數(shù)值的公式
2 文本(字符串)
4 邏輯數(shù)值(True或False)
8 一個(gè)單元格引用,Range對(duì)象
16 一個(gè)錯(cuò)誤數(shù)值,如#N/A
64 數(shù)值列表
注意:如果Type為8,你必須使用Set語(yǔ)句將結(jié)果賦值給一個(gè)Range對(duì)象,如下例所示
Set myRange = Application.InputBox(prompt := "Sample", type := 8)
下面的例子要求用戶輸入打印活動(dòng)工作表的份數(shù)。注意Type參數(shù)表明此方法要求輸入數(shù)字。
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方法執(zhí)行一個(gè)宏或調(diào)用一個(gè)函數(shù)。你可以使用這個(gè)方法運(yùn)行一個(gè)用VBA或Excel宏語(yǔ)言寫(xiě)的宏,或者運(yùn)行一個(gè)動(dòng)態(tài)鏈接庫(kù)(DLL)或Excel加載宏(XLL)中的函數(shù)。XLL是Excel的加載宏,你可以使用任何支持創(chuàng)建DLLs的編譯器來(lái)創(chuàng)建它。下面是此方法的語(yǔ)法:
Run(Macro, Arg1, , Arg30)
Macro是要執(zhí)行的宏或函數(shù)的名字。Arg1到Arg30是你需要傳遞給宏或函數(shù)的任何參數(shù)。
下面的例子使用Run方法調(diào)用一個(gè)過(guò)程來(lái)設(shè)置一個(gè)范圍中單元格的字體為粗體。注意你也可以使用Call方法來(lái)達(dá)到同樣的結(jié)果。
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對(duì)象事件
Application對(duì)象也提供幾個(gè)事件讓你可以用來(lái)監(jiān)控整個(gè)Excel程序的動(dòng)作。要使用Application事件,你必須激活A(yù)pplication事件監(jiān)控。請(qǐng)按照以下步驟操作:
1. 創(chuàng)建一個(gè)類。在VBE窗口中,單擊“插入”–>“類模塊”
2. 在“屬性”欄中,更改類的名稱為appEventClass。
3. 在類模塊的代碼窗口,輸入:
Public WithEvents Apply As Application
現(xiàn)在Application級(jí)的事件可以使用了。
4. 現(xiàn)在測(cè)試一下,在代碼窗口的對(duì)象列表中,單擊“Apply”。
5. 在代碼窗口中的過(guò)程列表中,單擊Apply_WorkbookOpen. 這樣將在代碼窗口中添加一個(gè)自動(dòng)生成的過(guò)程用于Apply_WorkbookOpen事件。
6. 修改該過(guò)程如下:
Private Sub Apply_WorkbookOpen(ByVal Wb As Workbook) MsgBox "你打開(kāi)了工作簿。" End Sub
7. 重復(fù)以上步驟加入Apply_WorkbookBeforeClose事件。修改該事件的代碼如下:
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) MsgBox "你關(guān)閉了工作簿。" End Sub
8. 接著,創(chuàng)建一個(gè)變量用來(lái)代表在類模塊中創(chuàng)建的Application對(duì)象。在VBA Project的Project欄,雙擊ThisWorkbook節(jié)點(diǎn)打開(kāi)代碼窗口。
9. 加入下面的語(yǔ)句。
Dim ApplicationClass As New AppEventClass
通過(guò)在ThisWorkbook代碼窗口中添加以下過(guò)程來(lái)建立一個(gè)聲明的對(duì)象到Application對(duì)象的關(guān)聯(lián)。
Private Sub Workbook_Open() Set ApplicationClass.Appl = Application End Sub
10. 保存并關(guān)閉工作簿。
11. 現(xiàn)在打開(kāi)該工作簿來(lái)測(cè)試代碼。Apply_WorkbookOpen事件將顯示對(duì)話框。
12. 關(guān)閉工作簿,Apply_WorkbookBeforeClose將顯示對(duì)話框。
13. 回到AppEventClass類模塊,單擊過(guò)程列表將顯示很多你可以在程序中用來(lái)監(jiān)控動(dòng)作的事件。
理解事件怎樣被激發(fā)并以何種順序激發(fā)對(duì)理解你的程序很重要。在類模塊中加入其它事件,并插入消息框,然后嘗試不同的動(dòng)作看看什么時(shí)候什么事件將被激活。
Application對(duì)象的其它用法
除了一些常用的對(duì)象外,你還可以在Excel程序中使用Application對(duì)象的其它的一些功能。下面討論部分用法。
刪除工作表時(shí)不彈出提示窗口
在下面的例子中,首先關(guān)閉任何詢問(wèn)是否需要?jiǎng)h除工作表的警告消息框,然后刪除工作表,再設(shè)置使警告消息框生效。
Sub DeleteSheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
保存工作簿時(shí)無(wú)提示
這個(gè)例子在保存工作簿時(shí)沒(méi)有提示用戶。
Sub SaveWorksheet() Application.DisplayAlerts = False ActiveWorkbook.SaveAs "C:\MonthlySales.xls" Application.DisplayAlerts = True End Sub
使用SendKeys發(fā)送信息到Notepad程序
下面的例子使用SendKeys語(yǔ)句從Excel語(yǔ)句中復(fù)制一個(gè)區(qū)域的數(shù)據(jù)到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
這個(gè)例子首先復(fù)制一個(gè)區(qū)域的數(shù)據(jù)到剪貼板,然后最小化Excel,啟動(dòng)Notepad,然后從剪貼板復(fù)制數(shù)據(jù)到Notepad,最后指定文件名并保存文件,再關(guān)閉Notepad。
在指定時(shí)間或間隔運(yùn)行一個(gè)宏
你可以使用Application對(duì)象的OnTime方法在指定的時(shí)間或以固定時(shí)間間隔運(yùn)行一個(gè)過(guò)程。OnTime方法的語(yǔ)法如下:
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
參數(shù)EarliestTime表示什么使用運(yùn)行名稱為參數(shù)Procedure的過(guò)程。可選參數(shù)LatestTime和Schedule變量分別表示運(yùn)行過(guò)程的最后時(shí)間和是否新建一個(gè)過(guò)程來(lái)運(yùn)行還是取消現(xiàn)有的過(guò)程。假如開(kāi)始運(yùn)行時(shí)Excel很忙,你需要指定一個(gè)時(shí)間范圍來(lái)調(diào)用過(guò)程時(shí)參數(shù) LatestTime很有幫助。
下面的示例每5分鐘運(yùn)行指定的過(guò)程YourProc
Application.OnTime EarliestTime:= Now + TimeValue("00:05:00), _ Procedure := "YourProc"
下面的示例每天正午的時(shí)候運(yùn)行過(guò)程YourProc.
Application.OnTime _ EarliestTime:=TimeValue("12:00:00"), _ Procedure:="YourProc"
下面的示例每5分鐘調(diào)用AutoSave過(guò)程。如果你關(guān)閉工作簿,調(diào)用Cleanup過(guò)程來(lái)取消前面設(shè)置的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過(guò)程應(yīng)該位于標(biāo)準(zhǔn)模塊中。
結(jié)論
這篇文章僅介紹Application對(duì)象的一部分成員。還有其他成員讓你的用戶以新的方式同Excel程序交互和改變你程序的外觀。熟悉Application對(duì)象的使用將讓你按照你自己的要求擴(kuò)展和采用Excel的功能。