按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
过程使用了一个叫做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()
Dim objOut As Outlook。Application
Dim objNspc As NameSpace
Dim objItem As ContactItem
Dim Headings As Variant
Dim i As Integer ' array element 数组成员
Dim r As Integer ' row index 行号
r = 2
Set objOut = New Outlook。Application
Set objNspc = objOut。GetNamespace(〃MAPI〃)
Headings = Array(〃Full Name〃; 〃Street〃; 〃City〃; _
〃State〃; 〃Zip Code〃; 〃E…Mail〃)
Sheets(1)。Activate
For Each cell In Range(〃A1:F1〃)
cell。FormulaR1C1 = Headings(i)
i = i + 1
Next
For Each objItem In objNspc。GetDefaultFolder _
(olFolderContacts)。Items
With ActiveSheet 。Cells(r; 1)。Value = objItem。FullName
。Cells(r; 2)。Value = objItem。BusinessAddress
。Cells(r; 3)。Value = objItem。BusinessAddressCity
。Cells(r; 4)。Value = objItem。BusinessAddressState
。Cells(r; 5)。Value = objItem。BusinessAddressPostalCode
。Cells(r; 6)。Value = objItem。Email1Address
End With
r = r + 1
Next objItem
Set objItem = Nothing
Set objNspc = Nothing
Set objOut = Nothing
End Sub
过程GetContacts开始声明一个叫做objOut的对象变量来存储到Outlook应用程序的引用,该变量定
义为明确的对象类型(Outlook。Application),因此VBA使用早期绑定。
注意在该过程里,我们使用关键字New(在前面部分由讨论)来创建一个新的Outlook应用程序对象
示例,返回引用到该示例,并且将该引用赋予声明的变量objOut。
为了访问Outlook里的联系项目,你也需要声明对象变量来引用Outlook的NameSpace和
ContactItem。NameSpace对象代表了储存为MAPI(信息应用程序编程界面)的信息。NameSpace对
180
… 页面 197…
象包含了文件夹(联系地址,日志,任务,等等),每个文件夹由一次有它们的项目。一个项目是
Outlook的一个详细数据,例如邮件信息,或者联系地址。
使用For…Each…Next循环在工作表里写入列标题之后,过程使用另外一个For…Each…Next循环来
遍历联系地址文件夹中的项目。GetDefaultFolde方法返回一个联系地址文件夹的对象变量,该方
法有一个参数,该常量代表了你要访问的文件夹。当所有的联系地址都被写入Excel工作表后,该
过程释放所有对象变量,将它们设定为Nothing。
注意,当你运行过程GetContacts时,你可能会看到一个警告信息,告诉你程序试图访问电子邮件
地址,点击确定允许操作。
20。接下来……
在本章,你学习了如何从VBA程序里启动、激活和控制其它应用程序(Word和Outlook)。你学习了
如何使用SendKeys方法发送按键到另一个应用程序。你也学习了如何手动和编程地添加链接和嵌入
对象。最后,你使用自动控制从Excel里创建新的Word文档,以及后来访问该文档并设置一些格式。
你也学习了如何从Outlook里获取联系地址并放置到Excel工作表中。你使用两个新函数
CreateObject和GetObject扩展了你的VBA知识。你也学习了如何以及何时使用关键字New。请在第
十五章里学习如何从Excel里控制Microsoft Access。
在下一章,你将学习如何通过自定义窗体从用户处收集更多的数据。
第十章 对话框和自定义窗体
在第四