Excel Application对象 开发指南

概述

Application对象是Microsoft Office Excel 2007对象模型中最高级别的对象,表示Excel程序自身。Application对象提供正在运行的程序的信息、应用于程序实例的选项以及实例中打开的当前对象。因为它是对象模型中最高的对象,Application对象也包含组成一个工作簿的很多部件,包括如工作簿、工作表集合、单元格以及这些对象所包含的数据等。
Application对象包括:
  • 程序范围的设置和选项。这些选项大部分同“工具”菜单下的“选项”对话框里的内容相同。
  • 顶级对象返回的方法,如ActiveCell、ActiveSheet等。
在下面几节里,你将通过使用VBA代码示例学习到一些Application对象中经常使用到的对象、方法和属性。关于Application对象模型所有成员的详细资料,请参考 Application对象成员

Application对象中其它对象的引用方法

你可以使用Application属性返回Application对象。获取一个Application对象后,如需访问它下面的对象,可以在对象模型层级中往下移动。下面示例设置一个工作表的第一个单元格内容为20。
Application.Workbooks(1).Worksheets(1).Cells(1,1)=20
要表示一个单元格,上面的代码示例从Application对象开始,移到第一个工作簿,再移到第一个工作表,最后到这个单元格。
下面示例在另一个Excel程序中创建一个Excel工作簿对象,然后打开一个工作簿。
Set xl=CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"
不需要使用“Application”限定词,很多的属性和方法也可以直接被用来返回那些最常用的用户界面对象,如活动工作表 (ActiveSheet属性)。例如,除了使用Application.ActiveSheet.Name = “Monthly Sales”,你也可以使用ActiveSheet.Name = “Monthly Sales”。然而,当使用这个简便表示方法时必需小心,需要选择正确的对象。例如通过使用Worksheet对象的Activate方确定你选择了正确的工作簿和工作表后,你可以使用Cell(1,1)表示第一个单元格。
有几种情况你必需使用Application限定词。例如,OnTime对象(本文后面部分将讨论)需要这个限定词,还有程序窗口的Width和 Height属性。一般来说,用来处理Excel窗口的外观或影响程序全局行为的属性或方法需要使用Application限定词;例如, DisplayFormlaBar属性用来显示或隐藏公式栏,Calculation方法也需要限定词。

Application对象集合

这一节详细介绍一些和Application对象相关的集合。
AddIns集合
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
Columns和Rows集合
这两个集合表示活动工作簿中的列和行。分别使用它们选择指定的列和行。
Application.Columns(4).Select
这个语句选择D列,就像你通过点击用户界面中的列的顶部一样。
Application.Rows(5).Select
这个语句选择工作表中的第5行,就像你点击行的左边框一样。
Dialogs集合
Dialogs集合包括Excel程序中所有的对话框。将在本文中后面部分更详细地讨论Dialogs集合。
Sheets集合
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对象的属性

有很多的属性可以用来访问Excel 2007程序的各种对象,多得不能记住或在这里全部讨论。幸运的是只有一部分是你可能经常使用的。
  • ActiveCell
  • ActiveChart
  • ActiveSheet
  • ActiveWindow
  • ActiveWorkbook
  • RangeSelection
  • Selection
  • StatusBar
  • ThisWorkbook
下面的内容演示这些常用属性的使用方法。
ActiveCell属性
Application对象的ActiveCell属性返回一个表示活动工作簿中活动工作表的活动单元格的Range对象。如果你没有指定对象限定词,这个属性返回活动窗口的活动单元格。
注意区别活动单元格和选择的单元格。活动单元格是当前选择中的一个单元格。选择(Selection)可能包括一个单元格集合,但只有其中一个是活动单元格。
下面的示例改变活动单元格的字体格式。注意为了确保你操作正确的单元格,工作表集合的Activate方法让Sheet1成为活动工作表。
Worksheets("Sheet1").Activate
With ActiveCell.Font
    .Bold = True
    .Italic = True
End With
ActiveChart属性
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属性
ActiveSheet属性返回一个表示当前选中的工作表(顶部工作表)的Worksheet对象。在一个工作簿中只有一个工作表能成为活动工作表。下面的示例显示活动工作表的名称。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
下面的示例将活动工作表复制用户指定的次数并放置在Sheet1之前。
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属性
ActiveWindow属性返回一个表示活动窗口(顶部窗口)的Window对象。下面的示例显示活动窗口的名称(Caption属性)。
MsgBox "The name of the active window is " & ActiveWindow.Caption
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
在这个例子中,你可能疑惑为什么设置ScreenUpdating属性为False。当Excel执行一系列任务时,屏幕被更新并刷新很多次,这将导致屏幕闪烁。设置ScreenUpdating属性为False可以消除闪烁。另外,因为电脑处理器不需要暂停来刷新屏幕,这样也可以让大型程序运行得较快一点。
ActiveWorkbook属性
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属性
RangeSelection属性返回一个表示指定窗口中工作表里选择的单元格的Range对象,即使在工作表中一个图表对象已经被选择或激活。这个示例显示活动窗口中工作表所选择单元格的地址。
MsgBox Application.ActiveWindow.RangeSelection.Address
当你选择了一个范围,RangeSelection属性和Selection对象表示同样一个范围。当你选择一个图表,RangeSelection属性返回之前选择的范围。Selection属性将在下一节中详细介绍。
这里介绍的语法RangeSelection.Name.Name在Office2003和2007中使用时都出现错误,如果该代码生效,必须先设置单元格A1的名称。并且应该不是单元格内容的前三个字符,而是名称的前三个字符。这应该是原文的疏漏。
下面的示例显示一个单元格中的前三个字符。
Range("A1").Select
MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
你可能奇怪为什么使用这样的语法
ActiveWindow.RangeSelection.Name.Name
当你选择一个范围,使用RangeSelection.Name方法可以获取像Sheet1!$A$1:$B$15这样的范围地址。另外,使用RangeSelection.Name.Name方法可以获取命名像MyRange1这样的范围本身的名称。
Selection属性
Selection属性返回活动窗口中被选择的对象。例如,对于单元格,这个属性返回Range对象;对于图表,它返回Chart对象。如果使用属性而没有对象限定符,等于使用Application.Selection。
这个示例清除Sheet1所选的内容。
Worksheets("Sheet1").Activate Selection.Clear
下面的例子将所选范围的总行数保存到变量NumRows。
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属性
StatusBar属性返回或设置状态栏的文本。这个属性允许你更改在Excel窗口底部的状态栏中显示的信息。它对在运算过程需要较长时间来完成时让用户知道正在运行的进度非常有帮助。
如果Excel控制状态栏时StatusBar属性返回False。另外,如需恢复默认状态栏文本,只需设置属性值为False即可;甚至在状态栏隐藏时也有效。
例如,使用下面的方式对每个处理的文件你可以给StatusBar属性赋值。
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
你可以创建你自己的过程使用StatusBar属性显示一个宏或其它过程的进度。
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
这个例子在状态栏上显示最大15个方块(由常数MAXSQR定义)。这个方块通过使用ASCII字符31来产生。这个缺少关于宏需要多长时间的视觉指示,它仅表明宏正在进行。Wait方法模拟一个宏需要长时间来执行。
ThisWorkbook属性
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对象方法

除了Application对象属性外,下面将介绍一些更加常用的方法。
FindFile方法和Dialogs集合
同GetOpenFilename方法不同,FindFile方法显示Open对话框并允许用户打开一个文件。如果新文件成功打开,此方法返回True。如果用户取消对话框,此方法返回False。
下面示例显示一个消息框提示用户打开一个指定文件,然后显示Open对话框。如果用户不能打开文件,显示一个消息框。
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
你也可以通过使用Dialogs集合细目的其中一个打开特别的对话框来完成同样的事情。使用Dialogs集合的一个好处是当你使用Show方法时,你可以传递参数给它来修改内置对话框的默认行为。例如,xlDialogOpen的参数有: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.
注意:如需查找某个特定的对话框的参数,在Excel帮助文档的“内置对话框参数列表”中找到相应的对话框常数。
下面的例子显示“打开”对话框并设置“Book1.xls”在文件名下拉列表框中,用户不需要选择文件就可以在对话框中显示文件名。
Sub OpenFile2( )
Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xls"
End Sub
Dialogs集合最激动人心的部分是你可以使用它显示任何Excel对话框-大约250种。你可以通过下面的步骤查看Dialogs集合的完整对话框列表。
  1. 打开Visual Basic编辑器。
  2. 单击菜单“视图”->“对象浏览器”,显示对象浏览器窗口,也可以按F2。
  3. 在搜索框中输入xlBuiltInDialog。
  4. 单击Search按钮。
GetOpenFilename方法
GetOpenFilename 方法显示标准“打开”对话框并返回用户选择的文件名,实际上并未打开任何文件。GetOpenFilename方法给你最大的控制从你的程序中打开一个工作簿,因为它所做的就是以字符串返回用户选择的文件完整路径和文件名。获得文件名后接着做什么就取决于你自己了。例如,你可能传递结果给OpenText 方法。这个方法的语法如下(所有的参数都是可选的):
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
参数FileFilter是一个定义过滤条件(如*.txt,*.xla)的字符串;FilterIndx指定默认文件过滤条件的序号,从1到 FileFilter中的过滤器数目;Title指定对话框的标题;ButtonText只用于Macintosh系统;MultiSelect是一个 Boolean值,表示可以多选文件。
下面的例子显示“打开”对话框,并在文件类型下拉框中使用文本文件(*.txt)过滤条件,然后使用消息框显示用户的选择。
Dim fileToOpen As String
fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If fileToOpen <> "" Then
MsgBox "Open " & fileToOpen
End If
InputBox方法
就像你估计的,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 数值列表
注意:如果Type为8,你必须使用Set语句将结果赋值给一个Range对象,如下例所示
Set myRange = Application.InputBox(prompt := "Sample", type := 8)
下面的例子要求用户输入打印活动工作表的份数。注意Type参数表明此方法要求输入数字。
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方法
Run方法执行一个宏或调用一个函数。你可以使用这个方法运行一个用VBA或Excel宏语言写的宏,或者运行一个动态链接库(DLL)或Excel加载宏(XLL)中的函数。XLL是Excel的加载宏,你可以使用任何支持创建DLLs的编译器来创建它。下面是此方法的语法:
Run(Macro, Arg1,    , Arg30)
Macro是要执行的宏或函数的名字。Arg1到Arg30是你需要传递给宏或函数的任何参数。
下面的例子使用Run方法调用一个过程来设置一个范围中单元格的字体为粗体。注意你也可以使用Call方法来达到同样的结果。
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对象事件

Application对象也提供几个事件让你可以用来监控整个Excel程序的动作。要使用Application事件,你必须激活Application事件监控。请按照以下步骤操作:
1. 创建一个类。在VBE窗口中,单击“插入”–>“类模块”
2. 在“属性”栏中,更改类的名称为appEventClass。
3. 在类模块的代码窗口,输入:
Public WithEvents Apply As Application
现在Application级的事件可以使用了。
4. 现在测试一下,在代码窗口的对象列表中,单击“Apply”。
5. 在代码窗口中的过程列表中,单击Apply_WorkbookOpen. 这样将在代码窗口中添加一个自动生成的过程用于Apply_WorkbookOpen事件。
6. 修改该过程如下:
Private Sub Apply_WorkbookOpen(ByVal Wb As Workbook)
       MsgBox "你打开了工作簿。"
End Sub
7. 重复以上步骤加入Apply_WorkbookBeforeClose事件。修改该事件的代码如下:
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    MsgBox "你关闭了工作簿。"
End Sub
8. 接着,创建一个变量用来代表在类模块中创建的Application对象。在VBA Project的Project栏,双击ThisWorkbook节点打开代码窗口。
9. 加入下面的语句。
Dim ApplicationClass As New AppEventClass
通过在ThisWorkbook代码窗口中添加以下过程来建立一个声明的对象到Application对象的关联。
Private Sub Workbook_Open()
Set ApplicationClass.Appl = Application
End Sub
10. 保存并关闭工作簿。
11. 现在打开该工作簿来测试代码。Apply_WorkbookOpen事件将显示对话框。
12. 关闭工作簿,Apply_WorkbookBeforeClose将显示对话框。
13. 回到AppEventClass类模块,单击过程列表将显示很多你可以在程序中用来监控动作的事件。
理解事件怎样被激发并以何种顺序激发对理解你的程序很重要。在类模块中加入其它事件,并插入消息框,然后尝试不同的动作看看什么时候什么事件将被激活。

Application对象的其它用法

除了一些常用的对象外,你还可以在Excel程序中使用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发送信息到Notepad程序
下面的例子使用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 "%FA", True ' Specify SaveAs.
SendKeys "SalesData.txt", True ' Provide a file name.
SendKeys "%S", True ' Save the file.
Close notepad
End Sub
这个例子首先复制一个区域的数据到剪贴板,然后最小化Excel,启动Notepad,然后从剪贴板复制数据到Notepad,最后指定文件名并保存文件,再关闭Notepad。
在指定时间或间隔运行一个宏
你可以使用Application对象的OnTime方法在指定的时间或以固定时间间隔运行一个过程。OnTime方法的语法如下:
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
参数EarliestTime表示什么使用运行名称为参数Procedure的过程。可选参数LatestTime和Schedule变量分别表示运行过程的最后时间和是否新建一个过程来运行还是取消现有的过程。假如开始运行时Excel很忙,你需要指定一个时间范围来调用过程时参数 LatestTime很有帮助。
下面的示例每5分钟运行指定的过程YourProc
Application.OnTime EarliestTime:= Now + TimeValue("00:05:00), _
Procedure := "YourProc"
下面的示例每天正午的时候运行过程YourProc.
Application.OnTime _
EarliestTime:=TimeValue("12:00:00"), _
Procedure:="YourProc"
下面的示例每5分钟调用AutoSave过程。如果你关闭工作簿,调用Cleanup过程来取消前面设置的OnTime。
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事件包含在Workbook模块中。AutoSave和CleanUp过程应该位于标准模块中。

结论

这篇文章仅介绍Application对象的一部分成员。还有其他成员让你的用户以新的方式同Excel程序交互和改变你程序的外观。熟悉Application对象的使用将让你按照你自己的要求扩展和采用Excel的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值