[完美Excel]本文以MSDN中的技術(shù)文章《Developers Guide to the Excel 2007 Application Object》為線條,參考了一系列相關(guān)技術(shù)文章和圖書資料,全面整理和總結(jié)了Application對(duì)象應(yīng)用知識(shí)。
Application對(duì)象是Excel對(duì)象模型中最高層級(jí)的對(duì)象,代表Excel應(yīng)用程序自身,也包含組成工作簿的許多部分,包括工作簿、工作表、單元格集合以及它們包含的數(shù)據(jù)。
Application對(duì)象包含:
- 應(yīng)用程序設(shè)置和選項(xiàng),許多選項(xiàng)與“選項(xiàng)”對(duì)話框中的選項(xiàng)相同。
- 返回頂級(jí)對(duì)象的方法,例如ActiveCell、ActiveSheet,等等。
本文使用VBA代碼示例簡(jiǎn)要介紹了與Application對(duì)象相關(guān)的經(jīng)常使用的對(duì)象、方法和屬性,其中一些成員能夠改變用戶與Excel應(yīng)用程序交互的方式,還能夠改變應(yīng)用程序的外觀和式樣。熟悉Application對(duì)象能夠讓您擴(kuò)展和調(diào)整Excel的功能,以滿足自已的需求。
本文主要介紹的內(nèi)容如下:
從Application對(duì)象中引用對(duì)象
Application對(duì)象相關(guān)的集合
- AddIns集合
- Columns集合和Rows集合
- Dialogs集合
- Sheets集合
Application對(duì)象相關(guān)的屬性
- ActiveCell屬性
- ActiveChart屬性
- ActiveSheet屬性
- ActiveWindow屬性
- ActiveWorkbook屬性
- RangeSelection屬性
- ScreenUpdating屬性
- Selection屬性
- StatusBar屬性
- ThisWorkbook屬性
Application對(duì)象相關(guān)的方法
- FindFile方法和Dialogs集合
- GetOpenFilename方法
- GetSaveAsFilename方法
- InputBox方法
- Run方法
Application對(duì)象相關(guān)的事件
- 激活A(yù)pplication事件監(jiān)視
使用Application對(duì)象執(zhí)行其它任務(wù)
- 刪除工作表而顯示提示信息(DisplayAlerts屬性)
- 無須提示用戶而保存工作表(DisplayAlerts屬性)
- 使用SendKeys方法發(fā)送信息到記事本
- 安排宏在指定的時(shí)間和間隔運(yùn)行(OnTime方法)
Application對(duì)象的其它一些屬性和方法
- Caller屬性
- CutCopyMode屬性
- Evaluate方法
- OnKey方法
- ThisCell屬性
- WorksheetFunction屬性
- 改變光標(biāo)顯示(Cursor屬性)
- 獲取或改變Excel窗口的狀態(tài)或大小(WindowState屬性)
- 獲取系統(tǒng)信息
- 自動(dòng)隱藏公式欄(DisplayFormulaBar屬性)
- 將Excel全屏顯示(DisplayFullScreen屬性)
- 獲取Excel啟動(dòng)文件夾的路徑(StartupPath屬性)
- 檢測(cè)Excel的版本(Version屬性)
- 打開最近使用過的文檔(RecentFiles屬性)
- 文件對(duì)話框操作(FileDialog屬性)
- 改變Excel工作簿的名稱(Caption屬性)
- 調(diào)用Windows的計(jì)算器(ActivateMicrosoftApp方法)
- 暫時(shí)停止宏運(yùn)行(Wait方法)
- 重新計(jì)算工作簿(Calculate方法)
- 控制函數(shù)重新計(jì)算(Volatile方法)
- 獲取重疊區(qū)域(Intersect方法)
- 獲取路徑分隔符(PathSeparator屬性)
- 快速移至指定位置(Goto方法)
- 關(guān)閉Excel(Quit方法)
從Application對(duì)象中引用對(duì)象
使用Application屬性返回Application對(duì)象。在引用應(yīng)用程序之后,要訪問Application對(duì)象下面的對(duì)象,則依次下移對(duì)象模型層級(jí)。例如,下面的代碼設(shè)置第一個(gè)工作簿的第一個(gè)工作表中的第一個(gè)單元格的值為20:
Application.Workbooks(1).Worksheets(1).Cells(1, 1) = 20
要引用該單元格,上述代碼以Application對(duì)象開始,移至第一個(gè)工作簿,然后到第一個(gè)工作表,最后到達(dá)單元格。
下面的示例代碼在另一個(gè)應(yīng)用程序中創(chuàng)建一個(gè)Excel工作簿,然后打開該工作簿:
Set xl = CreateObject("Excel.Sheet") xl.Application.Workbooks.Open "newbook.xls"
可以使用許多屬性和方法返回最常用的用戶界面對(duì)象,例如活動(dòng)工作表(ActiveSheet屬性),而無須Application對(duì)象限定。例如,下面的代碼:
Application.ActiveSheet.Name = "Monthly Sales"
可以替換為:
ActiveSheet.Name = "Monthly Sales"
然而,在使用簡(jiǎn)短的引用時(shí)必須小心,必須已經(jīng)選擇了正確的對(duì)象。如果已經(jīng)使用諸如Worksheet對(duì)象的Activate方法選擇了合適的工作簿和工作表,那么能夠使用下面的代碼引用第一個(gè)單元格:
Cells(1, 1) = 20
有一些實(shí)例必須使用Application限定引用。例如,OnTime方法、應(yīng)用程序窗口的Width和Height屬性。通常,處理Excel窗口外觀的屬性或者影響應(yīng)用程序全部行為的屬性需要Application限定,例如DisplayFormulaBar屬性用于顯示或隱藏公式欄。Calculation方法也需要限定。
Application對(duì)象相關(guān)的集合
本節(jié)介紹與Application對(duì)象相關(guān)的一些集合。
AddIns集合
AddIns集合代表當(dāng)前在Excel中裝載的所有加載項(xiàng)。就像遍歷任何其它集合一樣,可以列出應(yīng)用程序中關(guān)于加載項(xiàng)的不同類型的信息。下面的示例列出當(dāng)前在Excel中裝載的加載項(xiàng)的路徑和名稱:
Sub ListAddIns() Dim myAddin As AddIn For Each myAddin In AddIns MsgBox myAddin.FullName Next End Sub
Columns集合和Rows集合
這些集合代表當(dāng)前工作簿中的列和行,可以使用它們分別選擇指定的列和行。
Application.Columns(4).Select
上述語句選擇D列,就像在工作表中單擊該列的標(biāo)題一樣。
Application.Rows(5).Select
上述語句選擇第5行,就像在工作表中單擊該行的行邊一樣。
Dialogs集合
Dialogs集合由應(yīng)用程序中所有的對(duì)話框組成。本文后面將詳細(xì)介紹該集合。
Sheets集合
Sheets對(duì)象返回指定工作簿或活動(dòng)工作簿中所有工作表的集合。Sheets集合包含Chart對(duì)象或Worksheet對(duì)象。下面的示例打印活動(dòng)工作簿中所有工作表:
Application.Sheets.PrintOut
下面的示例遍歷工作簿中所有的工作表,并打印包含有數(shù)據(jù)的工作表:
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ì)象相關(guān)的屬性
在Excel 2007應(yīng)用程序中,有大量的屬性用來訪問不同的對(duì)象。這里,只探討經(jīng)常使用的屬性。
- ActiveCell
- ActiveChart
- ActiveSheet
- ActiveWindow
- ActiveWorkbook
- RangeSelection
- ScreenUpdating
- Selection
- StatusBar
- ThisWorkbook
ActiveCell屬性
Application對(duì)象的ActiveCell屬性返回Range對(duì)象,代表活動(dòng)工作簿的活動(dòng)工作表中的活動(dòng)單元格。如果沒有指定對(duì)象限定,那么該屬性返回活動(dòng)窗口中的活動(dòng)單元格。
注意區(qū)分活動(dòng)單元格和單元格選區(qū)?;顒?dòng)單元格是當(dāng)前選區(qū)里的單個(gè)單元格,選區(qū)可能包含很多單元格,但僅有一個(gè)單元格是活動(dòng)單元格。
下面的示例改變活動(dòng)單元格的字體格式。注意確保正在處理正確的單元格,Worksheets集合的Activate方法使工作表Sheet1為活動(dòng)工作表。
Worksheets("Sheet1").Activate With ActiveCell.Font .Bold = True .Italic = True End With
ActiveChart屬性
ActiveChart屬性返回Chart對(duì)象,代表活動(dòng)圖表,無論該圖表是嵌入式圖表還是圖表工作表。當(dāng)嵌入式圖表被選擇或者被激活時(shí),該圖表是活動(dòng)圖表。下面的示例使用ActiveChart屬性在工作表Monthly Sales中添加一個(gè)三維柱形圖:
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對(duì)象,代表當(dāng)前所選擇的工作表(在頂部的工作表)。在一個(gè)工作簿中僅僅有一個(gè)工作表是活動(dòng)工作表。下面的示例顯示活動(dòng)工作表的名字:
MsgBox "活動(dòng)工作表的名字是" & ActiveSheet.Name
下面的示例由用戶指定復(fù)制活動(dòng)工作表的次數(shù)并復(fù)制活動(dòng)工作表,將復(fù)制的工作表放置到工作表Sheet1的前面:
Sub CopyActiveSheet() Dim x As Integer, numtimes As Integer x = InputBox("請(qǐng)輸入復(fù)制活動(dòng)工作表的次數(shù)") For numtimes = 1 To x '在工作表Sheet1的前面放置工作表副本 ActiveWorkbook.ActiveSheet.Copy _ Before:=ActiveWorkbook.Sheets("Sheet1") Next End Sub
ActiveWindow屬性
ActiveWindow屬性返回Window對(duì)象,代表活動(dòng)窗口(在頂部的窗口)。下面的示例顯示活動(dòng)窗口的名稱(Caption屬性):
MsgBox "活動(dòng)窗口的名稱是" & ActiveWindow.Caption
Caption屬性返回活動(dòng)窗口的名稱,允許使用名稱而不是索引號(hào)來更清楚地訪問該窗口。
下面的示例選擇并打印工作表,然后對(duì)第二個(gè)工作表重復(fù)這一過程:
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屬性設(shè)置為False。當(dāng)Excel執(zhí)行一系列操作任務(wù)時(shí),屏幕被更新并且被刷新許多次,這導(dǎo)致屏幕閃爍。設(shè)置ScreenUpdating屬性為False消除這些閃爍。此外,因?yàn)橛?jì)算機(jī)處理器無須為刷新屏幕而暫停,這能使大的應(yīng)用程序運(yùn)行得更快。
ActiveWorkbook屬性
ActiveWorkbook屬性返回Workbook對(duì)象,代表活動(dòng)窗口中的工作簿。下面的示例顯示活動(dòng)工作簿的名稱:
MsgBox "活動(dòng)工作簿的名稱是" & ActiveWorkbook.Name
下面的示例設(shè)置計(jì)算模式為手動(dòng),然后遍歷并計(jì)算活動(dòng)工作簿中的每個(gè)工作表:
Sub CalcBook() Dim wks As Worksheet Application.Calculate = xlManual For Each wks In ActiveWorkbook.Worksheets wks.Calculate Next Set wks = Nothing End Sub
RangeSelection屬性
RangeSelection屬性返回Range對(duì)象,代表在指定的窗口的工作表中所選擇的單元格,即使是工作表中激活或選擇的圖形對(duì)象。下面的示例顯示活動(dòng)窗口的工作表中所選擇的單元格的地址:
MsgBox Application.ActiveWindow.RangeSelection.Address
當(dāng)選擇單元格區(qū)域時(shí),RangeSelection屬性和Selection對(duì)象代表相同的單元格區(qū)域。當(dāng)選擇圖形時(shí),RangeSelection屬性返回以前的單元格選區(qū)。關(guān)于Selection屬性的更多介紹參見下節(jié)。
下面的示例顯示單元格中頭三個(gè)字符:
Range("A1").Select MsgBox Left(ActiveWindow.RangeSelection, 3)
下面的示例顯示單元格名稱的頭三個(gè)字符:
Range("A1").Select MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
命令RangeSelection.Name.Name返回單元格名稱。
ScreenUpdating屬性
ScreenUpdating屬性用于控制屏幕刷新,可將其值設(shè)置為True或False。通常,Excel開啟了屏幕刷新(即該屬性值為True),因此在代碼執(zhí)行時(shí),Excel會(huì)隨著代碼的操作而不斷更新屏幕顯示,這樣在運(yùn)行處理涉及到多個(gè)工作表或單元格中的大量數(shù)據(jù)的代碼(選擇或激活對(duì)象)時(shí),屏幕會(huì)不停閃爍,并且會(huì)占用CPU的處理時(shí)間,從而降低程序的運(yùn)行速度。
可以在程序代碼的開始部分設(shè)置ScreenUpdating屬性為False,即Application.ScreenUpdating=False,以關(guān)閉屏幕刷新,這樣不僅能夠使代碼運(yùn)行更快,而且使得界面對(duì)用戶更為友好。在程序結(jié)束前,將該屬性設(shè)置為True,以恢復(fù)Excel對(duì)屏幕更新的控制。
然而,在宏運(yùn)行的過程中,如果需要顯示用戶窗體或者內(nèi)置對(duì)話框,建議先恢復(fù)屏幕刷新,否則拖動(dòng)用戶窗體時(shí),會(huì)在屏幕上產(chǎn)生橡皮擦的效果。當(dāng)然,在顯示該對(duì)象后,可以重新關(guān)閉屏幕刷新。
Selection屬性
Selection屬性返回活動(dòng)窗口中所選擇的對(duì)象。例如,對(duì)于單元格,該屬性返回Range對(duì)象;對(duì)于圖表,該屬性返回Chart對(duì)象。如果使用該屬性時(shí)沒有限定引用,則等價(jià)于Application.Selection。
下面的示例清除工作表Sheet1中的選區(qū)(假設(shè)選區(qū)是單元格區(qū)域):
Worksheets("Sheet1").Activate
Selection.Clear
下面的示例在變量NumRows中存儲(chǔ)所選行的總數(shù):
numrows = 0 For Each area In Selection.Areas numrows = numrows + area.Rows.Count Next area
下面的示例統(tǒng)計(jì)所選區(qū)域中單元格的數(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 & "項(xiàng)被選擇" End Sub
下面的示例確保在輸入數(shù)據(jù)之前選擇的是工作表:
Sub EnterDataInWorksheet() If TypeName(ActiveSheet) <> "Worksheet" _ Or TypeName(Selection) <> "Range" Then MsgBox "本程序僅用于單元格區(qū)域", vbCritical Exit Sub End If Range("A1").Value = 20 End Sub
StatusBar屬性
StatusBar屬性返回或設(shè)置狀態(tài)欄中的文本。該屬性允許改變顯示在Excel窗口底部的狀態(tài)欄中的信息,這特別有助于使用戶了解需要花時(shí)間完成的操作處理的進(jìn)度。因此,狀態(tài)欄是一種告知用戶當(dāng)前程序信息的極好方式,并且狀態(tài)欄不會(huì)干擾用戶,也易被開發(fā)者利用。
如果Excel控制狀態(tài)欄,則StatusBar屬性返回False。此外,要恢復(fù)缺省的狀態(tài)欄文本,只需設(shè)置該屬性為False,即使隱藏了狀態(tài)欄。
例如,下面的示例將現(xiàn)在正在處理的文件賦值給狀態(tài)欄:
Sub test() Dim FileNum As Integer FileNum = 0 For Each file In Files Application.StatusBar = "現(xiàn)在正在處理文件" & FileNum FileNum = FileNum + 1 Next End Sub
然后,當(dāng)程序結(jié)束時(shí),使用下面的語句將狀態(tài)欄恢復(fù)為正常:
Application.StatusBar = False
這是通知Excel并清空狀態(tài)欄的最簡(jiǎn)單的方式。除非重新啟動(dòng)Excel,否則狀態(tài)欄中會(huì)一直保持著使用Application.StatusBar所顯示的文本,因此應(yīng)該在合適的地方使用Application.StatusBar = False語句,尤其是應(yīng)該考慮發(fā)生錯(cuò)誤時(shí)如何恢復(fù)狀態(tài)欄。另外,在使用狀態(tài)欄時(shí),需要選擇一個(gè)合適的更新間隔,使之既不會(huì)影響程序性能又能為用戶提供有用的信息。
可以創(chuàng)建自已的過程來使用StatusBar屬性,以顯示宏或其它過程的進(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.WorksheetFunction.Rept(Chr(60), numSquares) Application.Wait Now + TimeSerial(0, 0, 1) Next i Application.StatusBar = False End Sub
本示例隨著程序的運(yùn)行逐漸顯示由常量MAXSQR定義的15個(gè)小于符號(hào),小于符號(hào)使用ASCⅡ字符60生成。本示例沒有指示過程執(zhí)行多長時(shí)間,只是顯示了執(zhí)行的進(jìn)度。Wait方法摸擬宏占用的執(zhí)行時(shí)間。
要在VBA代碼中使用狀態(tài)欄,首先確定在用戶界面中是否顯示了狀態(tài)欄(因?yàn)橛脩魳O有可能關(guān)閉了顯示狀態(tài)欄的選項(xiàng)),并且在狀態(tài)欄使用完畢后,應(yīng)將其恢復(fù)到用戶原先的設(shè)置,因此在程序開始前,將狀態(tài)欄的信息保存到一個(gè)變量中:
bStatusBarInfo=Application.DisplayStatusBar
然后,將DisplayStatusBar屬性設(shè)置為True,以確保顯示狀態(tài)欄。在程序結(jié)束前,將狀態(tài)欄恢復(fù)到原先的設(shè)置:
Application.DisplayStatusBar=bStatusBarInfo
ThisWorkbook屬性
ThisWorkbook屬性返回Workbook對(duì)象,代表當(dāng)前正運(yùn)行的宏所在的工作簿。該屬性允許加載項(xiàng)引用包含代碼的工作簿。ActiveWorkbook屬性在該實(shí)例中不會(huì)工作,因?yàn)榛顒?dòng)工作簿可能不是包含加載項(xiàng)代碼的工作簿。換句話說,ActiveWorkbook屬性不會(huì)返回加載項(xiàng)工作簿,它返回調(diào)用加載項(xiàng)的工作簿。如果從VB代碼創(chuàng)建了一個(gè)加載項(xiàng),應(yīng)該使用ThisWorkbook屬性限定必須在編譯到該加載項(xiàng)的工作簿中運(yùn)行的語句。
下面的示例關(guān)閉包含示例代碼的工作簿,如果修改了該工作簿,則不會(huì)保存修改。
ThisWorkbook.Close SaveChanges:=False
下面的示例遍歷每個(gè)打開的工作簿并將其關(guān)閉,然后關(guān)閉包含該代碼的工作簿。
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ì)象相關(guān)的方法
下面探討Application對(duì)象經(jīng)常使用的一些方法。
FindFile方法和Dialogs集合
與GetOpenFilename方法不同,F(xiàn)ileFind方法顯示“打開”對(duì)話框并允許用戶打開文件。如果成功打開文件,那么該方法返回True;如果用戶取消了該對(duì)話框,那么該方法返回False。
下面的示例顯示一條消息,告訴用戶打開一個(gè)指定的文件,然后顯示“打開”對(duì)話框。如果用戶不能夠打開該文件,則顯示一條消息。
Sub OpenFile1() Dim bSuccess As Boolean MsgBox "請(qǐng)定位到MonthlySales.xls文件." bSuccess = Application.FindFile If Not bSuccess Then MsgBox "該文件沒有打開." End If End Sub
也可以使用Dialogs集合打開特定的對(duì)話框來完成相同的操作。使用Dialogs集合的優(yōu)勢(shì)之一是使用Show方法,可以傳遞參數(shù)修改內(nèi)置對(duì)話框的缺省行為。例如,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。
注:要找到特定對(duì)話框的參數(shù),在Excel幫助的“內(nèi)置對(duì)話框參數(shù)列表”中查找相應(yīng)的對(duì)話框常量。
下面的示例顯示在文件名框中帶有Book1.xlsm的“打開”對(duì)話框,允許用戶顯示缺省文件而不必選擇文件。
Sub OpenFile2() Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xlsm" End Sub
Dialogs集合的優(yōu)點(diǎn)在于,可以使用它來顯示任何的Excel對(duì)話框(大約有250個(gè))。通過下述步驟可以找到對(duì)話框完整列表。
(查找對(duì)話框集合的成員列表)
1、打開VBE。
2、單擊“查看——對(duì)象瀏覽器”或者按F2鍵,顯示“對(duì)象瀏覽器”。
3、在搜索框中輸入xlDialog。
4、單擊“搜索”按鈕。
對(duì)Excel 2007而言,可以使用CommandBar對(duì)象來執(zhí)行功能區(qū)中的命令,例如,下面的語句顯示“定位”對(duì)話框:
Application.CommandBars.ExecuteMso ("GoTo")
ExecuteMso方法執(zhí)行由idMso參數(shù)標(biāo)識(shí)的控件。idMso參數(shù)的取值可以查找網(wǎng)上資源。
下面的語句顯示“設(shè)置單元格格式”對(duì)話框中的“字體”選項(xiàng)卡:
Application.CommandBars.ExecuteMso ("FormatCellsFontDialog")
GetOpenFilename方法
GetOpenFilename方法顯示標(biāo)準(zhǔn)的“打開”對(duì)話框并從用戶處獲取文件名稱,但不真正打開任何文件,而是以字符串返回用戶選擇的文件名及其路徑。那么,您可以利用該字符串完成所需要的操作,例如可以傳遞返回的結(jié)果到OpenText方法。下面是GetOpenFilename方法的語法(所有參數(shù)都是可選的):
GetOpenFilename(FileFilter,FilterIndex,Title,ButtonText,MultiSelect)
參數(shù)FileFilter是一個(gè)字符串,規(guī)定篩選條件(例如,*.txt,*.xla),在“打開”文件對(duì)話框中只顯示與篩選條件相匹配的文件,默認(rèn)為“所有文件(*.*),*.*”。參數(shù)FilterIndex指定缺省的文件篩選條件的索引值,從1到參數(shù)FileFilter中指定的篩選數(shù),默認(rèn)使用索引值為1的文件篩選條件。參數(shù)Title指定對(duì)話框的標(biāo)題,默認(rèn)顯示“打開”。參數(shù)ButtonText僅用于Macintosh計(jì)算機(jī)。參數(shù)MultiSelect是一個(gè)Boolean值,指定能否選擇多個(gè)文件,默認(rèn)僅能夠選擇單個(gè)文件。
下面的示例顯示在文件類型中設(shè)置為文本文件(*.txt)的“打開”對(duì)話框,然后顯示帶有用戶選擇的信息的消息框。注意,文件并沒有被打開。
Dim fileToOpen As String fileToOpen = Application.GetOpenFilename("文本文件(*.txt),*.txt") If fileToOpen <> "" Then MsgBox "打開" & fileToOpen End If
下面的示例獲取多個(gè)工作簿:
'作者:Steven M. Hansen Sub TestGetFiles() Dim nIndex As Integer Dim vFiles As Variant Dim strFileName As String '獲取多個(gè)Excel文件 vFiles = GetExcelFiles("測(cè)試GetExcelFiles函數(shù)") '確保沒有取消對(duì)話框. '如果用戶取消對(duì)話框,函數(shù)返回False,而不是數(shù)組 If Not IsArray(vFiles) Then MsgBox "沒有選擇文件." Exit Sub End If '如果沒有取消對(duì)話框,則遍歷文件 For nIndex = 1 To UBound(vFiles) strFileName = strFileName & vbCrLf & vFiles(nIndex) Next nIndex '顯示用戶所選擇的文件名稱 MsgBox "用戶已選擇的文件如下:" & vbCrLf & strFileName End Sub '允許選擇多個(gè)文件 '返回含有文件名稱的數(shù)組 Function GetExcelFiles(sTitle As String) As Variant Dim sFilter As String Dim bMultiSelect As Boolean sFilter = "Excel工作簿(*.xlsx),*.xlsx" bMultiSelect = True GetExcelFiles = Application.GetOpenFilename(FileFilter:=sFilter, _ Title:=sTitle, MultiSelect:=bMultiSelect) End Function
當(dāng)將GetOpenFilename方法的參數(shù)MultiSelect設(shè)置為True時(shí),如果用戶選擇了文件,那么將返回一個(gè)變體類型的數(shù)組,且數(shù)組索引值基于1而不是0;如果用戶取消了選擇文件,那么返回False。在TestGetFiles過程的代碼中,使用IsArray函數(shù)測(cè)試返回值是否是數(shù)組。如果使用vFiles=False來判斷的話,當(dāng)用戶選擇了文件時(shí),由于返回的值為數(shù)組,則會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤:類型不匹配。
GetSaveAsFilename方法
GetSaveAsFilename方法顯示“另存為”對(duì)話框,允許用戶指定一個(gè)文件名和需要保存文件的位置,但是實(shí)際上并沒有保存文件。GetSaveAsFilename方法的語法如下(所有參數(shù)都是可選的):
Application.GetSaveAsFilename(InitialFilename,FileFilter,FilterIndex,Title,ButtonText)
參數(shù)InitialFilename為指定文件名的字符串,默認(rèn)為活動(dòng)工作簿的名稱,若不需要指定初始文件名,則將其設(shè)置為空字符串(”");參數(shù)FileFilter是表示篩選條件的字符串,在“另存為”對(duì)話框只顯示與篩選條件相匹配的文件,默認(rèn)為“所有文件(*.*),*.*”;參數(shù)FilterIndex用來指定缺省的文件篩選條件的索引值,默認(rèn)使用索引值為1的文件篩選條件;參數(shù)Title指定顯示對(duì)話框標(biāo)題的字符串文本,默認(rèn)顯示“另存為”;參數(shù)ButtonText僅用于Macintosh計(jì)算機(jī)。
下面介紹一個(gè)綜合示例,是Steven M. Hansen編寫的,從完整的文件名字符串中分解出文件路徑和文件名。
Sub TestBreakdownName() Dim sPath As String Dim sName As String Dim sFileName As String Dim sMsg As String sFileName = Application.GetSaveAsFilename BreakdownName sFileName, sName, sPath sMsg = "文件名是:" & sName & vbCrLf sMsg = sMsg & "文件路徑是:" & sPath MsgBox sMsg, vbOKOnly End Sub Function GetShortName(sLongName As String) As String Dim sPath As String Dim sShortName As String BreakdownName sLongName, sShortName, sPath GetShortName = sShortName End Function Sub BreakdownName(sFullName As String, _ ByRef sName As String, _ ByRef sPath As String) Dim nPos As Integer '找出文件名從哪里開始 nPos = FileNamePosition(sFullName) If nPos > 0 Then sName = Right(sFullName, Len(sFullName) - nPos) sPath = Left(sFullName, nPos - 1) Else '無效的文件名 End If End Sub '返回提供的完整文件名中文件名的位置或首字符索引值 '完整文件名包括路徑和文件名 '例如:FileNamePosition("C:\Testing\Test.xlsx")=11 Function FileNamePosition(sFullName As String) As Integer Dim bFound As Boolean Dim nPosition As Integer bFound = False nPosition = Len(sFullName) Do While bFound = False '確保不是零長度字符串 If nPosition = 0 Then Exit Do '從右開始查找第一個(gè)"\" If Mid(sFullName, nPosition, 1) = "\" Then bFound = True Else '從右至左 nPosition = nPosition - 1 End If Loop If bFound = False Then FileNamePosition = 0 Else FileNamePosition = nPosition End If End Function
除了運(yùn)行TestBreakdownName過程獲取文件名和文件路徑外,還可以使用GetShortName函數(shù)僅獲取文件名。此外,在Sub過程BreakdownName中使用了ByRef參數(shù),即通過引用傳遞參數(shù),這樣傳遞給子過程的參數(shù)改變后,調(diào)用子過程的主過程中相應(yīng)的參數(shù)也隨之改變。
InputBox方法
InputBox方法提供了一種程序與用戶之間進(jìn)行簡(jiǎn)單的交互的方式,允許我們從用戶處獲得信息。該方法將顯示一個(gè)對(duì)話框,提示用戶輸入某值。通過指定希望用戶輸入的數(shù)據(jù)類型,InputBox方法能夠進(jìn)行數(shù)據(jù)驗(yàn)證。InputBox方法的語法如下:
InputBox(Prompt,Title,Default,Left,Top,HelpFile,HelpContextID,Type)
其中:參數(shù)Prompt是在對(duì)話框中顯示的消息。這里,可以提示用戶您希望用戶輸入的數(shù)據(jù)類型。該參數(shù)是唯一的必需參數(shù)。
參數(shù)Title是對(duì)話框頂部顯示的標(biāo)題。缺省使用應(yīng)用程序名稱。
參數(shù)Default是對(duì)話框最初顯示時(shí)的缺省值。
參數(shù)Left和Top用于指定對(duì)話框的位置,這些值相對(duì)于屏幕的左上角且以磅為單位。如果忽略,則對(duì)話框?qū)⑺骄又星揖嗥聊豁敿s1/3處。
參數(shù)HelpFile和HelpContextId指定幫助文件,如果使用了這兩個(gè)參數(shù),那么在對(duì)話框中將出現(xiàn)幫助按鈕。
參數(shù)Type指定需要返回的數(shù)據(jù)類型。缺省為文本,允許的類型列于表1。
值 | 類型 |
---|---|
0 | 公式。公式作為字符串被返回。這是僅有的必需的參數(shù)。 |
1 | 數(shù)值。也可以包括返回值的公式。 |
2 | 文本(字符串) |
4 | 邏輯值(True或False) |
8 | 單元格引用,作為Range對(duì)象 |
16 | 錯(cuò)誤值,例如#N/A |
64 | 值列表 |
注意,如果Type為8,那么必須使用Set語句將結(jié)果賦值給Range對(duì)象,如下面的代碼所示:
Set myRange = Application.InputBox(Prompt:="示例", Type:=8)
如果希望允許輸入多種數(shù)據(jù)類型,那么可以使用上表中的任意數(shù)值組合。例如,如果要顯示一個(gè)可以接受文本或數(shù)值的輸入框,則可以將type的值設(shè)置為3(即1+2的結(jié)果)。如果輸入了錯(cuò)誤類型的數(shù)據(jù),則顯示錯(cuò)誤消息并提示再次輸入數(shù)據(jù)。如果單擊“取消”按鈕,則返回False。
下面的示例提示用戶輸入希望打印活動(dòng)工作表的份數(shù)(注意,type指定希望輸入的是一個(gè)數(shù)值):
Sub PrintActiveSheet() Dim TotalCopies As Long, NumCopies As Long Dim sPrompt As String, sTitle As String sPrompt = "您想要多少副本?" sTitle = "打印活動(dòng)工作表" TotalCopies = Application.InputBox(Prompt:=sPrompt, Title:=sTitle, Default:=1, Type:=1) For NumCopies = 1 To TotalCopies ActiveSheet.PrintOut Next NumCopies End Sub
如果將InputBox方法的返回值賦給一個(gè)Variant型變量,則可以檢測(cè)該值是否為False。如果要返回單元格區(qū)域,則使用像下面的代碼會(huì)更好:
Sub GetRange() Dim rng As Range On Error Resume Next Set rng = Application.InputBox(Prompt:="輸入單元格區(qū)域", Type:=8) If rng Is Nothing Then MsgBox "操作取消" Else rng.Select End If End Sub
此時(shí),必須使用Set語句將Range對(duì)象賦值給某對(duì)象變量,如果用戶單擊“取消”按鈕則返回值False,Set語句將失敗并提示運(yùn)行時(shí)錯(cuò)誤。使用On Error Resume Next語句避免運(yùn)行時(shí)錯(cuò)誤,然后檢查是否產(chǎn)生了一個(gè)有效的區(qū)域。如果用戶單擊“確定”按鈕,那么InputBox方法檢查內(nèi)置類型以確保將返回有效的區(qū)域,因此空區(qū)域表明單擊了“取消”按鈕。
Run方法
Run方法執(zhí)行一個(gè)宏或調(diào)用一個(gè)函數(shù)??梢允褂迷摲椒ㄟ\(yùn)行由VBA或Excel宏語言編寫的宏,或者運(yùn)行動(dòng)態(tài)鏈接庫(DLL)里的函數(shù)或Excel加載項(xiàng)(XLL)。XLL是使用任何支持創(chuàng)建DLLs的編譯器為Excel創(chuàng)建的加載項(xiàng)。Run方法的語法為:
Run(Macro,Arg1,…,Arg30)
參數(shù)Macro是要執(zhí)行的宏或函數(shù)的名稱,參數(shù)Arg1至Arg30是需要傳遞給宏或函數(shù)的一些參數(shù)。
下面的示例使用Run方法調(diào)用一個(gè)過程,設(shè)置單元格區(qū)域中單元格的字體為粗體。當(dāng)然,也可以使用Call方法獲得相同的結(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 '也能夠使用下面的語句完成相同的任務(wù) 'Call MyProc(rng) End Sub Sub MyProc(rng As Range) With rng.Font .Bold = True End With End Sub
Application對(duì)象相關(guān)的事件
Application對(duì)象也有一些事件,能夠用于監(jiān)視整個(gè)Excel應(yīng)用程序的行為。要使用Application事件,必須啟用事件監(jiān)視。
激活A(yù)pplication事件監(jiān)視
1、單擊“插入——類模塊”,創(chuàng)建一個(gè)類。
2、在屬性中,將類的名稱改為AppEventClass。
3、在類的代碼窗口,添加下面的代碼:
Public WithEvents Appl As Application
現(xiàn)在,能夠在應(yīng)用程序中運(yùn)用應(yīng)用程序級(jí)事件。
4、在代碼窗口頂部左側(cè)的對(duì)象列表中,選擇Appl。
5、在代碼窗口頂部右側(cè)的過程列表中,選擇WorkbookOpen。此時(shí),將為Appl_WorkbookOpen過程插入一對(duì)占位符。
6、在過程中添加下面的語句:
Private Sub Appl_WorkbookOpen(ByVal Wb As Workbook) MsgBox "已打開工作簿." End Sub
7、重復(fù)上面的步驟插入Appl_WorkbookBeforeClose事件,并添加下面的語句:
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) MsgBox "關(guān)閉工作簿." End Sub
8、接下來,創(chuàng)建一個(gè)變量用于引用類模塊中創(chuàng)建的Application對(duì)象。在工程資源管理器中,雙擊ThisWorkbook打開代碼窗口。
9、添加下面的語句。
Dim ApplicationClass As New AppEventClass
通過在ThisWorkbook代碼窗口添加下面的語句,創(chuàng)建所聲明的對(duì)象對(duì)Application對(duì)象的連接:
Private Sub Workbook_Open() Set ApplicationClass.Appl = Application End Sub
10、保存并關(guān)閉該工作簿。
11、現(xiàn)在,測(cè)試代碼。打開該工作簿,將觸發(fā)Appl_WorkbookOpen事件,顯示相應(yīng)的信息框。
12、關(guān)閉該工作簿,將觸發(fā)Appl_WorkbookBeforeClose事件,顯示相應(yīng)的信息框。
13、切換回AppEventClass類模塊并單擊過程列表顯示能夠用于監(jiān)控應(yīng)用程序行為的一系列事件。
理解這些事件如何被觸發(fā)以及事件的順序?qū)斫鈶?yīng)用程序是重要的。在類模塊中添加其他的事件并插入消息框,然后試驗(yàn)不同的行為來看看何時(shí)觸發(fā)某特定的事件。
使用Application對(duì)象執(zhí)行其它任務(wù)
除了Application對(duì)象中最常用的對(duì)象外,您可能希望在Excel應(yīng)用程序中執(zhí)行一些其他任務(wù)。下面我們就來探討這方面的內(nèi)容。
刪除工作表而顯示提示信息(DisplayAlerts屬性)
下面的示例首先關(guān)閉詢問是否保存工作表的任何消息,接著刪除工作表并打開警告消息。
Sub DeleteSheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
上述示例代碼中使用了DisplayAlerts屬性,將其值設(shè)置為False以自動(dòng)執(zhí)行Excel警告對(duì)話框中默認(rèn)按鈕相關(guān)的操作。
設(shè)置DisplayAlerts屬性的意圖在于,運(yùn)行宏時(shí)不必響應(yīng)系統(tǒng)出現(xiàn)的警告而使執(zhí)行過程中斷。當(dāng)然,在過程結(jié)束前,最好將DisplayAlerts屬性設(shè)置為True。
無須提示用戶而保存工作表(DisplayAlerts屬性)
下面的示例保存工作表,而沒有通知用戶是否保存。
Sub SaveWorksheet() Application.DisplayAlerts = False ActiveWorkbook.SaveAs "C:\MonthlySales.xls" Application.DisplayAlerts = True End Sub
此時(shí),如果現(xiàn)有文件與要保存的文件名相同,那么會(huì)覆蓋該文件而不會(huì)彈出任何警告消息。
使用SendKeys方法發(fā)送信息到記事本
SendKeys方法允許發(fā)送按鍵到當(dāng)前活動(dòng)窗口,用來控制不支持任何其他交互形式的應(yīng)用程序,例如DDE(動(dòng)態(tài)數(shù)據(jù)交換)或OLE。
下面的示例使用SendKeys命令從Excel中復(fù)制數(shù)據(jù)區(qū)域到記事本,然后保存該文件。
Sub SKeys() Range("A1:D15").Copy '復(fù)制單元格區(qū)域 SendKeys "% n", True '最小化Excel Shell "notepad.exe", vbNormalFocus '開啟記事本 SendKeys "^V", True '將數(shù)據(jù)粘貼到記事本 SendKeys "%FA", True '指定另存為 SendKeys "SalesData.txt", True '提供文件名 SendKeys "%S", True '保存文件 End Sub
本示例首先復(fù)制數(shù)據(jù)區(qū)域到剪貼板,然后最小化Excel,開啟記事本,接著從剪貼板復(fù)制數(shù)據(jù)到記事本,最后指定文件名并保存文件。
下面的示例打開了“記事本”應(yīng)用程序(不支持DDE或OLE),并將數(shù)據(jù)行寫入記事本文檔:
Sub SKeys() Dim dReturnValue As Double dReturnValue = Shell("NOTEPAD.EXE", vbNormalFocus) AppActivate dReturnValue Application.SendKeys "Copy Data.xlsx c:\", True Application.SendKeys "~", True Application.SendKeys "%FABATCH%S", True End Sub
注意,應(yīng)該在Excel應(yīng)用程序窗口執(zhí)行上述程序。
下面的過程清除VBE立即窗口中的內(nèi)容。如果在立即窗口中進(jìn)行過試驗(yàn)或者使用Debug.Print語句在立即窗口輸出數(shù)據(jù),那么舊的信息將產(chǎn)生混亂。該過程將焦點(diǎn)轉(zhuǎn)移到立即窗口,發(fā)送選擇該窗口中的所有文本,然后發(fā)送Del鍵刪除文本:
Sub ImmediateWindowClear() Application.VBE.Windows.Item("立即窗口").SetFocus Application.SendKeys "^a" Application.SendKeys "{Del}" End Sub
注意,要使上述代碼運(yùn)行,必需編程訪問Visual Basic工程。從Excel功能區(qū)中選擇“開發(fā)工具”選項(xiàng)卡,選擇“宏安全性”,然后勾選“信任對(duì)VBA工程對(duì)象模型的訪問”。
其中,百分比符號(hào)(%)用于代表Alt鍵,波形符號(hào)(~) 代表回車鍵,^符號(hào)代表Ctrl鍵。在花括號(hào){}里放置名稱指定其它特別的鍵,例如{Del}代表Delete鍵。
安排宏在指定的時(shí)間和間隔運(yùn)行(OnTime方法)
可以使用Application對(duì)象的OnTime方法在指定的時(shí)間或者在有規(guī)律的時(shí)間間隔運(yùn)行某過程。OnTime方法的語法如下:
Application.OnTime(EarliestTime,Procedure,LastestTime,Schedule)
參數(shù)EarliestTime指明希望何時(shí)運(yùn)行由參數(shù)Procedure指定的過程,可選的參數(shù)LastestTime和Schedule指明過程運(yùn)行的最遲時(shí)間,以及是否安排運(yùn)行一個(gè)新過程或者刪除已經(jīng)存在的過程。當(dāng)開始調(diào)用某過程而Excel正忙時(shí),則需要使用參數(shù)LastestTime指定希望調(diào)用該過程的時(shí)間區(qū)間。如果使用Application對(duì)象的Wait方法暫停某宏,所有的Excel行為,包括手工交互操作,都將被掛起。OnTime方法的優(yōu)勢(shì)在于,當(dāng)?shù)却\(yùn)行安排的宏時(shí),允許返回正常的Excel交互操作,包括運(yùn)行其他的宏。
下面的示例指定每隔5分鐘運(yùn)行一次名為YourProc的過程:
Application.OnTime EarliestTime:=Now + TimeValue("00:05:00"), Procedure:="YourProc"
下面的示例在每天中午運(yùn)行過程YourProc:
Application.OnTime EarliestTime:=TimeValue("12:00:00"), Procedure:="YourProc"
下面的示例安排每隔5分鐘調(diào)用一次AutoSave過程。如果關(guān)閉該工作簿,則調(diào)用CleanUp過程來執(zhí)行可能希望的清理以及刪除任何額外的調(diào)用。
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事件包含在工作簿代碼模塊中,而AutoSave過程和CleanUp過程則存在于標(biāo)準(zhǔn)代碼模塊中。
當(dāng)使用OnTime方法安排在將來的某個(gè)時(shí)間運(yùn)行宏時(shí),必須確保Excel一直在內(nèi)存中運(yùn)行直至到達(dá)安排的時(shí)間。但不需要一直打開包含OnTime宏的工作簿。如果需要,Excel將打開該工作簿。
通過上述簡(jiǎn)介,我們已經(jīng)了解了OnTime方法的基本用法。下面再詳細(xì)介紹OnTime方法。
有時(shí),我們可能需要設(shè)計(jì)Excel工作簿定期并自動(dòng)地運(yùn)行一個(gè)過程。例如,可能希望每隔幾分鐘從數(shù)據(jù)源中更新數(shù)據(jù),此時(shí)執(zhí)行Excel應(yīng)用程序的OnTime方法指令Excel在給定的時(shí)間去運(yùn)行某過程。通過編寫代碼使程序自已調(diào)用OnTime方法,能使VBA代碼定期自動(dòng)執(zhí)行。
OnTime方法要求指定日期和時(shí)間以及要運(yùn)行的過程作為參數(shù),重要的是要記住具體地告訴Excel什么時(shí)候運(yùn)行這個(gè)過程而不是從當(dāng)前時(shí)間開始的偏差。為了取消一個(gè)未執(zhí)行的OnTime過程,必須經(jīng)過該過程計(jì)劃要運(yùn)行的確切的時(shí)間,不能夠告訴Excel取消下一個(gè)計(jì)劃執(zhí)行的過程。因此,建議將安排過程開始運(yùn)行的時(shí)間存放在一個(gè)公共的(或全局)變量中,該變量作用于所有的代碼。然后,能夠使用所存儲(chǔ)時(shí)間的變量去安排運(yùn)行或取消事件。下面的示例代碼在公共的常量中存儲(chǔ)了所運(yùn)行過程的名稱和重復(fù)執(zhí)行的時(shí)間間隔,當(dāng)然這不是必需的。
Public RunWhen As Double Public Const cRunIntervalSeconds = 120 ' two minutes Public Const cRunWhat = "The_Sub"
為開始這個(gè)過程,使用一個(gè)名為 StartTimer的子程序。代碼如下:
Sub StartTimer() RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds) Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _ schedule:=True End Sub
將比當(dāng)前時(shí)間多兩分鐘的日期和時(shí)間存放在RunWhen變量中,然后調(diào)用OnTime方法指令Excel何時(shí)運(yùn)行cRunWhat過程。
“The_Sub”是一個(gè)字符串變量,Excel將在合適的時(shí)間運(yùn)行該過程。下面是該過程代碼示例:
Sub The_Sub() ' '這里放置代碼 ' StartTimer End Sub
注意,The_Sub過程的最后一行調(diào)用了StartTimer過程,再次重復(fù)運(yùn)行這個(gè)過程。并且當(dāng)下次使用OnTime調(diào)用The_Sub過程時(shí),將再次調(diào)用StartTimer來重復(fù)執(zhí)行它自已。這就是如何執(zhí)行周期循環(huán)的方法。
有時(shí),當(dāng)關(guān)閉工作簿時(shí)或者滿足某個(gè)條件時(shí)需要停止定時(shí)執(zhí)行的過程。由于OnTime方法是Application對(duì)象的一部分,簡(jiǎn)單地關(guān)閉已創(chuàng)建事件的工作簿不會(huì)取消對(duì)OnTime的調(diào)用。一旦Excel自身保持運(yùn)行,它將執(zhí)行OnTime過程,并且在必要時(shí)會(huì)自動(dòng)打開該工作簿。
為了停止OnTime過程,必須對(duì)OnTime方法指定確切的時(shí)間,這就是我們將時(shí)間作為公共的變量存放在RunWhen中的原因。否則,沒辦法知道過程計(jì)劃執(zhí)行的確切時(shí)間。(所計(jì)劃的時(shí)間像OnTime方法中的一把“鑰匙”,如果沒有它,就沒有通往事件的入口)
下面是一個(gè)名為StopTimer的子過程,它將停止要執(zhí)行的OnTime過程。
Sub StopTimer() On Error Resume Next Application.OnTime earliesttime:=RunWhen, _ procedure:=cRunWhat, schedule:=False End Sub
這個(gè)過程使用了和StartTimer過程相同的OnTime語法,將schedule參數(shù)設(shè)置為False告訴Excel取消該過程的執(zhí)行??赡芟M贏uto_Close宏或Workbook_BeforeClose事件中包括一個(gè)對(duì)該過程的調(diào)用。在StopTimer過程中,使用On Error Resume Next語句忽略當(dāng)你企圖刪除一個(gè)不存在的過程時(shí)可能產(chǎn)生的任何錯(cuò)誤。
下面的示例演示當(dāng)在單元格B1中輸入一個(gè)值后,如果A1單元格中不為空,那么將在10秒后自動(dòng)清除單元格A1和B1中的內(nèi)容。示例代碼如下:
在標(biāo)準(zhǔn)模塊中輸入如下代碼:
Sub DeleteContents() Worksheets("Sheet1").Range("A1:B1").ClearContents End Sub Sub MyEntry() Range("B1").Value = "Goodbye" End Sub
在工作表sheet1代碼模塊中輸入如下代碼:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$B$1" Then Exit Sub If IsEmpty(Target) Or IsEmpty(Target.Offset(0, -1)) Then Exit Sub Application.OnTime Now + TimeSerial(0, 0, 10), "DeleteContents" End Sub
擴(kuò)展話題一:
在VBA幫助系統(tǒng)的OnTime方法介紹中,只對(duì)其參數(shù)EarliestTime, Procedure, LatestTime, Schedule進(jìn)行了說明,并列舉了定時(shí)運(yùn)行某過程和撤銷OnTime設(shè)置的三個(gè)代碼示例。對(duì)OnAction屬性的介紹中,也只簡(jiǎn)要介紹了單擊某圖形或菜單項(xiàng)時(shí)運(yùn)行指定宏的示例。均沒有介紹當(dāng)OnTime方法或OnAction屬性中設(shè)置的所要運(yùn)行的宏帶有參數(shù)時(shí),如何傳遞參數(shù)到這些宏程序中。下面是自已總結(jié)的一些參數(shù)的傳遞方法,供分享。
因?yàn)檫\(yùn)用Application.OnTime或Object.OnAction調(diào)用宏程序的語法基本相似,因此下面介紹的OnTime方法所使用的語法同樣適用于OnAction屬性。
為了便于理解,以下介紹均使用一段相似的代碼,只不過傳遞給所調(diào)用宏程序MyProcedure的參數(shù)不同而已,以此來講解傳遞給宏程序不同參數(shù)的方法。例如,下面的代碼將使MyProcedure宏程序在從現(xiàn)在起的2秒后運(yùn)行:
Application.OnTime Now + TimeValue("00:00:02"), "MyProcedure"
問題1:假設(shè)MyProcedure宏程序接受參數(shù),如何傳遞參數(shù)到該宏程序中?有下面幾種情形:
(1)所調(diào)用的宏程序接受一個(gè)參數(shù)
如果是在正常代碼過程中傳遞參數(shù)給宏程序,可以使用” MyProcedure (42)”,其中“42”為傳遞給MyProcedure程序的參數(shù)。但如果這樣的傳遞參數(shù)方法用在OnTime方法中,該程序?qū)⒉粫?huì)運(yùn)行。
正確的語法是外層為雙引號(hào),內(nèi)層再加上一組單引號(hào),里面是程序名和程序所接受的參數(shù)。如下所示:
‘MyProcedure宏程序接受一個(gè)數(shù)值參數(shù)
Application.OnTime Now + TimeValue("00:00:02"), "' MyProcedure 42'"
(2)所調(diào)用的宏程序接受多個(gè)參數(shù)
如果所調(diào)用的宏程序接受幾個(gè)參數(shù),那么在這些參數(shù)之間應(yīng)該用逗號(hào)分隔。如下所示:
'MyProcedure宏程序接受兩個(gè)數(shù)值參數(shù) Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure 42, 13'"
(3)所調(diào)用的宏程序接受字符串參數(shù)
如果所調(diào)用的宏程序所接受的參數(shù)是字符串,因?yàn)樽址呀?jīng)帶有一對(duì)雙引號(hào),因此應(yīng)該將字符串包含在雙層雙引號(hào)中,即字符串參數(shù)周圍有兩對(duì)雙引號(hào)。如下所示:
'MyProcedure宏程序接受一個(gè)字符串Hello!作為其參數(shù) Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure ""Hello!""'"
問題2:當(dāng)MyProcedure宏程序所接受的參數(shù)是變量,如何傳遞參數(shù)到該宏程序中?
(1)該變量為局部變量,用如下所示的方式。
'MyProcedure宏程序接受一個(gè)字符串變量strText參數(shù),該變量為局部變量 strText = "Hello!" Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure """ & strText & """'"
(2)該變量為全局變量,用如下所示的方式,即不必加雙層雙引號(hào)。
'MyProcedure宏程序接受一個(gè)字符串變量g_strText參數(shù),該變量必須聲明為公有的 g_strText = "Hello!" Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure g_strText'"
注意,在這種情況下變量必須聲明為公共變量,否則MyProcedure宏程序?qū)⒉荒苷业皆撟兞繀?shù)。
擴(kuò)展話題二:
除了Excel的OnTime方法外,還能使用Windows API庫提供的Timer函數(shù)。在某些情況下,使用API過程比使用OnTime方法更容易:第一,告訴Windows需要計(jì)時(shí)器發(fā)生的時(shí)間間隔而不是某天的特定時(shí)間;第二,API過程將自動(dòng)更新,計(jì)時(shí)器將每隔一段時(shí)間發(fā)生直到你告訴它停下來為止。
這些過程需要在Office2000或更新的版本中運(yùn)行,因?yàn)槲覀兪褂昧薃ddressOf函數(shù),他們不會(huì)在Excel97或更早的版本中運(yùn)行。
為了使用Windows計(jì)時(shí)器,將下面的代碼放在一個(gè)標(biāo)準(zhǔn)代碼模塊中。
Public Declare Function SetTimer Lib "user32" ( _ ByVal HWnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" ( _ ByVal HWnd As Long, ByVal nIDEvent As Long) As Long Public TimerID As Long Public TimerSeconds As Single Sub StartTimer() TimerSeconds = 1 ' 指定計(jì)時(shí)器的間隔. TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc) End Sub Sub EndTimer() On Error Resume Next KillTimer 0&, TimerID End Sub Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _ ByVal nIDEvent As Long, ByVal dwTimer As Long) ' '由Windows調(diào)用的過程. ' 將與計(jì)時(shí)器相關(guān)的代碼放置于此. ' End Sub
執(zhí)行StartTimer過程開始計(jì)時(shí)。變量TimerSeconds指明計(jì)時(shí)器之間間隔有多少秒。這個(gè)值可能少于1。注意SetTimer過程在毫秒范圍內(nèi)取值,于是當(dāng)我們調(diào)用SetTimer時(shí)我們通過將TimerSeconds乘以1000來增加間隔值。Windows每隔一段計(jì)時(shí)器發(fā)生的時(shí)間來調(diào)用TimerProc過程??梢詫⑦@個(gè)過程命名為想要的名字,但必須如示例中所示聲明這些參數(shù)變量。如果變換了過程的名稱,那么要確保也變換了SetTimer中的名字。Windows將傳遞下面的值到TimerProc過程:
HWnd Excel應(yīng)用程序的Windows句柄。一般可忽略這個(gè)參數(shù)。
uMsg 值為275。一般可忽略這個(gè)參數(shù)。
nIDEvent 這個(gè)值通過SetTimer獲得TimerID變量返回。如果不止一次調(diào)用SetTimer,那么能檢查nIDEvent參數(shù)確定哪次調(diào)用SetTimer導(dǎo)致調(diào)用該過程。
dwTimer 計(jì)算機(jī)運(yùn)行的毫秒數(shù)。相同的值通過GetTickCount Windows過程被返回。
調(diào)用EndTimer過程來停止計(jì)時(shí)器循環(huán),這個(gè)過程調(diào)用KillTimer,通過SetTimer返回的值傳遞給它。
API計(jì)時(shí)器和Excel的OnTime方法間有兩個(gè)重要的區(qū)別:第一,API計(jì)時(shí)器有著更精確的時(shí)間間隔(達(dá)到1秒或更少);第二,即便Excel處在編輯模式(也就是說,當(dāng)正在編輯單元格時(shí)),API計(jì)時(shí)器也將執(zhí)行。注意,當(dāng)Excel處于編輯模式時(shí),如果TImerProc企圖修改工作表單元格,Excel將會(huì)立即退出。
Application對(duì)象的其它一些屬性和方法
Caller屬性
Application對(duì)象的Caller屬性返回調(diào)用或執(zhí)行宏過程的對(duì)象的引用,適用于窗體工具欄控件、指定宏的繪圖對(duì)象和用戶自定義函數(shù)。在確定調(diào)用用戶自定義函數(shù)的單元格時(shí)特別有用,例如下面的示例使用自定義函數(shù)WorksheetName函數(shù)顯示調(diào)用該函數(shù)的工作表的名稱。
Function WorksheetName() Application.Volatile WorksheetName = Application.Caller.Parent.Name End Function
在工作表單元格中輸入“=WorksheetName()”,將顯示該工作表的名稱。Application.Caller作為一個(gè)Range對(duì)象返回對(duì)調(diào)用該函數(shù)的單元格的引用,然后使用Range對(duì)象的Parent屬性產(chǎn)生對(duì)包含該Range對(duì)象的Worksheet對(duì)象的引用,最后將Worksheet對(duì)象的Name屬性賦給該函數(shù)的返回值。當(dāng)每次重新計(jì)算工作表時(shí),Appliaction對(duì)象的Volatile方法強(qiáng)制Excel重新計(jì)算該函數(shù)。因此,如果改變了工作表的名稱,那么該函數(shù)將顯示新的工作表名稱。
在WorksheetName函數(shù)中,使用下面的代碼是錯(cuò)誤的:
WorksheetName = ActiveSheet.Name
如果激活的工作表不是包含該公式的工作表并發(fā)生重新計(jì)算,則將在原單元格中返回錯(cuò)誤的名稱。例如,如果在工作表Sheet1中已使用該函數(shù),那么在工作表Sheet2中再次使用該函數(shù)時(shí)工作表Sheet1中將返回錯(cuò)誤的名稱,即工作表Sheet2的名稱。
CutCopyMode屬性
當(dāng)我們?cè)贓xcel工作表中使用剪切或復(fù)制時(shí),在單元格區(qū)域周邊會(huì)出現(xiàn)連續(xù)移動(dòng)的虛線,即使執(zhí)行完復(fù)制操作,原單元格區(qū)域周邊的虛線框仍存在,直到您按Esc鍵或者開始單元格中輸入操作。如果需要在執(zhí)行完復(fù)制操作后,不要在Excel中看到復(fù)制時(shí)產(chǎn)生的虛線框,那么可以將Excel剪切復(fù)制模式關(guān)閉,即設(shè)置CutCopyMode屬性為False:
Application.CutCopyMode=False
Evaluate方法
Evaluate方法用于將名稱轉(zhuǎn)換為一個(gè)對(duì)象或者一個(gè)值,其語法如下:
Evaluate("表達(dá)式")
也可以使用簡(jiǎn)寫格式:
[表達(dá)式]
表達(dá)式可以是任何有效的工作表計(jì)算,在其左邊有或者沒有等號(hào)均可,或者是對(duì)單元格區(qū)域的引用,包括定義的名稱或外部引用,或者是圖表對(duì)象。工作表計(jì)算包含在VBA中不能使用的工作表函數(shù),或者是工作表數(shù)組公式。
例如,可以在工作表中使用ISBLANK函數(shù),但不能在VBA中使用該函數(shù),因?yàn)閂BA的等效函數(shù)IsEmpty提供了相同的功能。然而,如果需要,仍然可以使用ISBLANK函數(shù)。下面的二個(gè)示例是等價(jià)的,如果單元格A1為空,則返回 True;如果單元格A1不為空,則返回False。
MsgBox Evaluate("=ISBLANK(A1)")
MsgBox [ISBLANK(A1)]
第一個(gè)示例用法的好處是能夠非常靈活地使用代碼產(chǎn)生字符串值。第二個(gè)示例用法更簡(jiǎn)短,但僅通過編輯代碼來修改表達(dá)式。下面的過程顯示True或者False表明活動(dòng)單元格是否為空,同時(shí)演示了第一個(gè)示例用法的靈活性。
Sub IsActiveCellEmpty() Dim sFunctionName As String, sCellReference As String sFunctionName = "ISBLANK" sCellReference = ActiveCell.Address MsgBox Evaluate(sFunctionName & "(" & sCellReference & ")") End Sub
注意,使用第二個(gè)示例用法不能計(jì)算包含變量的表達(dá)式。
下面的兩行代碼演示使用Evaluate方法引用Range對(duì)象的兩種方式,并且給該對(duì)象賦值:
Evaluate("A1").Value = 10
[A1].Value = 10
第一個(gè)表達(dá)式是不實(shí)用的并且極少使用,而第二個(gè)表達(dá)式雖然極不靈活,卻是引用Range對(duì)象更簡(jiǎn)便的方式。通過省略Value屬性進(jìn)一步簡(jiǎn)化表達(dá)式,因?yàn)樵搶傩允荝ange對(duì)象的默認(rèn)屬性:
[A1] = 10
總之,使用方括號(hào)的優(yōu)點(diǎn)在于代碼簡(jiǎn)短,而使用Evaluate方法的優(yōu)點(diǎn)在于參數(shù)是字符串,這樣即可以在代碼中構(gòu)造該字符串,也可以使用變量。再舉一個(gè)示例,下面的代碼將工作表Sheet1中單元格A1的字體加粗:
Worksheets("Sheet1").Activate boldCell = "A1" Application.Evaluate(boldCell).Font.Bold = True
此外,Evaluate方法能夠返回工作簿名稱集合的內(nèi)容以及有效地產(chǎn)生數(shù)組值。下面的代碼創(chuàng)建一個(gè)隱藏的名稱用來保存密碼。在“插入”→“名稱”→“定義”對(duì)話框中不能看到隱藏的名稱,因此這是在工作簿里存儲(chǔ)信息的便利方式,不會(huì)弄亂用戶界面:
Names.Add Name:= "PassWord", RefersTo:= "Bazonkas", Visible:=False
然后,像下面的代碼一樣在表達(dá)式里使用隱藏的數(shù)據(jù):
sUserInput = InputBox("Enter Password") If sUserInput = [PassWord] Then ... End If
Evaluate方法同樣適用于數(shù)組。下面的表達(dá)式產(chǎn)生一個(gè)二維的Variant型數(shù)組,100行1列,包含從101 到 200的值。執(zhí)行該過程比使用For…Next循環(huán)更有效率。
vRowArray = [ROW(101:200)]
下面的代碼將101至200的值賦給單元格區(qū)域B1:B100,同樣比For…Next循環(huán)更有效率:
[B1:B100] = [ROW(101:200)]
OnKey方法
使用OnKey方法按特定的鍵或組合鍵運(yùn)行指定的過程,也可以禁用內(nèi)置的組合鍵。其語法為:
Application.OnKey(Key,Procedure)
參數(shù)Key指定要按的鍵的字符串。參數(shù)Procedure指定要運(yùn)行的過程名稱的字符串,如果為空(”"),則按參數(shù)Key指定的鍵時(shí)將不發(fā)生任何操作;如果省略該參數(shù),則恢復(fù)參數(shù)Key指定的鍵在Excel中的正常操作,同時(shí)清除先前使用OnKey方法所做的操作設(shè)置。
參數(shù)Key可以指定任何與Alt、Ctrl或Shift組合使用的鍵,還可以指定這些鍵的任何組合。每一個(gè)鍵可以由一個(gè)或多個(gè)字符表示,比如”a”表示字符a,”{ENTER}”表示Enter(回車)。若要指定按對(duì)應(yīng)的鍵(例如Enter或Tab)時(shí)的非顯示字符,可以使用下表2所列出的代碼。表2中的每個(gè)代碼表示鍵盤上的一個(gè)對(duì)應(yīng)鍵,按鍵代碼放置在花括號(hào){}中。
按鍵 | 代碼 |
---|---|
Backspace | {Backspace}或{BS} |
Break | {BREAK} |
Caps Lock | {CAPSLOCK} |
Clear | {CLEAR} |
Delete或Del | {DELETE}或{DEL} |
向下箭頭 | {DOWN} |
End | {END} |
Enter(在數(shù)字小鍵盤中) | {ENTER} |
Enter | ~(波形符) |
Esc | {ESCAPE}或{ESC} |
Help | {HELP} |
Home | {HOME} |
Ins | {INSERT} |
向左箭頭 | {LEFT} |
Num Lock | {NUMLOCK} |
Page Down | {PGDN} |
Page Up | {PGUP} |
Return | {RETURN} |
向右箭頭 | {RIGHT} |
Scroll Lock | {SCROLLLOCK} |
Tab | {TAB} |
向上箭頭 | {UP} |
F1到F15 | {F1}到{F15} |
還可以指定與Shift和/或Ctrl和/或Alt組合使用的鍵。若要指定與其他鍵組合使用的鍵,可使用下表3。
要組合的鍵 | 在按鍵代碼之前添加 |
---|---|
Shift | +(加號(hào)) |
Ctrl | ^(插入符號(hào)) |
Alt | %(百分號(hào)) |
若要為特定字符指定處理過程(如 +、^、% 等等),可以將此字符用花括號(hào)括起。
下面的示例為鍵序列Ctrl+加號(hào)分配“InsertProc”過程,并為鍵序列Shift+Ctrl+向右鍵分配“SpecialPrintProc”過程。
Application.OnKey "^{+}", "InsertProc" Application.OnKey "+^{RIGHT}", "SpecialPrintProc"
下面的示例將Shift+Ctrl+向右鍵恢復(fù)正常操作。
Application.OnKey "+^{RIGHT}"
下面的示例將Shift+Ctrl+向右鍵鍵序列設(shè)為不發(fā)生任何操作。
Application.OnKey "+^{RIGHT}", ""
又如,下面的代碼忽略Alt+F4組合鍵的操作:
Application.OnKey "%{F4}",""
即按下Alt+F4組合鍵后,Excel沒有任何反應(yīng),不執(zhí)行任何操作。
注意,OnKey方法使用的按鍵將應(yīng)用到所有打開的工作簿,且僅在當(dāng)前的Excel會(huì)話期間起作用。
下面的示例代碼禁用工作表右鍵快捷菜單:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _ ByVal Target As Range, Cancel As Boolean) Cancel = True MsgBox "對(duì)不起!已禁用右鍵菜單!" End Sub '禁用Shift+{F10}顯示快捷菜單 Sub SetupNoShiftF10() Application.OnKey "+{F10}", "NoShiftF10" End Sub '恢復(fù)Shift+F10組合鍵的功能 Sub TurnOffNoShiftF10() Application.OnKey "+{F10}" End Sub Sub NoShiftF10() MsgBox "對(duì)不起!已禁用右鍵菜單!" End Sub
ThisCell屬性
ThisCell屬性返回一個(gè)單元格,作為Range對(duì)象在此調(diào)用用戶定義的函數(shù)。下面的示例在調(diào)用函數(shù)時(shí)將函數(shù)所在單元格的地址通知給用戶。
Function UseThisCell() MsgBox "該單元格的地址為: " & _ Application.ThisCell.Address End Function
在用戶定義的函數(shù)中,用戶不能訪問Range對(duì)象上的屬性或方法。當(dāng)完成了重新計(jì)算后,用戶可以為今后的使用和執(zhí)行附加操作而存儲(chǔ)Range對(duì)象。
WorksheetFunction屬性
在Excel中可以直接使用兩組內(nèi)置函數(shù),一組函數(shù)是VBA語言的組成部分,另一組函數(shù)是Excel工作表函數(shù)的子集??梢允褂肁pplication對(duì)象的WorksheetFunction屬性來使用VBA中沒有相同功能的工作表函數(shù)。
通常,如果一個(gè)VBA函數(shù)與一個(gè)Excel函數(shù)有著相同的用途,那么該Excel函數(shù)就不能直接用于VBA宏(雖然本文前面介紹過可以使用Evalute方法訪問任何Excel函數(shù))。但還有一種特殊的情形,關(guān)于Excel的Mod函數(shù)。Mod函數(shù)不能直接用于VBA,但是VBA提供了相同用途的Mod操作符。下面的代碼使用Evaluate方法的簡(jiǎn)潔格式,運(yùn)用Excel的Mod函數(shù)和Today函數(shù)以數(shù)字顯示星期幾:
MsgBox [MOD(TODAY(),7)]
使用VBA的Date函數(shù)和Mod操作符,更簡(jiǎn)單地獲得相同的結(jié)果:
MsgBox Date Mod 7
Excel的Concatenate 函數(shù)同樣也不能用于VBA,但可以使用連接操作符(&)代替,就像在Excel工作表公式里一樣。如果一定要在VBA中使用Concatenate函數(shù),可以編寫如下的代碼:
Sub ConcatenateExample1() Dim s1 As String, s2 As String s1 = "Jack " s2 = "Smith" MsgBox Evaluate("CONCATENATE(""" & s1 & """,""" & s2 & """)") End Sub
但下面的代碼更簡(jiǎn)單且結(jié)果相同:
Sub ConcatenateExample2() Dim s1 As String, s2 As String s1 = "Jack " s2 = "Smith" MsgBox s1 & s2 End Sub
VBA函數(shù),例如Date、DateSerial和IsEmpty能夠自由地使用,因?yàn)樗鼈兪?lt;全局>的成員。例如,可以使用下面的代碼:
StartDate = DateSerial(1999, 6, 1)
Excel函數(shù),例如VLookup和SUM是WorksheetFuncion對(duì)象的方法,可以使用下面的代碼:
Total = WorksheetFunction.Sum(Range("A1:A10"))
為了與Excel 5和Excel 95兼容,可以直接使用Application而無需WorksheetFunction:
Total = Application.Sum(Range("A1:A10"))
在VBE編輯器中,輸入下面的代碼:
application.WorksheetFunction.
將自動(dòng)顯示出能夠在VBA中使用的所有工作表函數(shù)列表。
改變光標(biāo)顯示(Cursor屬性)
通過Cursor屬性來設(shè)置光標(biāo)在Excel界面中的顯示形狀,可以將其設(shè)置為xlIBeam(條狀)、xlNorthwestArrow(西北向箭頭)、xlWait(等待)、xlDefault(恢復(fù)為默認(rèn)值)。
獲取或改變Excel窗口的狀態(tài)或大小(WindowState屬性)
通過WindowState屬性來獲取或改變Excel窗口的狀態(tài),包括xlMaximized(最大化)、xlMinimized(最小化)、xlNormal(正常)。
通過Height屬性和Width屬性改變或獲取Excel主應(yīng)用程序的高度和寬度。注意,只有當(dāng)Application.WindowState=xlNormal時(shí),才能改變Height屬性和Width屬性。
通過UsableHeight屬性和UsableWidth屬性獲取主應(yīng)用程序窗口中一個(gè)窗口可用的最大高度和最大寬度。
獲取系統(tǒng)信息
下面的示例程序使用了多個(gè)Application對(duì)象的屬性以獲取系統(tǒng)信息:
Sub GetSystemInfo() MsgBox "Excel版本信息為:" & Application.CalculationVersion MsgBox "Excel當(dāng)前允許使用的內(nèi)存為:" & Application.MemoryFree MsgBox "Excel當(dāng)前已經(jīng)使用的內(nèi)存為:" & Application.MemoryUsed MsgBox "Excel可以使用的內(nèi)存為:" & Application.MemoryTotal MsgBox "本機(jī)操作系統(tǒng)的名稱和版本為:" & Application.OperatingSystem MsgBox "本產(chǎn)品所登記的組織名稱為:" & Application.OrganizationName MsgBox "當(dāng)前用戶名為:" & Application.UserName MsgBox "當(dāng)前使用的Excel版本為:" & Application.Version End Sub
自動(dòng)隱藏公式欄(DisplayFormulaBar屬性)
在Excel 2003及以前版本的Excel中,當(dāng)單元格中輸入的數(shù)據(jù)超過一定數(shù)量時(shí),公式欄會(huì)自動(dòng)向下擴(kuò)展,從而遮蓋住了工作表區(qū)域。下面的示例代碼當(dāng)單元格中的字符數(shù)小于50時(shí),顯示公式欄,否則隱藏公式欄。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.count > 1 Then Exit Sub If Len(Target.Text) > 50 Or Len(Target.Formula) > 50 Then Application.DisplayFormulaBar = False Else Application.DisplayFormulaBar = True End If End Sub
當(dāng)然,上述代碼在Excel 2007中仍然有用,但Excel 2007已經(jīng)改進(jìn)了公式欄的特性,即使輸入大量的數(shù)據(jù),也不會(huì)遮蓋工作表區(qū)域。
將Excel全屏顯示(DisplayFullScreen屬性)
Sub testFullScreen() MsgBox "運(yùn)行后將Excel的顯示模式設(shè)置為全屏幕" Application.DisplayFullScreen = True MsgBox "恢復(fù)原來的狀態(tài)" Application.DisplayFullScreen = False End Sub
獲取Excel啟動(dòng)文件夾的路徑(StartupPath屬性)
Sub ExcelStartFolder() MsgBox "Excel的啟動(dòng)文件夾的路徑為:" & Chr(10) & Application.StartupPath End Sub
檢測(cè)Excel的版本(Version屬性)
Sub CheckVersion() If Val(Application.Version) < 12 Then MsgBox "只在Excel 2007或更高版本中有效" ThisWorkbook.Close End If End Sub
Application對(duì)象的Version屬性返回一個(gè)代表當(dāng)前運(yùn)行的Excel的版本的字符串,使用Val函數(shù)返回該字符串內(nèi)的數(shù)值。該屬性通常用于判斷當(dāng)前Excel是否滿足程序運(yùn)行要求。
打開最近使用過的文檔(RecentFiles屬性)
Sub OpenRecentFiles() MsgBox "顯示最近使用過的第三個(gè)文件的名稱,并打開該文件" MsgBox "最近使用過的第三個(gè)文件的名稱為:" & Application.RecentFiles(3).Name Application.RecentFiles(3).Open End Sub
文件對(duì)話框操作(FileDialog屬性)
Sub UseFileDialogOpen() Dim lngCount As Long '開啟"打開文件"對(duì)話框 With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = True .Show '顯示所選的每個(gè)文件的路徑 For lngCount = 1 To .SelectedItems.count MsgBox .SelectedItems(lngCount) Next lngCount End With End Sub
本示例顯示“打開文件”對(duì)話框,當(dāng)用戶在其中選擇一個(gè)或多個(gè)文件后,將依次顯示每個(gè)文件的路徑。其中FileDialog屬性返回打開和保存對(duì)話框中一系列對(duì)象的集合,可以對(duì)該集合對(duì)象的屬性進(jìn)行進(jìn)一步的設(shè)置,例如上例中的AllowMultiSelect屬性設(shè)置為True將允許用戶選擇多個(gè)文件。
改變Excel工作簿的名稱(Caption屬性)
Sub SetCaption() Application.Caption = "我的工作簿" End Sub
將工作簿中的Microsoft Excel列改為“我的工作簿”。
調(diào)用Windows的計(jì)算器(ActivateMicrosoftApp方法)
Sub CallCalculate() Application.ActivateMicrosoftApp Index:=0 End Sub
運(yùn)行上述過程后,將調(diào)用Windows的計(jì)算器。
暫時(shí)停止宏運(yùn)行(Wait方法)
Sub Stop5sMacroRun() Dim SetTime As Date MsgBox "按下「確定」,5秒后執(zhí)行程序「testFullScreen」" SetTime = DateAdd("s", 5, Now()) Application.Wait SetTime Call testFullScreen End Sub
運(yùn)行本程序后,按下彈出的提示框中的“確定”按鈕,等待5秒后執(zhí)行另一程序testFullScreen。
重新計(jì)算工作簿(Calculate方法)
當(dāng)工作簿的計(jì)算模式被設(shè)置為手動(dòng)模式后,運(yùn)用Calculate方法可以重新計(jì)算所有打開的工作簿、工作簿中特定的工作表或者工作表中指定的單元格區(qū)域,如下面的代碼:
Sub CalculateAllWorkbook() Application.Calculate End Sub
下面的代碼先將當(dāng)前Microsoft Excel的版本與上次計(jì)算該工作簿的Excel版本進(jìn)行比較,如果兩個(gè)版本不同,則對(duì)所有打開工作簿中的數(shù)據(jù)進(jìn)行一次完整計(jì)算。其中,CalculationVersion屬性返回工作簿的版本信息。
Sub CalculateFullSample() If Application.CalculationVersion <> Workbooks(1).CalculationVersion Then Application.CalculateFull End If End Sub
控制函數(shù)重新計(jì)算(Volatile方法)
Function NonStaticRand() '當(dāng)工作表中任意單元格重新計(jì)算時(shí)本函數(shù)更新 Application.Volatile True NonStaticRand = Rnd() End Function
本示例摸仿Excel中的Rand()函數(shù),當(dāng)工作表單元格發(fā)生變化時(shí),都會(huì)重新計(jì)算該函數(shù)。在例子中,使用了Volatile方法,強(qiáng)制函數(shù)進(jìn)行重新計(jì)算,即無論何時(shí)重新計(jì)算工作表,該函數(shù)都會(huì)重新計(jì)算。
獲取重疊區(qū)域(Intersect方法)
Sub IntersectRange() Dim rSect As Range Worksheets("Sheet1").Activate Set rSect = Application.Intersect(Range("rg1"), Range("rg2")) If rSect Is Nothing Then MsgBox "沒有交叉區(qū)域" Else rSect.Select End If End Sub
本示例在工作表Sheet1中選定兩個(gè)命名區(qū)域rg1和rg2的重疊區(qū)域,如果所選區(qū)域不重疊,則顯示一條相應(yīng)的信息。其中,Intersect方法返回一個(gè)Range對(duì)象,代表兩個(gè)或多個(gè)范圍重疊的矩形區(qū)域。
獲取路徑分隔符(PathSeparator屬性)
Sub GetPathSeparator() MsgBox "路徑分隔符為" & Application.PathSeparator End Sub
本示例使用PathSeparator屬性返回路徑分隔符(”\”)。
快速移至指定位置(Goto方法)
Sub GotoSample() Application.Goto Reference:=Worksheets("Sheet1").Range("A154"), _ scroll:=True End Sub
本示例運(yùn)行后,將當(dāng)前單元格移至工作表Sheet1中的單元格A154??梢詫⒈炯记蛇\(yùn)用到工作簿事件中,即當(dāng)打開某工作簿時(shí),快速定位到上一次退出時(shí)的單元格位置。
關(guān)閉Excel(Quit方法)
Sub 關(guān)閉Excel() MsgBox "Excel將會(huì)關(guān)閉" Application.Quit End Sub
運(yùn)行本程序后,若該工作簿未保存,則會(huì)彈出對(duì)話框詢問是否保存。
參考資料:
- Developers Guide to the Excel 2007 Application Object
- Excel 2007 VBA參考大全
- Mastering Excel 2003 Programming with VBA
- Application對(duì)象基本操作應(yīng)用示例
- Excel 2007高級(jí)VBA編程寶典
聲明:本文由完美Excel網(wǎng)站整理,完美Excel保留本文的所有權(quán)利,未經(jīng)許可,任何組織或個(gè)人不得以任何方式將本文用于商業(yè)作途。其他網(wǎng)站或博客引用本文,請(qǐng)注明原文鏈接和版權(quán)聲明。