excel_vba_编程教程(完整版)-第53部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
期绑定的主要区别是你如何声明你对象变量。
11。早期绑定
当你声明对象变量为明确的对象类型时,VB使用的是早期绑定。早期绑定也熟知为汇编绑定。这意
味着VB在源代码转变为可执行代码时期,就将你的对象变量和自动控制对象联系起来了。常见的语
法如下所示:
Dim objectVariable As Application。ObjectType
174
… 页面 191…
在上面的语法中,Application是应用程序的名称,正如它出现在对象浏览器里的工程库下拉清单
里的样子(例如Word和Excel)。ObjectType是对象类型(例如应用程序,文档,工作簿,工作表)。
下面的声明导致早期绑定:
Dim mydoc As Word。Document
Dim mydoc As Excel。Worksheet
早期绑定让你能够充分利用VB编辑器上可用的许多调试工具。例如你可以使用对象浏览器查找外部
对象,属性和方法。VB的自动语法检测,自动列出成员以及自动显示快速信息(这些都在第二章里
有讨论)可以让你在编写代码时更快,更少出错。另外,早期绑定允许你使用内置常量作为方法和
属性设定的参数。因为这些常量在设计的时候在类型库里面就是可用的,所以你不需要定义它们。
这些非常方便的内置语法检测,智能特点和对内置常量的支持,在后期绑定里是不可用的。虽然使
用早期绑定的VBA过程执行得更快一些,但是一些非常老的视窗应用程序只能使用后期绑定。
注意:为了使用早期绑定,你必须首先建立对对象库的引用(参见接下来的章节)。当你确定你的
用户安装了引用的类型库时,就使用早期绑定。
12。建立到对象库的引用
如果你决定通过自动控制使用早期绑定连接到另外的应用程序的话,你首先就应该建立对包括你要
操作对象的对象库的引用。依照下面的步骤创建对Microsoft Word 对象库的引用:
1。 激活VB编辑器窗口
2。 在工程浏览器里选择当前工程,并且选择“工具”|“引用”
3。 在引用对话框里,选择“可使用的引用”列表框里面的应用程序名称。例如,点击Microsoft Word
9。0 Object Library或者 Microsoft Word 10。0 Object Library旁边的复选框(见图9…3)(译
者:这里引用的是Microsoft Word 11。0 Object Library)。拉下可用引用列表框的滚动条定位
该对象库,如果你已经安装了某个应用程序但是它的类型库在可用引用列表框里面没有出现的
话,那么你可以点击“浏览”按钮。
4。 点击确定按钮关闭引用对话框。
引用对话框列出了VBA工程可用的引用名称。没有使用的引用按字母顺序列出,勾选上了的引用按
优先顺序列出。例如,在Excel里,Microsoft Excel 10。0 Object Library比Microsoft Word 10。0
或者9。0 Object Library具有更高的优先顺序。当一个过程引用一个对象时,VB从引用对话框里列
出的库里按顺序搜索所有被引用的对象库。
图9…3 为了要操作其它应用程序的对象,你应该建立对该需要的对象库的引用
在建立了对所要求对象库的引用后,你就可以在对象浏览器里浏览该对象的属性和方法。
175
… 页面 192…
图9…4 建立了对Microsoft Word 11。0 Object Library的引用后(见图9…3),Microsoft Word的所
有对象,属性和方法都可以从Excel VBA工程里访问了。
13。创建自动控制对象
依照下列步骤,在你的VBA过程里创建一个自动控制对象:
* 使用Dim…As Object或者Dim…As Application。ObjectType子句声明对象变量(参见前面章节
里的后期和早期绑定使用主题)
* 如果你在使用早期绑定,那么使用引用对话框来建立对应用程序对象类型库的引用
* 如果自动控制对象不存在,那么使用CreateObject函数;如果自动控制对象已经存在的话,那
么就使用GetObject函数来建立对该对象的引用
* 使用关键字Set将CreateObject或者GetObject函数返回的对象赋值到对象变量
14。使用 CreateObject 函数
按照下面的语法,使用CreateObject函数从VBA过程里创建对自动控制对象的引用:
CreateObject(class)
参数class是你想要引用的应用程序的名称。该名称包含早先讨论的对象类类型(参见早期绑定部
分)。必须使用关键字Set将自动控制对象赋予对象变量,如下所示:
Set variable_name = CreateObject(class)
例如,使用自动控制对象来激活Word,你的VBA过程里需要包括下面的声明语句:
'early binding 早期绑定
Dim wordAppl As Word。Document
Set wordAppl = CreateObject(〃Word。Application〃)
或者
'late binding 后期绑定
Dim wordAppl As Object
Set wordAppl = CreateObject(〃Word。Application〃)
通常,CreateObject函数创建该特定自动控制对象的新示例。然而,一些应用程序注册为一种叫做
“单一示例”的应用程序了,这就是说你不能同时运行一个以上的示例。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 〃Wo