Excel Application對象 開發指南
概述
- 程序範圍的設置和選項。這些選項大部分同“工具”菜單下的“選項”對話框裏的內容相同。
- 頂級對象返回的方法,如ActiveCell、ActiveSheet等。
Application對象中其它對象的引用方法
Application.Workbooks(1).Worksheets(1).Cells(1,1)=20
Set xl=CreateObject("Excel.Sheet") xl.Application.Workbooks.Open "newbook.xls"
Application對象集合
AddIns集合表示所有當前加載的Excel Add-in。你可以像枚舉其它對象一樣在你的程序中列舉出關於add-in的不同類型信息。下面的示例列舉出當前加載到Excel中的Add-in的路徑和名稱。
Sub ListAddIns() Dim myAddin As AddIn For Each myAddin In AddIns MsgBox myAddin.FullName Next End Sub
這兩個集合表示活動工作簿中的列和行。分別使用它們選擇指定的列和行。
Application.Columns(4).Select
Application.Rows(5).Select
Dialogs集合包括Excel程序中所有的對話框。將在本文中後面部分更詳細地討論Dialogs集合。
Sheets集合返回指定或活動工作簿中所有工作表的集合。Sheets集合可以包含Chart或Worksheet對象。
下面示例打印出活動工作簿中所有的工作表。
Application.Sheets.PrintOut
For iSheet = 1 To Application.Sheets.Count If Not IsEmpty(Application.Sheets(iSheet).UsedRange) Then Application.Sheets(iSheet).PrintOut copies:=1 End If Next iSheet
Application對象的屬性
- ActiveCell
- ActiveChart
- ActiveSheet
- ActiveWindow
- ActiveWorkbook
- RangeSelection
- Selection
- StatusBar
- ThisWorkbook
Application對象的ActiveCell屬性返回一個表示活動工作簿中活動工作表的活動單元格的Range對象。如果你沒有指定對象限定詞,這個屬性返回活動窗口的活動單元格。
Worksheets("Sheet1").Activate With ActiveCell.Font .Bold = True .Italic = True End With
ActiveChart屬性返回表示活動圖表的Chart對象,不管它是嵌入的圖表還是圖表工作表。在一個嵌入的圖表被選擇或激活時,它就是活動圖表。下面的示例使用ActiveChart屬性添加一個3維柱形圖到月銷售記錄工作表中。
Sub AddChart() Charts.Add With ActiveChart .ChartType = xl3DColumn .SetSourceData Source:=Sheets("Sheet1").Range("B3:H15") .Location Where:=xlLocationAsObject, Name:="Monthly Sales" .HasTitle = True .ChartTitle.Characters.Text = Monthly Sales by Category End With End Sub
ActiveSheet屬性返回一個表示當前選中的工作表(頂部工作表)的Worksheet對象。在一個工作簿中只有一個工作表能成爲活動工作表。下面的示例顯示活動工作表的名稱。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
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屬性返回一個表示活動窗口(頂部窗口)的Window對象。下面的示例顯示活動窗口的名稱(Caption屬性)。
MsgBox "The name of the active window is " & ActiveWindow.Caption
Sub PrintWorksheet() Application.ScreenUpdating = False Sheets("Sales").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Expenses").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True End Sub
ActiveWorkbook屬性返回一個表示活動窗口(頂部窗口)中的工作簿的Workbook對象。這個示例顯示活動工作簿的名稱。
MsgBox "The name of the active workbook is " & ActiveWorkbook.Name
Sub CalcBook() Dim wks As Worksheet Application.Calculation = xlManual For Each wks In ActiveWorkbook.Worksheets wks.Calculate Next Set wks = Nothing End Sub
RangeSelection屬性返回一個表示指定窗口中工作表裏選擇的單元格的Range對象,即使在工作表中一個圖表對象已經被選擇或激活。這個示例顯示活動窗口中工作表所選擇單元格的地址。
MsgBox Application.ActiveWindow.RangeSelection.Address
這裏介紹的語法RangeSelection.Name.Name在Office2003和2007中使用時都出現錯誤,如果該代碼生效,必須先設置單元格A1的名稱。並且應該不是單元格內容的前三個字符,而是名稱的前三個字符。這應該是原文的疏漏。
Range("A1").Select MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
ActiveWindow.RangeSelection.Name.Name
Selection屬性返回活動窗口中被選擇的對象。例如,對於單元格,這個屬性返回Range對象;對於圖表,它返回Chart對象。如果使用屬性而沒有對象限定符,等於使用Application.Selection。
Worksheets("Sheet1").Activate Selection.Clear
NumRows = 0 For Each area In Selection.Areas NumRows = NumRows + area.Rows.Count Next area
Sub Count_Selection() Dim cell As Object Dim count As Integer count = 0 For Each cell In Selection count = count + 1 Next cell MsgBox count & " item(s) selected" End Sub
StatusBar屬性返回或設置狀態欄的文本。這個屬性允許你更改在Excel窗口底部的狀態欄中顯示的信息。它對在運算過程需要較長時間來完成時讓用戶知道正在運行的進度非常有幫助。
Dim FileNum As Integer FileNum = 0 For Each file in Files ' Do something here. Application.StatusBar = "Now processing File " & FileNum FileNum = FileNum + 1 Next
Application.StatusBar = False
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
ThisWorkbook屬性返回一個表示當前運行的宏代碼所在工作簿的 Workbook對象。這個屬性允許載入宏定義包含代碼的工作簿。這種情況下ActiveWorkbook屬性並不起作用,因爲活動工作簿可能並不是包含載入宏代碼的工作簿。換句話說,ActiveWorkbook屬性不返回載入宏工作簿;它返回調用載入宏的工作簿。如果你使用你的Visual Basic代碼創建載入宏,你應該使用ThisWorkbook屬性來限定任何必須運行在包含載入宏的工作簿上的語句。
ThisWorkbook.Close SaveChanges:=False
Private oExcel As Excel.Application Private wbk As Excel.Workbook Sub CloseOpenWrkBks() Dim wrkb As Workbook For Each wbk In Application.Workbooks If wrkb.Name <> ThisWorkbook.Name Then wbk.Close True End If Next wbk ThisWorkbook.Close True End Sub
Application對象方法
同GetOpenFilename方法不同,FindFile方法顯示Open對話框並允許用戶打開一個文件。如果新文件成功打開,此方法返回True。如果用戶取消對話框,此方法返回False。
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
Sub OpenFile2( ) Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xls" End Sub
- 打開Visual Basic編輯器。
- 單擊菜單“視圖”->“對象瀏覽器”,顯示對象瀏覽器窗口,也可以按F2。
- 在搜索框中輸入xlBuiltInDialog。
- 單擊Search按鈕。
GetOpenFilename 方法顯示標準“打開”對話框並返回用戶選擇的文件名,實際上並未打開任何文件。GetOpenFilename方法給你最大的控制從你的程序中打開一個工作簿,因爲它所做的就是以字符串返回用戶選擇的文件完整路徑和文件名。獲得文件名後接着做什麼就取決於你自己了。例如,你可能傳遞結果給OpenText 方法。這個方法的語法如下(所有的參數都是可選的):
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
Dim fileToOpen As String fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") If fileToOpen <> "" Then MsgBox "Open " & fileToOpen End If
就像你估計的,InputBox方法顯示一個對話框提示用戶輸入一個值。這個方法通過指定期望從用戶獲取的數據類型允許你有選擇性地輸入。
InputBox方法語法如下:
InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
Prompt是顯示在對話框中的信息,在這裏你可以讓用戶知道你期望的數據類型。
Title是在對話框頂部顯示的標題。
Default是最初顯示的默認值。
Left和Top用來指定對話框的位置。這些值以屏幕的左上角爲參考點,單位是磅。
HelpFile和HelpContextID指定一個幫助文件。如果使用這些參數,在對話框中將包括一個Help按鈕。
Type是返回的數據類型,默認值是Text。允許的數據類型如下表。
Value Type
0 公式,以字符串返回,只需要此參數
1 數值,你也可以在此包括一個返回一個數值的公式
2 文本(字符串)
4 邏輯數值(True或False)
8 一個單元格引用,Range對象
16 一個錯誤數值,如#N/A
64 數值列表
Set myRange = Application.InputBox(prompt := "Sample", type := 8)
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方法執行一個宏或調用一個函數。你可以使用這個方法運行一個用VBA或Excel宏語言寫的宏,或者運行一個動態鏈接庫(DLL)或Excel加載宏(XLL)中的函數。XLL是Excel的加載宏,你可以使用任何支持創建DLLs的編譯器來創建它。下面是此方法的語法:
Run(Macro, Arg1, , Arg30)
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對象事件
2. 在“屬性”欄中,更改類的名稱爲appEventClass。
3. 在類模塊的代碼窗口,輸入:
Public WithEvents Apply As Application
4. 現在測試一下,在代碼窗口的對象列表中,單擊“Apply”。
5. 在代碼窗口中的過程列表中,單擊Apply_WorkbookOpen. 這樣將在代碼窗口中添加一個自動生成的過程用於Apply_WorkbookOpen事件。
6. 修改該過程如下:
Private Sub Apply_WorkbookOpen(ByVal Wb As Workbook) MsgBox "你打開了工作簿。" End Sub
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) MsgBox "你關閉了工作簿。" End Sub
9. 加入下面的語句。
Dim ApplicationClass As New AppEventClass
Private Sub Workbook_Open() Set ApplicationClass.Appl = Application End Sub
11. 現在打開該工作簿來測試代碼。Apply_WorkbookOpen事件將顯示對話框。
12. 關閉工作簿,Apply_WorkbookBeforeClose將顯示對話框。
13. 回到AppEventClass類模塊,單擊過程列表將顯示很多你可以在程序中用來監控動作的事件。
Application對象的其它用法
在下面的例子中,首先關閉任何詢問是否需要刪除工作表的警告消息框,然後刪除工作表,再設置使警告消息框生效。
Sub DeleteSheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
這個例子在保存工作簿時沒有提示用戶。
Sub SaveWorksheet() Application.DisplayAlerts = False ActiveWorkbook.SaveAs "C:\MonthlySales.xls" Application.DisplayAlerts = True End Sub
下面的例子使用SendKeys語句從Excel語句中複製一個區域的數據到Notepad程序中,並保存爲文本文件。
Sub SKeys() Range("A1:D15").Copy ' Copy the range. SendKeys "% n", True ' Minimize Excel. Shell "notepad.exe", vbNormalFocus ' Start Notepad. SendKeys "^V", True ' Past the range data into Notepad. SendKeys "�", True ' Specify SaveAs. SendKeys "SalesData.txt", True ' Provide a file name. SendKeys "%S", True ' Save the file. Close notepad End Sub
你可以使用Application對象的OnTime方法在指定的時間或以固定時間間隔運行一個過程。OnTime方法的語法如下:
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Application.OnTime EarliestTime:= Now + TimeValue("00:05:00), _ Procedure := "YourProc"
Application.OnTime _ EarliestTime:=TimeValue("12:00:00"), _ Procedure:="YourProc"
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