目的文件的大小。下面的公式是Excel用来链接对象的:
=Word。Document。8|'C:Documents and Settingstj8147My
DocumentsTigerVBExcel2002_ProgrammingChineseExcel2002VBA_Ch9。doc'!'!OLE_
LINK2'(译者:由于文件存储位置不同,本节的翻译可能和你的情况不一样,请注意分辨)
* 粘贴为超链接(选择粘贴|超链接译者:应该为“编辑”|“粘贴为超链接”)粘贴的数
据在工作表里显示为带下划线、有颜色的文本(见图9…2,单元格A11)。点击该超链接,
你可以快速地激活该源文件。
172
… 页面 189…
图9…2 示范链接和嵌入
7。使用 VBA 进行链接和嵌入
过程InsertLetter示范了如何使用程序在Excel嵌入一个Word文档。用你自己的文件名称代替引用
“C:Hello。doc”。过程InsertLetter使用AddOLEObject方法,该方法创建一个OLE对象,并且返回
一个对表该新OLE对象的Shape对象。在VB在线帮助里面,你可以找到AddOLEObject方法可用的其它
参数。
1。 在当前工程里面插入一新模块,并重命名为OLE
2。 输入过程InsertLetter,如下所示:
Sub InsertLetter()
Workbooks。Add
ActiveSheet。Shapes。AddOLEObject FileName:=〃C:Hello。doc〃
End Sub
上面的过程打开一个新工作簿,然后嵌入该指定的Word文档。要链接一个文档的话,你就必须明确
另外一个参数Link,如下所示:
ActiveSheet。Shapes。AddOLEObject _
FileName:=〃C:Hello。doc〃; Link:=True
技巧9…4 对象链接和嵌入
当你不得不做出决定是否使用嵌入还是链接对象时,只要有下列之一的条件,那么就使用嵌入:
* 你不在乎文档大小,或者你有足够的硬盘空间和内存来处理大文件
* 你再也不会在其它复合文档里使用源文件或者源文本
* 你想要将该文档通过电子邮件或者磁盘发送给别人,并且确保他们能够顺利地读取数
据。
(译者:本人也倾向于使用嵌入,因为链接经常会问你是否要更新链接,而且,很多人经常会忘记
发送源文件给别人。)
173
… 页面 190…
8 和自动控制
在自动控制后面的驱动力量是组件对象模型(),它决定了服务器应用程序创建对象的规则,也
明确服务器和控制应用程序在使用这些对象时必须遵循的方法。标准包含作为自动控制界面
(Automation interfaces)可用的函数集合。
当服务器应用程序创建一个对象是,它会自动地制作一个和它一起可用的界面。该界面包括该对象
可识别的属性、方法和事件。控制应用程序不需要为了控制该对象去了解它的内部结构,只需要知
道如何操作服务器应用程序制作的对象界面。
9。了解绑定
对于控制应用程序与自动控制对象(服务器)来说,你必须将你的VBA过程中可用的对象和服务器
实际的自动控制对象联系起来,这个过程就叫做绑定。这里有两种类型的绑定:后期绑定和早期绑
定。你对绑定的选择对你的应用程序表现影响很大。
10。后期绑定
当你声明一个变量 As Object 或者As Vaiant时,VB使用的是后期绑定。后期绑定也叫运行绑定。
简单地说,后期绑定意味着VB在设计时不会将你的对象变量和自动控制对象联系起来,而是要等到
你实际运行该过程时才联系起来。因为As Object或者As Variant的声明在本质上是非常普通的,
所以,VB在汇编时不能决定你变量指向的对象真正具有你的VBA过程使用的属性和方法。
下面的声明导致对指定对象的后期绑定:
Dim mydoc As Object
后期绑定的优势是所有的自动控制对象都知道如何使用。
后期绑定的劣势是对内置常量不支持。因为在设计时,VB并不知道你的对象指向的类型库,所以,
你必须通过在应用程序文档里查询数值在你的代码里定义常量。同样,在运行时询问应用程序将放
慢你程序的执行。
注意:后期绑定使得在另外一个应用程序的类型库里访问对象称为可能,而不需要首先建立对该对
象库的引用。如果你不肯定你的用户是否在他们的机子上安装了要指向的类型库,那么就使用后期
绑定。
下面的过程示范如何使用后期绑定来打印Word文档。
Sub PrintWordDoc()
Dim objWord As Object
Set objWord = CreateObject(〃Word。Application〃)
With objWord
。Visible = True
。Documents。Open 〃C:Hello。doc〃
。Options。PrintBackground = False
。ActiveDocument。PrintOut
End With
objWord。Documents。Close
objWord。Quit
Set objWord = Nothing
End Sub
技巧9…5 这是什么类型的绑定?
无论何时你使用常用的Object或Variant数据类型声明对象变量,请考虑后期绑定。后期绑定和早
期绑定的主要区别是你如何声明你对象变量。
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函数创建该特定自动控制对象的新示例。然而,一些应用程序注册为一种叫做
“单一示例”的应用程序了,这就是说你不能同时运行一个以上的�