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