“单一示例”的应用程序了,这就是说你不能同时运行一个以上的示例。Microsoft Word和
PowerPoint就是这种单一示例的应用程序,因此,如果Word或者PowerPoint已经在运行,那么
176
… 页面 193…
CreateObject函数就会直接引用到在运行的示例去,而不会再创建一个新的示例。
15。使用自动控制创建一个新的 Word 文档
我们来看看你如何将在前面章节学习到的关于绑定的知识应用到现实生活中的例子里。你也许有时
需要从Excel直接通过程序打开一个Word文档,并且往里面写入数据,下面的例子使用了早期绑定。
1。 在当前工程里插入新模块,并重命名为Automation
2。 在工程浏览器里,选择当前工程,并且选择“工具”|“引用”
3。 如果可用引用列表里的Microsoft Word 9。0 Object Library或者Microsoft Word 10。0 Object
Library没有被勾选,那么找到它们并勾选上,点击确定退出。
4。 输入下面过程WriteLetter:
Sub WriteLetter()
Dim wordAppl As Word。Application
Application。StatusBar = 〃Creating Word Application Object。。。〃
Set wordAppl = CreateObject(〃Word。Application〃)
With wordAppl
。Visible = True
Application。StatusBar = 〃Creating a new document。。。〃
。Documents。Add
。ActiveDocument。Paragraphs(1)。Range。InsertBefore 〃Invitation〃
Application。StatusBar = 〃Saving document。。。〃
。ActiveDocument。SaveAs 〃C:Invite。doc〃
Application。StatusBar = 〃Exiting Word。。。〃
。Quit
End With
Set wordAppl = Nothing
Application。StatusBar = False
End Sub
5。 切换到Excel应用程序窗口,并选择“工具”|“宏”|“宏”,找到过程WriteLetter并点击运行
过程WriteLetter开始时声明对象变量为特定的对象类型(Word。Application)。回想这种生命(早
期报道)要求你建立对Word对象库的引用(本章的前面讲过)。CreateObject函数返回的自动控制
对象赋值到一个叫做wordAppl的对象变量,因为由子弟控制启动的应用程序不会出现在屏幕上,所
以使用语句:
wordAppl。Visible = True
使启动的Word应用程序可见,这样你就可以观察VBA的工作情况。该过程里后面的语句打开一个新
文档(Add方法),并且在第一段输入文本(InsertBefore方法),将文档保存到硬盘(SaveAs方法),
以及关闭Word应用程序(Quit方法)。每条语句之前都有一条指令,将信息显示在Excel应用程序窗
口下面的状态栏上。当Word应用程序关闭后,指令:
Set wordAppl = Nothing
清除对象变量,收回该对象占用的内存。语句:
Application。StatusBar = False
将状态栏上的信息恢复为默认的“就绪”。
前面提到过,Word是单一示例(single…instance)应用程序,这意味着你不能同时运行一个以上
的Word示例,简单说,如果你没有启动Word,WriteLetter过程里面的CreateObject函数将会启动
Word,否则,它将会使用当前活动的Word示例。
16。使用 GetObject 函数
如果你确定自动控制对象以及存在并且已经打开,那么就考虑使用GetObject函数,如下所示:
GetObject('pathname''; class')
GetObject函数有两个参数,它们都是可选的。使用第一个参数来明确你要打开的文件名称,应该
提供完整的文件路径。如果你忽略该参数,那么不必须明确参数class,指明要使用的对象类型,
例如:
177
… 页面 194…
Excel。Application
Excel。Sheet
Excel。Chart
Excel。Range
Word。Application
Word。Document
PowerPoint。Application
在Invite。xls的基础上创建一个Excel对象,并且强制设置为Excel 5工作表,你可以使用下列声明:
‘ late binding 后期绑定
Dim excelObj As Object
Set excelObj = GetObject(〃C:Invite。xls〃; Excel。Sheet。5〃)
要设定对象变量为某个特定的Word文档的话,你可以使用:
‘early binding 早期绑定
Dim wordObj As Word。Application
Set wordObj = GetObject(〃C:Invite。doc〃)
如果要访问一个正在运行的Office应用程序对象,那么可以将第一个参数空出:
Dim excelObj As Object
Set excelObj = GetObject(; 〃Excel。Application〃)
当你调用不带第一个参数的GetObject函数时,它就会返回一个对该应用程序示例的引用,如果该
应用程序没有启动的话,就会产生错误。
17。打开存在的 Word 文档
下面的过程CenterText示范了GetObject函数的使用,访问Invite。doc文件。回想一下,该文件是
在本章前面的过程WriteLetter里创建的。过程CenterText会将指定Word文档里的第一段居中。该
过程使用了一个叫做DocExists的自定义函数来检查指定的文件是否存在。另外一个自定义函数
(IsRunning)检查Word是否已经在运行。基于上述检查结果,使用CreateObject或者GetObject
函数。如果出现错误,那么错误编号和错误描述将会显示出来。
Sub CenterText()
Dim wordDoc As Word。Document
Dim wordAppl As Word。Application
Dim mydoc As String
Dim myAppl As String
On Error GoTo ErrorHandler
mydoc = 〃C:Invite。doc〃
myAppl = 〃Word。Application〃
'first find out whether the specified document exists 首先查明该文档是否存在
If Not DocExists(mydoc) Then
MsgBox mydoc & 〃 does not exist。〃 & Chr(13) & Chr(13) _
& 〃Run the WriteLetter procedure to create 〃 & mydoc & 〃。〃
Exit Sub
End If
'now check if Word is running 现在检查Word是否正在运行
If Not IsRunning(myAppl) Then
MsgBox 〃Word is not running … will create a new instance of _
Word。 〃
Set wordAppl = CreateObject(〃Word。Application〃)
Set wordDoc = wordAppl。Documents。Open(mydoc)
Else
MsgBox 〃Word is running … will get the specified document。 〃
'bind the wordDoc variable to a specific Word document 将变量wordDoc绑定到
178
… 页面 195…
特定的Word文档
Set wordDoc = GetObject(mydoc)
End If
'center the 1st paragraph horizontally on page 将第一段水平居中
With wordDoc。Paragraphs(1)。Range
。ParagraphFormat。Alignment = wdAlignParagraphCenter
End With
wordDoc。Application。Quit
SaveChanges:=True
Set wordDoc = Nothing
Set wordAppl = Nothing
MsgBox 〃The document 〃 & mydoc & 〃 was reformatted。〃
Exit Sub
ErrorHandler:
MsgBox Err。Description; vbCritical; 〃Error: 〃 & Err。Number
End Sub
Function DocExists(ByVal mydoc As String) As Boolean
On Error Resume Next
If Dir(mydoc) 《 》 〃〃 Then
DocExists = True
Else
DocExists = False
End If
End Function
Function IsRunning(ByVal myAppl As String) As Boolean
Dim applRef As Object
On Error Resume Next
Set applRef = GetObject(; myAppl)
If Err。Number = 429 Then
IsRunning = False
Else
IsRunning = True
End If
'clear object variable 清除对象变量内容
Set applRef = Nothing
End Function
18。使用关键字 New
除了使用CreateObject函数来引用到其它的应用程序之外,你可以使用关键字New。关键字New告诉
VB创建一个对象的新示例,返回到该示例的引用,以及将引用赋予该对象变量。例如,你可以按下
面的方式使用关键字New:
Dim objWord As Word。Application
Set objWord = New Word。Application
Dim objAccess As Access。Application
Set objAccess = New Access。Application
使用关键字New声明的对象变量总是早期绑定的。使用关键字New比使用CreateObject函数更高效。
你每次使用关键字New的时候,VB就会创建应用程序的一个新示例。如果该应用程序以及运行,你
就不需要打开另外一个示例,你应该使用GetObject函数。关键字New也可以用来在声明对象变量的
时候,同时创建一个新的对象示例,例如:
Dim objWord As New Word。Application
179
… 页面 196…
注意,当你使用关键字New在Dim语句里声明对象变量的时候,你就不需要使用Set语句了。然而,
不建议使用这种创建对象变量的方法,因为当该对象变量真正被创建后,你就失去对它的控制了。
在声明中使用关键字New会导致创建对象,即使它没有被使用到。因此,如果你想要控制创建的对
象变量,那么总是使用下述语法声明你的对象变量吧:
Dim objWord As Word。Application
Set objWord = New Word。Application
Set语句可以进一步在你需要使用该对象的地方使用,接下来的章节将示范如何使用关键字New来创
建Microsoft Outlook的新示例,并且编写你的联系地址到Excel工作表中。
19。使用自动控制访问 Microsoft Outlook
要从Excel直接访问Outlook的对象模型的话,首先就要建立对Microsoft Outlook 10。0或者9。0
Object Library的引用。下面的程序例子将在Excel工作表里插入你Outlook里面的联系信息。
Sub GetContacts()