ExcelApplication操作指南
概述
Application对象是Microsoft Office Excel 2007对象模型中最⾼级别的对象,表⽰Excel程序⾃⾝。Application对象提供正在运⾏的程序的信息、应⽤于程序实例的选项以及实例
中打开的当前对象。因为它是对象模型中最⾼的对象,Application对象也包含组成⼀个⼯作簿的很多部件,包括如⼯作簿、⼯作表集合、单元格以及这些对象所包含的数据等。
Application对象包括:
程序范围的设置和选项。这些选项⼤部分同“⼯具”菜单下的“选项”对话框⾥的内容相同。
顶级对象返回的⽅法,如ActiveCell、ActiveSheet等。
在下⾯⼏节⾥,你将通过使⽤VBA代码⽰例学习到⼀些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属性
excel口内打 或者xApplication对象的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 = 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 E 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 E 在这个例⼦中,你可能疑惑为什
么设置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(3这个例⼦在状态栏上显⽰最⼤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 ThisW 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:=sPromp 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 MyP 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 "", vbNormalFocus ' Start Notepad. SendKeys "^V", True ' Past the range data into Notepad. SendKeys "�", True ' Specify SaveA
这个例⼦⾸先复制⼀个区域的数据到剪贴板,然后最⼩化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 AsBoolean) On Error Resume Next Application.OnTime Now + TimeValue("00:05:00"), "CleanUp 注意:Workbook_Open和Workbook_BeforeClose事件包含在Workbook模块中。AutoSave和CleanUp过程应该位于标准模块中。
结论
这篇⽂章仅介绍Application对象的⼀部分成员。还有其他成员让你的⽤户以新的⽅式同Excel程序交互和改变你程序的外观。熟悉Application对象的使⽤将让你按照你⾃⼰的要求
扩展和采⽤Excel的功能。
[@more@]Workbook 对象应⽤⽰例 2009-12-29 21:37:01
标签:
Workbook对象代表⼀个⼯作簿,Workbooks集合对象则代表同⼀Excel进程中打开的所有⼯作簿对象。
[应⽤1] 创建新⼯作簿(Add⽅法)
使⽤Add⽅法在Workbooks集合中创建新⼯作簿,所创建的⼯作簿为活动⼯作簿。其语法为:
Workbooks.Add(Template)
参数Template可选,决定如何创建新⼯作簿。如果将该参数设置为已存在的Excel模板⽂件名称,那么将以该⽂件作为模板创建⼯作簿。该参数可以为下列XlWBATemplate常量
之⼀:xlWBATChart(值-4109,代表图表)、xlWBATExcel4IntlMacroSheet(值4)、xlWBATExcel4MacroSheet(值3)、xlWBATWorksheet(值-4167,代表⼯作表)。在
创建新⼯作簿时,如果指定该参数,那么将创建包含指定类型⼯作表的⼯作簿;如果省略该参数,那么将创建包含⼀定数量空⼯作表的⼯作簿,⼯作表数为
SheetsInNewWorkbook属性所设置的数量。
应⽤⽰例1:创建⼀个新⼯作簿
Sub CreateNewWorkbook1() MsgBox "将创建⼀个新⼯作簿." Workbooks.Add End Sub
应⽤⽰例2:创建⼀个新⼯作簿并命名⼯作表且添加数据
Sub CreateNewWorkbook2() Dim wb As Workbook Dim ws As Worksheet Dim i As Long MsgBox "将创建⼀个新⼯作簿,并预设⼯作表格式." Set wb = Workbooks.AddSet ws = wb.Sheets(1) ws.Name = "产品汇总表" ws.Cells(1, 1) = "序号" ws.Ce 应⽤⽰例3:创建带有指定数量⼯作表的⼯作簿
Sub testNewWorkbook() MsgBox "创建⼀个带有10个⼯作表的新⼯作簿" Dim wb As Workbook Set wb = NewWorkbook(10) End Sub Function NewWorkbook(wsCount AsInteger) As Workbook '创建带有由变量wsCount提定数量⼯作表的⼯作簿,⼯⾃定义函数NewWorkbook可以创建最多带有255个⼯作表的⼯作簿。本测试⽰例创建⼀个带有10个⼯作表的新⼯作簿。
[应⽤2] 打开⼯作簿(Open⽅法)
Open⽅法⽤于打开⼀个现有的⼯作簿,其语法为:
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
可以看到,该⽅法具有很多参数,但⼤多数参数都很少⽤到。在这些参数中,除参数FileName必须外,其它参数都可选。
参数FileName指定要打开的⼯作簿⽂件的名称,参数UpdateLinks指定更新⼯作簿中链接的⽅式,参数ReadOnly⽤来设置是否以只读⽅式打开⼯作簿。如果需要使⽤密码来打开
⼯作簿,则应该将参数Password设置为该密码;如果需要使⽤密码打开⼯作簿但没有指定密码,则会弹出询问密码的对话框。参数AddToMru指定是否将⼯作簿添加到最近使⽤
的⽂件列表中,建议将其设置为True,默认值为False。
应⽤⽰例4:以只读⽅式打开某⼯作簿
Sub openWorkbook2() Dim fname As String MsgBox "将D盘中的<;测试.xls>⼯作簿以只读⽅式打开" fname = "D:测试.xls" Workbooks.Open Filename:=fname, ReadOnly:=True End Sub
[应⽤3] 访问特定的⼯作簿
使⽤Item属性返回Workbooks集合中特定的⼯作簿。例如:
Workbooks.Item(1)
返回Workbooks集合中的第⼀个⼯作簿。由于Item属性是缺省的属性,因此上述代码也可以简写为:
Workbooks(1)
然⽽,使⽤索引号来指定⼯作簿是不可靠的,最好使⽤⼯作簿的具体名称来指定特定的⼯作簿,例如:
Workbooks("MyBook.xlsx")
注意,当⽤户使⽤“新建”命令创建⼀个新⼯作簿(假设该⼯作簿系统默认名称为Book2)时,在没有保存该⼯作簿前,应该使⽤下⾯的代码指定该⼯作簿:
Workbooks("Book2")
此时,如果使⽤下⾯的代码指定该⼯作簿:
Workbooks("Book2.xlsx")
将会产⽣运⾏时错误:下标越界。
[应⽤4] 激活⼯作簿(Activate⽅法)使⽤Activate⽅法激活指定的⼯作簿,例如:
Workbooks("MyWorkbook").Activate
[应⽤5] 获得当前打开的⼯作簿数(Count属性)使⽤Workbooks集合对象的Count属性来获得当前打开的⼯作簿数,例如:
Workbooks.Count
[应⽤6] 判断⼯作簿是否是只读的(ReadOnly属性)
如果⼯作簿以只读⽅式打开,那么ReadOnly属性的值为True。
[应⽤7] 获得⼯作簿的路径和名称(Name属性、FullName属性、Path属性、CodeName属性)
使⽤Workbook对象的Name属性可以返回⼯作簿的名称。例如,下⾯的函数可以返回当前⼯作簿的名称:
Function MyName() As String MyName = ThisWorkbook.Name End Function
使⽤Workbook对象的FullName属性可以返回⼯作簿的路径和名称。例如,下⾯的函数可以返回当前⼯作簿的路径和名称:
Function MyName() As String MyName = ThisWorkbook.Name End Function
使⽤Workbook对象的Path属性可以返回⼯作簿⽂件的路径。使⽤Workbook对象的CodeName属性返回⼯作簿对象的代码名。
上述属性均为只读属性。
应⽤⽰例5:⼀些⼯作簿通⽤属性⽰例
Sub testGeneralWorkbookInfo() MsgBox "本⼯作簿的名称为" & ActiveWorkbook.Name MsgBox "本⼯作簿带完整路径的名称为" & ActiveWorkbook.FullName MsgBox "本⼯作簿对象的代码名为" & ActiveWorkbook.CodeName MsgBox "本⼯作簿的[应⽤8] 保存⼯作簿(Save⽅法)
使⽤Save⽅法保存对⼯作簿所作的所有更改,其语法为:
Workbook.Save
应⽤⽰例6:保存已存在的所有⼯作簿
Sub SaveAllWorkbooks() Dim wbk As Workbook For Each wbk In Workbooks If wbk.Path <> "" Then wbk.Save Next wbk End Sub
如果某⼯作簿的Path属性值为空,则表明该⼯作簿为新建⼯作簿,还没有保存。⽽本过程仅保存所有已存在的(即已经保存过的)⼯作簿。
[应⽤9] 保存⼯作簿(SaveAs⽅法)
使⽤SaveAs⽅法在指定的⽂件中保存对⼯作簿所做的更改,其语法为:
Workbook.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
所有参数均为可选参数。其中参数FileName指定要保存⽂件的⽂件名,可以包含完整的路径,如果不指定路径,Excel将⽂件保存到当前⽂件夹中。参数FileFormat指定保存⽂
件时使⽤的⽂件格式。如果⽂件夹中存在相同名称的⼯作簿,则提⽰是否替换原⼯作簿。
参数Password⽤于指定⽂件的保护密码,是⼀个区分⼤⼩写的字符串(最长不超过 15 个字符)。参数WriteResPassword指定⽂件的写保护密码,如果⽂件保存时带有密码,
但打开⽂件时没有输⼊密码,则该⽂件以只读⽅式打开。
将参数ReadOnlyRecommended设置为True,则在打开⽂件时显⽰⼀条消息,提⽰该⽂件以只读⽅式打开。将参数CreateBackup设置为True,以创建⼀个备份⽂件。
参数AccessMode和参数ConflictResolution⽤来解决访问和冲突问题。
将参数AddToMru设置为True,以添加⼯作簿到最近使⽤的⽂件列表中。默认值为False。
应⽤⽰例7:创建新⼯作簿并保存
Sub AddSaveAsNewWorkbook() Dim Wk As Workbook Set Wk = Workbooks.Add Application.DisplayAlerts = False Wk.SaveAs Filename:="D:SalesData.xlsx"End Sub
这⾥使⽤了Add⽅法和SaveAs⽅法,添加⼀个新⼯作簿并将该⼯作簿以⽂件名SalesData.xlsx保存在D盘中。其中,语句Application.DisplayAlerts = False表⽰禁⽌弹出警告对话
框。
应⽤⽰例8:另存已有的⼯作簿
Sub SaveWorkbook2() Dim oldName As String, newName As String Dim folderName As String, fname As String oldName = ActiveWorkbook.Name newName = "new" & oldName MsgBox "将<" & oldName & ">以<" & newName & ">的名称保存"
上述代码将当前⼯作簿以⼀个新名(即new加原名)保存在默认⽂件夹中。
应⽤⽰例9:备份⼯作簿
Sub CreateBak1() MsgBox "保存⼯作簿并建⽴备份⼯作簿" ActiveWorkbook.SaveAs CreateBackup:=True End Sub
上述代码在当前⽂件夹中建⽴⼯作簿的备份。
Sub CreateBak2() MsgBox "保存⼯作簿时,若已建⽴了备份,则将出现包含True的信息框,否则出现False." MsgBox ActiveWorkbook.CreateBackup End Sub
[应⽤10] 保存⼯作簿副本(SaveCopyAs⽅法)
使⽤SaveCopyAs⽅法保存指定⼯作簿的⼀份副本,但不会修改已经打开的⼯作簿,其语法为:
Workbook.SaveCopyAs(Filename)
参数Filename⽤来指定副本的⽂件名。
应⽤⽰例10:使⽤与活动⼯作簿相同的名称但后缀名为.bak来备份⼯作簿
Sub SaveWorkbookBackup() Dim awb As Workbook, BackupFileName As String, i As Integer, OK As Boolean If TypeName(ActiveWorkbook) = "Nothing"Then Exit Sub Set awb = ActiveWorkbook If awb.Path = "" Then Application.Dialogs(xlDia
在当前⼯作簿中运⾏本⽰例代码后,将以与⼯作簿相同的名称但后缀名为.bak备份⼯作簿,且该备份与当前⼯作簿在同⼀⽂件夹中。
应⽤⽰例11:保存当前⼯作簿的副本到其它位置来备份⼯作簿
Sub SaveWorkbookBackupToFloppyD() Dim awb As Workbook, BackupFileName As String, i As Integer, OK As Boolean If TypeName(ActiveWorkbook) = "Nothing" Then Exit Sub Set awb = ActiveWorkbook If awb.Path = "" Then Application.D 上述程序将当前⼯作簿进⾏复制并以与当前⼯作簿相同的名称保存在D盘中。其中,使⽤了Kill⽅法来删除已存在的⼯作簿。
[应⽤11] 判断⼯作簿是否发⽣变化(Saved属性)
如果⼯作簿⾃上次保存以来没有发⽣任何变化,那么该⼯作簿的Saved属性值为True。由于该属性值

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。