小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Excel Application對(duì)象應(yīng)用大全

 yuxinrong 2009-12-24

[完美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。

表1:InputBox方法返回的數(shù)據(jù)類型
類型
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){}中。

表2:OnKey方法的按鍵代碼
按鍵 代碼
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。

表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ì)話框詢問是否保存。

參考資料:

聲明本文由完美Excel網(wǎng)站整理,完美Excel保留本文的所有權(quán)利,未經(jīng)許可,任何組織或個(gè)人不得以任何方式將本文用于商業(yè)作途。其他網(wǎng)站或博客引用本文,請(qǐng)注明原文鏈接和版權(quán)聲明。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多