利用VBA控制其它应用程序.docx
《利用VBA控制其它应用程序.docx》由会员分享,可在线阅读,更多相关《利用VBA控制其它应用程序.docx(24页珍藏版)》请在冰豆网上搜索。
利用VBA控制其它应用程序
利用VBA控制其它应用程序
————————————————————————————————作者:
————————————————————————————————日期:
第九章利用VBA控制其它应用程序
作者:
JulittaKorol翻译:
TigerChenApr5’2005
你每天在办公室里或者家里在你的电脑上工作时,都要用到很多种应用程序。
要从你的硬盘或者软盘上查找某个文件的话,你就要打开视窗浏览器。
当你要设置系统时间或者更改屏幕外观的话,可以点击控制面板上的相应的图标。
如果你的电脑上安装了微软办公软件套餐的话,就可以使用Word创建各种各样的文件,并且依靠Excel进行所有的计算。
微软Access对于保存重要的数据表非常有用,而PowerPoint则有助于你使用声音和图片。
最后,微软Outlook使你易于保存你的联系、时间和约会并且分享给他人。
使用这些应用软件的时候,你经常要在他们之间切换,你可以使用键盘直接输入数据或者复制或移动数据。
这些操作——打开应用程序以及在它们之间传输数据时不需要手动操作的。
它们可以通过一些很有趣的VBA函数和指令来自动完成。
在本章,你将学习多种从VBA过程里打开应用程序的方法,并且找到如何使用称为自动化的技术直接从微软Excel直接控制其它应用程序。
启动应用程序
启动一个应用程序的方法不止一个,实际上,你至少可以使用五种方法手动打开某个程序:
通过“开始”|“程序”菜单,快捷键,“运行”命令,MS-DOS窗口,或者在视窗浏览器里双击可执行文件。
本节假设你对手动启动应用程序很熟悉,并且很想从Excel内部的VB编辑窗口试验其它启动应用程序的方法。
我们从最简单的开始吧——Shell函数。
该函数使你可以从VBA过程里直接打开任意程序。
假设你的过程必须打开视窗记事本,要打开记事本,你所有要做的就是在关键字Sub和EndSub之间加上一条语句,或者更好的方法是在立即窗口里输入下述语句,并且按下回车键:
Shell"notepad.exe",vbMaximizedFocus
你将立即看到结果。
在上面的语句里,“notepad.exe”是你要打开的程序的名称。
如果你担心程序找不到的话,那么该名称就应该包含完整的路径(启动器名称和文件夹名称)。
注意,程序名称用双引号括起来了。
Shell函数的第二个参数可以忽略。
该参数明确窗口形式(也就是当程序启动的时候,它如何显示在屏幕上的)。
在上面的例子里,记事本将显示为最大化的窗口。
如果没有明确窗口形式,那么程序就会被最小化(参见表9-1)。
窗口形式常数
值
窗口显示情况
vbHide
0
窗口被隐藏
vbNormalFocus
1
普通大小,并带焦点
vbMinimizedFocus(默认设置)
2
最小化,并带焦点(这是缺省设置)
vbMaximizedFocus
3
最大化,并带焦点
vbNormalNoFocus
4
普通大小,并失去焦点
vbMinimizedNoFocus
6
最小化,并失去焦点
如果Shell函数能够启动某个可执行文件,那么它就会返回一个叫做任务ID的号码。
该号码是指示应用程序启动的唯一号码。
如果Shell函数不成功的话(也就是说某应用程序不能打开),VB就会产生一错误。
如果你要使用Shell函数启动的应用程序的话,就不要在Shell函数后面输入任何语句。
Shell函数启动程序是不同时的,意思是说VB启动Shell函数指定的应用程序,并且,VB在启动程序后,立即就回到过程里面去继续剩余的指令(因此,你没有机会立即使用该应用程序)。
你如果使用Shell函数来启动控制面板呢?
1.打开一新工作簿,保存为Chap09.xls
2.在VB编辑器窗口,插入新模块
3.重新命名工程为WorkWApplets,模块名为ShellFunction
4.输入下面显示的过程StartPanel:
SubStartPanel()
Shell"Control.exe",vbNormalFocus
EndSub
控制面板里面有很多图标,每个图标执行一个或者多个任务。
众所周知,在每个图标后面都有一个程序的,当用户双击图标或者用箭头选择该图标然后按下Enter键,该程序都会被激活。
作为一个规律,你总是可以通过查看某个图标的属相来检查什么文件名驱动某个图标。
不幸的是,控制面板里面的图标的属性选择都被禁止了。
然后,你可以通过创建一个到该图标的快捷键来查找控制面板里图标文件。
例如,在你创建一个更改电脑原始设置的过程之前,我们来找出激活该图标的文件名称。
1.从“开始”菜单里选择“设置”,然后选择“控制面板”(在WindowsXP开始菜单里可以直接看到“控制面板”)
2.在控制面板窗口里,右键单击“初始选项”图标,并且从快捷菜单中选择创建快捷键
3.点击确定,将快捷键放在桌面上
4.关闭控制面板窗口
5.返回桌面,在初始选项的快捷键上单击右键,然后选择属性
6.在属性窗口,点击快捷键页,然后点击更改图标按钮
图9-1每个控制面板里的图标都有一个后缀名为.cpl的文件
7.写下.cpl文件名称(ControlPanelLibrary)或者动态链接库文件(.dll)并关闭该练习中开启的所有窗口
表9-2激活控制面板图标的一些文件示例
控制面板图标
.cpl或者.dll文件
电话和调制解调器选项
TELEPHON.CPL或MODEM.CPL
添加/删除程序
APPWIZ.CPL
网络和拨号连接
NETCPL.CPL或NETSHELL.DLL
32-BitODBC
ODBCCP32.CPL
系统
SYSDM.CPL
邮件
MLCFG32.CPL
用户和密码
PASSWORD.CPL或NETPLWIZ.DLL
日期/时间
TIMEDATE.CPL
区域选项
INTL.CPL
Internet选项
INETCPL.CPL
声音和多媒体属性
MMSYS.CPL
显示
DESK.CPL
鼠标
MAIN.CPL
下面的国产ChangeSettings示范如何使用Shell函数来启动控制面板的初始设置图标。
注意Shell函数的参数必须写在括号里,如果你后面需要在你的程序里使用它返回值的话。
1.在当前模块里输入过程ChangeSettings,如下所示:
SubChangeSettings()
DimnrTask
nrTask=Shell("Control.exeintl.cpl",vbMinimizedFocus)
Debug.PrintnrTask
EndSub
2.运行几次过程ChangeSettings,每次从表9-2里列出的清单里提供一个不同的.cpl文件。
你可能需要将程序改为:
SubChangeSettings2()
DimnrTask
DimiconFileAsString
iconFile=InputBox("EnterthenameoftheCPLorDLLfile:
")
nrTask=Shell("Control.exe"&iconFile,vbMinimizedFocus)
Debug.PrintnrTask
EndSub
如果你要启动的程序是微软应用程序,那么除了使用Shell函数外,你还可以很方便地使用VB的方法ActivateMicrosoftApp来实现。
该方法在微软Excel应用程序的对象里是可用的,例如,要从立即窗口启动PowerPoint的话,你所有要做的事情就是输入下面的指令并且按下Enter:
Application.ActivateMicrosoftAppxlMicrosoftPowerPoint
注意ActivateMicrosoftApp方法要求一个常量来指定要启动的程序。
如果PowerPoint没有打开的话,上面的过程就会打开PowerPoint,但是如果该程序已经打开的话,该指令不会再打开一个新的PowerPoint界面,只是简单的激活已经在运行的应用程序。
你可以结合ActivateMicrosoftApp方法使用下列常量,常量的名称指名应用程序名称。
应用程序名称
常量
Access
xlMicrosoftAccess
FoxPro
xlMicrosoftFoxPro
Mail
xlMicrosoftMail
PowerPoint
xlMicrosoftPowerPoint
Project
xlMicrosoftProject
Schedule
xlMicrosoftSchedulePlus
Word
xlMicrosoftWord
在应用程序之间切换
因为用户可以同时在Windows环境下使用多个应用程序,所以你的VBA过程必须要知道如何在打开的程序之间切换。
假设除了Excel之外,你还打开了另外两种应用程序:
Word和Explorer。
你可以按照下面的语法使用AppActivate语句来激活已经打开的程序:
AppActivatetitle[,wait]
只有标题参数是必须的,这是应用程序的名称,正如它显示在应用程序窗口的标题栏那样,或者它也可以是Shell函数返回的任务ID号码。
注意,参数title要跟每个正运行的应用程序的标题字符串进行对比,如果没有精确的匹配,那么任何标题字符串里前面的字符和参数title一致的应用程序就会被激活。
(译者:
例如,你要激活Excel,那么title参数应该是“MicrosoftExcel”,如果你写的是“Microsoft”,那么激活的就也可能是Word,PowerPoint……)。
第二个参数wait是可选的,它是个布尔值(True或False),明确VB什么时候激活应用程序。
如果在这里是False的话,该应用程序就立即会被激活,甚至被调应用程序并没有焦点。
如果在wait参数处放置True的话,那么被调的应用程序就会等到它有了焦点,然后才会激活该应用程序。
例如,要激活Word,你就得输入下列语句:
AppActivate“MicrosoftWord”
注意,应用程序名称用双引号引用起来。
你也可以使用Shell函数返回的数值作为语句AppActivate的参数:
‘runMicrosoftWord运行Word应用程序
ReturnValue=Shell("C:
\MicrosoftOffice\Office\Word.exe",1)
‘activateMicrosoftWord激活Word
AppActivateReturnValue
语句AppActivate用来在应用程序之间切换,所以要求这些程序已经在运行。
该语句仅仅改变焦点,指定的应用程序变为当前活动的窗口。
AppActivate语句不会启动任何应用程序,参见下一章节的过程FindCPLFiles,这也是使用该语句的一个例子。
我们来练习一下最近介绍的几个VBA语句:
1.通过在立即窗口里输入下列VBA语句来打开资源管理器:
Shell"Explorer"
按下回车键后,被请求的应用程序就被打开了,带有“我的文档”文件夹的图标就会出现在任务栏上。
2.在立即窗口里输入下列代码:
AppActivate"MyDocuments"
按下回车键后,焦点就会移至我的文档窗口。
控制其它应用程序
既然你已经知道了如何使用VBA语句来启动一个程序,以及在应用程序之间切换,那么我们来看看一个应用程序是如何与另外一个应用程序交流的。
对于一个应用程序来说,要控制另一个应用程序的最简单的方式就是使用SendKeys语句。
该语句允许你将许多的按键发送到活动应用程序窗口,你可以发送一个或组合键并且得到直接使用键盘的同样效果。
SendKeys语句如下所示:
SendKeysstring[,wait]
这个必须的参数string是你要发送到活动应用程序窗口的键或组合键,例如,使用下列指令来发送字母“f”键:
SendKeys"f"
要发送组合键Alt+f,使用:
SendKeys"%f"
百分符号(%)是表示Alt键的字符串。
要发送例如Shift+Tab的组合键的话,那么就要使用下面的语句:
SendKeys"+{TAB}"
加号(+)表示Shift键。
要发送其它键或者其它组合键的话,请参见表9-3列出的相应字符串。
技巧9-1SendKeys和其它应用程序
你只能发送按键到那些为微软视窗操作系统设置的应用程序。
技巧9-2SendKeys和被保护的字符
有些字符在和SendKeys语句一起使用时具有特殊的意义,它们是:
加号(+),脱字符号(^),符合(~)和括号()。
要发送这些字符到另一个应用程序的话,就必须将它们用打括号{}括起来。
要发送打括号时,则需要输入{{}和{}}
SendKeys语句的第二个参数是可选的,wait是个逻辑值True或者False。
如果是False(缺省),那么VB在发送按键后立即返回过程,如果为True,那么VB只有在发送的按键执行后才能返回到过程。
如果要发送一个表格9-3里面没有列出的字符的话,那么记住这些代码必须用引号括起来,例如:
SendKeys“{BACKSPACE}”
表9-3SendKeys语句里使用的按键代码
键
代码
键
代码
空格键
{BACKSPACE}
滚动锁定
{SCROLLLOCK}
{BS}
Tab
{TAB}
{BKSP}
向上箭头
{UP}
Break键
{BREAK}
F1
{F1}
大写锁定键
{CAPSLOCK}
F2
{F2}
删除键
{DELETE}
F3
{F3}
{DEL}
F4
{F4}
向下箭头
{DOWN}
F5
{F5}
End键
{END}
F6
{F6}
回车键
{ENTER}
F7
{F7}
~
F8
{F8}
Esc键
{ESC}
F9
{F9}
帮助键
{HELP}
F10
{F10}
Home键
{HOME}
F11
{F11}
插入键
{INSERT}
F12
{F12}
{INS}
F13
{F13}
向左箭头
{LEFT}
F14
{F14}
数字锁定键
{NUMLOCK}
F15
{F15}
向下翻页键
{PGDN}
F16
{F16}
向上翻页键
{PGUP}
Shift
+
屏幕打印键
{PRTSC}
Ctrl
^
向右箭头
{RIGHT}
Alt
%
技巧9-3SendKeys语句对格敏感
当你使用SendKeys语句发送按键时,你一定要牢记区分字符的大小格。
因此,要发送组合键Ctrl+d的话,你必须使用^d,而发送Ctrl+Shift+D的话,则必须使用字符串:
^+d
在本章前期,你学习了.cpl文件启动多种控制面板的图标。
你现在要创建的VBA过程目的是要定位你硬盘上所有扩展名为.cpl的文件。
1.使用立即窗口来启动资源管理器:
Shell“Explorer.”
“我的文档”图标将出现在屏幕下方的任务栏上。
2.在当前工程里插入新模块并且重命名为SendKeysStatement
3.输入过程FindCPLFiles,如下所示:
SubFindCPLFiles()
'ThekeystrokesareforWindows2000
AppActivate"MyDocuments"
'activatetheSearchwindow激活搜索窗口
SendKeys"{F3}",True
'movethepointertotheSearchforfiles将光标移到搜索文件
'andfoldersnamedtextbox和文件夹(名称在文本框里)
SendKeys"%m",True
'typeinthesearchstring输入要搜索的字符串
SendKeys"*.cpl",True
'movetotheLookindropdownbox焦点移到下拉框
SendKeys"{Tab}{Tab}",True
'changetotherootdirectory更改根目录
SendKeys"C:
\",True
'executetheSearch执行搜索
SendKeys"%s",True
EndSub
4.切换到Excel应用程序窗口并且运行过程FindCPLFiles(使用Alt+F8打开宏对话框,选择过程名称,再点击运行)。
上面过程的第一条语句使用AppActivate语句(参见前面章节)来激活已经打开的应用程序,还记得你在立即窗口里使用Shell语句激活了资源管理器吗?
剩余的语句发送一些必要的按键到活动应用程序。
本过程的结果是扩展名为.cpl的控制面板文件的搜索结果列表。
你也可以使用一个SendKeys语句来发送所有必须的按键(参见下面的例子),然而,一步一步发送按键更容易理解程序。
SubFindCPLFiles2()
AppActivate"MyDocuments"
SendKeys"{F3}%m*.cpl{Tab}{Tab}C:
\%s",True
EndSub
控制应用程序的其它方法
尽管你可以使用SendKeys语句来传递命令给其它应用程序,但是你还是必须要求助于其它方法来获得对该应用程序的充分控制。
有两种标准方法可以供应用程序和另外一种应用程序交流。
最新的方法,被称为自动控制,它允许你访问和操纵另一种应用程序的对象。
你可以通过自动控制编写VBA过程,通过引用其它应用程序的对象、属性和方法来控制其它应用程序。
在本章接下来的章节里,你将学习如何通过自动控制来控制其它应用程序。
称为DDE(动态数据交换)的老数据交换技术是允许你在两个应用程序之间动态发送数据的协议,它通过创建一个特殊的通道来发送和结束信息。
DDE非常慢,使用困难,只有当你需要与一个不支持自动控制的老应用程序交流时,才需要使用DDE。
了解自动控制
当和另外一个应用程序交流时,你可能需要更多的功能,而不只是激活它来发送按键。
例如,你可能需要在该应用程序里创建和操纵对象,你可以在Excel电子表格力插入整个Word文档。
因为Excel和Word都支持自动控制,所以,你可以在Excel里编写一个VBA过程在操作Word对象,比如文档或者段落。
支持自动控制的应用程序称为自动控制服务器(Automationservers)或者自动控制对象(Automationobjects)。
能够操作服务器对象的应用程序称为自动控制控件。
有些应用程序只能是服务器或者控件,而其它的则既可以是服务器也可以是控件。
MicrosoftOffice2000和2002都可以作为自动控制服务器和控件。
自动控制控件可以是安装在你电脑上的各种ActiveX控件,你将在下一章里学习这些对象。
了解链接和嵌入
在你学习如何使用自动控制从VBA过程控制其它应用程序之前,我们来看一看如何手动链接和插入对象。
人们熟知的OLE,对象链接和嵌入,允许你创建组合文档。
组合文档包含其它应用程序创建的对象。
例如,如果你要在Excel里嵌入一个Word文档的话,Excel只要知道创建该对象需要用到的应用程序名称,以及该对象在屏幕上显示的方法。
组合文档有链接或者对象嵌入产生。
当你使用手动方法来嵌入对象时,你首先要在一个应用程序里复制它,再粘贴到另一个应用程序里。
链接对象和嵌入对象的主要区别是对象储存和更新的方式。
我们来试验一下:
1.激活Word并打开任意一个文档
2.选择和复制任意一段文本
3.在Excel工作表里,使用下述四种方法之一将复制的文本进行粘贴:
∙粘贴为文本(选择编辑|粘贴)。
复制的文本就会出现在活动单元格(见图9-2,单元格A2)
∙粘贴为嵌入对象(选择编辑|选择性粘贴,点击“粘贴选项”按钮,并且在清单里选择“MicrosoftWordDocument对象”。
)粘贴的文本将作为一个嵌入的对象(见图9-2,单元格A5)。
该嵌入的对象成为了目的文件的一部分。
因为该嵌入的对象没有和原始数据链接,所以该信息是静态的。
当文件源中的数据改变时,该嵌入的对象不会被更新。
如果要更改嵌入的数据,你就必须双击它,这样就会打开该对象在源程序里编辑它。
当然,该源程序必须已经安装在你的电脑上了。
当你嵌入对象时,所有的数据都会存储在目的文件里,这会导致文件大小显著增大。
注意,当你嵌入一个对象后,Excel的编辑栏里将显示:
=EMBED("Word.Document.8","")
∙粘贴为链接对象(选择编辑|选择性粘贴,点击“粘贴链接”选项,然后在列表里选择“MicrosoftWordDocument对象”)。
虽然目的文件显示了所有的数据,但是它仅仅储存了该数据的地址。
当你双击该链接的对象时(见图9-2,单元格A9),原应用程序就会被启动。
链接对象是一种动态的操作,这意味着当源文件里的数据改变时,链接的数据就会自动更新。
因为目的文件只包含对象如何与源文件链接的信息,所以,对象链接并不会增加目的文件的大小。
下面的公式是Excel用来链接对象的:
=Word.Document.8|'C:
\DocumentsandSettings\tj8147\MyDocuments\Tiger\VB\Excel2002_Programming\Chinese\Excel2002VBA_Ch9.doc'!
'!
OLE_LINK2'(译者:
由于文件存储位置不同,本节的翻译可能和你的情况不一样,请注意分辨)
∙粘贴为超链接(选择粘贴|超链接译者:
应该为“编辑”|“粘贴为超链接”)粘贴的数据在工作表里显示为带下划线、有颜色的文本(见图9-2,单元格A11)。
点击该超链接,你可以快速地激活该源文件。
图9-2示范链接和嵌入
使用VBA进行链接和嵌入
过程InsertLetter示范了如何使用程序在Excel嵌入一个Word文档。
用你自己的文件名称代替引用“C:
\Hello.doc”。
过程InsertLetter使用AddOLEObject方法,该方法创建一个OLE对象,并且返回一个对表该新OLE对象的Shape对象。
在VB在线帮助里面,你可以找到AddOLEObject方法可用的其它参数。
1.在当前工程里面插入一新模块,并重命名为OLE
2.输入过程InsertLetter,如下所示:
SubInsertLetter()
Workbooks.Add
ActiveSheet.Shapes.AddOLEObjectFileName:
="C:
\Hello.doc"
EndSub
上面的过程打开一个新工作簿,然后嵌入该指定的Word文档。
要链接一个文档的话,你就必须明确另外一个参数Link,如下所示:
ActiveSheet.Shapes.AddOLEObject_
FileName:
="C:
\Hello.doc",Link:
=True
技巧9-4对象链接和嵌入
当你不得不做出决定是否使用嵌入还是链接对象时,只要有下列之一的条件,那么就使用嵌入:
∙你不在乎文档大小,或者