VBA|使用Application對象管理和控制Excel應用程序
Application對象是Excel對象模型的最頂層對象,代表Excel應用程序本身。Application對象提供了大量的屬性、方法和事件,供用戶操作控制Excel程序。
1 用Application對象打扮應用程序
1.1 用Caption屬性設置主窗口標題欄
Private Sub Workbook_Open()
Application.Caption = "工資管理系統"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.Caption = ""
End Sub
1.2 用StatusBar屬性控制狀態欄
Sub 控制狀態欄()
Dim i As Long
Application.DisplayStatusBar = True
For i = 1 To ActiveSheet.Rows.Count
If i Mod 100 = 0 Then
Application.StatusBar = "正在處理第 " & i & " 行的數據,請稍候!"
End If
Next
Application.StatusBar = False
End Sub
1.3 用DisplayFormulaBar屬性控制編輯欄
Sub 控制編輯欄()
With Application
If .DisplayFormulaBar Then
.DisplayFormulaBar = False
Else
.DisplayFormulaBar = True
End If
End With
End Sub
1.4 用Cursor屬性控制鼠標指針形狀
Sub 顯示鼠標指針形狀()
Dim i As Integer
For i = 1 To 3
MsgBox "顯示第 " & i & " 種鼠標指針形狀!", vbInformation + vbOKOnly
Application.Cursor = i
st = Timer
Do While Timer <= st + 5
DoEvents
Loop
Next
MsgBox "恢復默認鼠標指針形狀!", vbInformation + vbOKOnly
Application.Cursor = xlDefault
End Sub
在Excel工作簿中,鼠標指針的形狀有4種形式:
xlDefault:默認指針,值為-4143;
xlNorthwestArrow:西北向箭頭指針,值為1;
xlWait:沙漏型指針,值為2;
xlIBeam:I形指針,值為3;
2 用Application對象控制應用程序
2.1 用ScreenUpdating屬性控制屏幕刷新
在默認情況下,Excel每執行一次操作就會更新一次屏幕,以顯示出執行的結果。關閉屏幕刷新,可以提高程序的執行速度。
Sub 屏幕更新()
Dim aTime(2)
Application.ScreenUpdating = True
For i = 1 To 2
If i = 2 Then Application.ScreenUpdating = False
Worksheets(i).Activate
starttime = Timer
For j = 1 To ActiveSheet.Rows.Count
If j Mod 2 = 0 Then
Rows(j).Hidden = True
End If
Next j
stopTime = Timer
aTime(i) = stopTime - starttime
Next i
Application.ScreenUpdating = True
MsgBox "打開屏幕更新,程序執行的時間: " & aTime(1) & " 秒" & Chr(13) & _
"關閉屏幕更新,程序執行的時間: " & aTime(2) & " 秒"
End Sub
2.2 用DisplayAlerts屬性控制警報信息
當用戶進行一些特定操作(如刪除工作表)時,Excel會以對話框的形式提醒用戶,需要用戶響應才可以進行下一步操作。如果用戶不想讓Excel進行提示,可以用VBA代碼關閉此功能。
Sub 刪除工作表()
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End Sub
2.3 用RecentFiles屬性顯示最近使用的文檔
Sub 最近使用文檔()
Dim i As Long, j As Long
Dim r As RecentFile
ActiveSheet.Columns(1).Clear
i = 1
For Each r In Application.RecentFiles
ActiveSheet.Cells(i, 1) = r.Name
i = i + 1
Next
End Sub
2.4 用SendKeys方法模擬鍵盤輸入
使用此方法,可以將擊鍵發送給活動應用程序。
Sub 模似輸入()
Dim dReturnValue As Double
dReturnValue = Shell("NOTEPAD.EXE", 1) '打開記事本
AppActivate dReturnValue '激活應用程序
Application.SendKeys "~", True
Application.SendKeys "Keybord input demo :", True
Application.SendKeys "~", True
Application.SendKeys " Excel 2010 VBA ! ", True
End Sub
上面的代碼運行後,會打開有如下內容的“記事本”窗口,如下圖:
2.5 用OnTime方法定時執行過程
以下代碼將進行整點報時:
Sub starttime()
Application.OnTime EarliestTime:=TimeSerial((Hour(Now) + 1) Mod 24, 0, 0), _
Procedure:="starttime"
MsgBox "現在時間是:" & Hour(Now) & " 點!"
End Sub
以下代碼將取消整點報時:
Sub endtime()
On Error Resume Next
Application.OnTime EarliestTime:=TimeSerial((Hour(Now) + 1) Mod 24, 0, 0), _
Procedure:="starttime", schedule:=False
End Sub
2.6 用WorksheetFunction屬性調用內置函數
使用此方法,可以方便地調用Excel工作表函數(注意區別VBA內置函數)。
Sub 查詢股票價格()
Dim sStock As String, cPrice As Currency
sStock = InputBox(prompt:="輸入股票代碼:" & Chr(13) & " (例如:600000) ")
cPrice = Application.WorksheetFunction.VLookup(sStock, _
Worksheets("Sheet1").Range("A1:C5"), 3, 0)
MsgBox "股票" & sStock & "收盤價為:" & cPrice
End Sub
以下代碼使用CountIf函數在指定區域生成不重複的隨機數:
Sub 生成不重複隨機數()
Dim rng As Range, rng1 As Range
Set rng = Application.InputBox(prompt:="選擇要保存不重複隨機數的單元格區域:", _
Title:="生成隨機數", Type:=8)
If rng Is Nothing Then Exit Sub
Randomize
For Each rng1 In rng '選中區域的每個單元格生成隨機數
Do
rng1 = Int(Rnd * 100 + 1) '生成1~100的隨機數
Loop Until Application.CountIf(rng, rng1) = 1 '循環判斷隨機數是否有重複
Next
End Sub
2.7 用Goto方法快速跳轉
使用此方法可以選定任意工作簿中的任意區域。
Sub 快速跳轉()
Application.Goto Reference:=Worksheets("Sheet2").Range("A1:A10"), Scroll:=True
End Sub
2.8 用Union方法合併單元格區域
Sub 合併區域()
Worksheets("Sheet3").Activate
Set unRange = Application.Union(Range("A1:B5"), Range("D1:E5"))
unRange.Formula = "=RAND()"
End Sub
2.9 用OnKey方法自定義功能鍵
使用此方法,可在設定的特定鍵或組合鍵被按下時,運行指定的過程。
Sub 設置自定義功能鍵()
Application.OnKey "%.", "NextPage"
Application.OnKey "%,", "PrePage"
End Sub
Sub NextPage()
ActiveWindow.LargeScroll down:=1
End Sub
Sub PrePage()
ActiveWindow.LargeScroll up:=1
End Sub
Sub 禁止自定義功能鍵()
Application.OnKey "%."
Application.OnKey "%,"
End Sub
3 啟用並使用Application事件
3.1 啟用Application事件
插入類模塊EventClassModule,並編寫如下代碼:
Public WithEvents App As Application
關鍵字WithEvents說明變量App是用來響應由Application對象觸發的事件的對象變量
此時在類模塊的“對象”下拉列表框中會出現“App”對象,如下圖所示:
插入一個新模塊,並編寫如下代碼:
Dim X As New EventClassModule
Sub 啟用Application事件()
Set X.App = Application
End Sub
Sub 禁止Application事件()
Set X.App = Nothing
End Sub
3.2 編寫Application事件事件過程,保存到類模塊EventClassModule中
Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)MsgBox "本工作簿不允許保存修改內容!", vbCritical + vbOKOnly
Cancel = True
End Sub
當保存工作簿時,會彈出不允許保存的對話框。