excel_vba_编程教程(完整版)-第52部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
技巧9…3 SendKeys语句对格敏感
当你使用SendKeys语句发送按键时,你一定要牢记区分字符的大小格。因此,要发送组合键Ctrl+d
的话,你必须使用^d,而发送Ctrl+Shift+D的话,则必须使用字符串:^+d
在本章前期,你学习了。cpl文件启动多种控制面板的图标。你现在要创建的VBA过程目的是要定位
你硬盘上所有扩展名为。cpl的文件。
1。 使用立即窗口来启动资源管理器:
Shell “Explorer。”
“我的文档”图标将出现在屏幕下方的任务栏上。
2。 在当前工程里插入新模块并且重命名为SendKeysStatement
3。 输入过程FindCPLFiles,如下所示:
Sub FindCPLFiles()
' The keystrokes are for Windows 2000
AppActivate 〃My Documents〃
' activate the Search window 激活搜索窗口
SendKeys 〃{F3}〃; True
' move the pointer to the Search for files将光标移到搜索文件
' and folders named text box 和文件夹(名称在文本框里)
SendKeys 〃%m〃; True
' type in the search string 输入要搜索的字符串
SendKeys 〃*。cpl〃; True
' move to the Look in drop down box 焦点移到下拉框
SendKeys 〃{Tab}{Tab}〃; True
' change to the root directory 更改根目录
SendKeys 〃C:”; True
' execute the Search 执行搜索
SendKeys 〃%s〃; True
End Sub
4。 切换到Excel应用程序窗口并且运行过程FindCPLFiles(使用Alt+F8打开宏对话框,选择过程名
称,再点击运行)。
上面过程的第一条语句使用AppActivate语句(参见前面章节)来激活已经打开的应用程序,还记
得你在立即窗口里使用Shell语句激活了资源管理器吗?剩余的语句发送一些必要的按键到活动应
用程序。本过程的结果是扩展名为。cpl的控制面板文件的搜索结果列表。你也可以使用一个
SendKeys语句来发送所有必须的按键(参见下面的例子),然而,一步一步发送按键更容易理解程
序。
Sub FindCPLFiles2()
AppActivate 〃My Documents〃
SendKeys 〃{F3}% m*。cpl{Tab}{Tab}C:%s〃; True
End Sub
4。控制应用程序的其它方法
尽管你可以使用SendKeys语句来传递命令给其它应用程序,但是你还是必须要求助于其它方法来获
得对该应用程序的充分控制。有两种标准方法可以供应用程序和另外一种应用程序交流。最新的方
171
… 页面 188…
法,被称为自动控制,它允许你访问和操纵另一种应用程序的对象。你可以通过自动控制编写VBA
过程,通过引用其它应用程序的对象、属性和方法来控制其它应用程序。在本章接下来的章节里,
你将学习如何通过自动控制来控制其它应用程序。称为DDE(动态数据交换)的老数据交换技术是
允许你在两个应用程序之间动态发送数据的协议,它通过创建一个特殊的通道来发送和结束信息。
DDE非常慢,使用困难,只有当你需要与一个不支持自动控制的老应用程序交流时,才需要使用DDE。
5。了解自动控制
当和另外一个应用程序交流时,你可能需要更多的功能,而不只是激活它来发送按键。例如,你可
能需要在该应用程序里创建和操纵对象,你可以在Excel电子表格力插入整个Word文档。因为Excel
和Word都支持自动控制,所以,你可以在Excel里编写一个VBA过程在操作Word对象,比如文档或者
段落。支持自动控制的应用程序称为自动控制服务器(Automation servers)或者自动控制对象
(Automation objects)。
能够操作服务器对象的应用程序称为自动控制控件。有些应用程序只能是服务器或者控件,而其它
的则既可以是服务器也可以是控件。Microsoft Office 2000和2002都可以作为自动控制服务器和
控件。自动控制控件可以是安装在你电脑上的各种ActiveX控件,你将在下一章里学习这些对象。
6。了解链接和嵌入
在你学习如何使用自动控制从VBA过程控制其它应用程序之前,我们来看一看如何手动链接和插入
对象。人们熟知的OLE,对象链接和嵌入,允许你创建组合文档。组合文档包含其它应用程序创建
的对象。例如,如果你要在Excel里嵌入一个Word文档的话,Excel只要知道创建该对象需要用到的
应用程序名称,以及该对象在屏幕上显示的方法。组合文档有链接或者对象嵌入产生。当你使用手
动方法来嵌入对象时,你首先要在一个应用程序里复制它,再粘贴到另一个应用程序里。链接对象
和嵌入对象的主要区别是对象储存和更新的方式。我们来试验一下:
1。 激活Word并打开任意一个文档
2。 选择和复制任意一段文本
3。 在Excel工作表里,使用下述四种方法之一将复制的文本进行粘贴:
* 粘贴为文本(选择编辑|粘贴)。复制的文本就会出现在活动单元格(见图9…2,单元格
A2)
* 粘贴为嵌入对象(选择编辑|选择性粘贴,点击“粘贴选项”按钮,并且在清单里选择
“Microsoft Word Document 对象”。)粘贴的文本将作为一个嵌入的对象(见图9…2,单
元格A5)。该嵌入的对象成为了目的文件的一部分。因为该嵌入的对象没有和原始数据链
接,所以该信息是静态的。当文件源中的数据改变时,该嵌入的对象不会被更新。如果要
更改嵌入的数据,你就必须双击它,这样就会打开该对象在源程序里编辑它。当然,该源
程序必须已经安装在你的电脑上了。当你嵌入对象时,所有的数据都会存储在目的文件里,
这会导致文件大小显著增大。注意,当你嵌入一个对象后,Excel的编辑栏里将显示:
=EMBED(〃Word。Document。8〃;〃〃)
* 粘贴为链接对象(选择编辑|选择性粘贴,点击“粘贴链接”选项,然后在列表里选择
“Microsoft Word Document 对象”)。虽然目的文件显示了所有的数据,但是它仅仅储存
了该数据的地址。当你双击该链接的对象时(见图9…2,单元格A9),原应用程序就会被启
动。链接对象是一种动态的操作,这意味着当源文件里的数据改变时,链接的数据就会自
动更新。因为目的文件只包含对象如何与源文件链接的信息,所以,对象链接并不会增加
目的文件的大小。下面的公式是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数据类型声明对象变量,请考虑后期绑定。后期绑定和早
期绑定的主要区别是你如何声明你对象