【VB开源代码栏目提醒】:本文主要为网学会员提供“利用VBA控制其它应用程序 - 毕业设计”,希望对需要利用VBA控制其它应用程序 - 毕业设计网友有所帮助,学习一下!
第九章 利用VBA控制其它应用程序作者:Julitta Korol 翻译:Tiger Chen Apr 5’ 2005你每天在办公室里或者家里在你的电脑上工作时,都要用到很多种应用程序。
要从你的硬盘或者软盘上查找某个文件的话,你就要打开视窗浏览器。
当你要设置系统时间或者更改屏幕外观的话,可以点击控制面板上的相应的图标。
如果你的电脑上安装了微软办公软件套餐的话,就可以使用Word创建各种各样的文件,并且依靠Excel进行所有的计算。
微软Access对于保存重要的数据表非常有用,而PowerPoint则有助于你使用声音和图片。
最后,微软Outlook使你易于保存你的联系、时间和约会并且分享给他人。
使用这些应用
软件的时候,你经常要在他们之间切换,你可以使用键盘直接输入数据或者复制或移动数据。
这些操作——打开应用程序以及在它们之间传输数据时不需要手动操作的。
它们可以通过一些很有趣的VBA函数和指令来自动完成。
在本章,你将学习多种从VBA过程里打开应用程序的方法, 并且找到如何使用称为自动化的技术直接从微软Excel直接控制其它应用程序。
启动应用程序启动一个应用程序的方法不止一个,实际上,你至少可以使用五种方法手动打开某个程序:通过“开始”“程序”菜单,快捷键,“运行”命令,MS-DOS窗口,或者在视窗浏览器里双击可执行文件。
本节假设你对手动启动应用程序很熟悉,并且很想从Excel内部的
VB编辑窗口试验其它启动应用程序的方法。
我们从最简单的开始吧——Shell函数。
该函数使你可以从VBA过程里直接打开任意程序。
假设你的过程必须打开视窗记事本,要打开记事本,你所有要做的就是在关键字Sub和End Sub之间加上一条语句,或者更好的方法是在立即窗口里输入下述语句,并且按下回车键:Shell quotnotepad.exequot 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.xls2. 在
VB编辑器窗口,插入新模块3. 重新命名工程为WorkWApplets,模块名为ShellFunction4. 输入下面显示的过程StartPanel:Sub StartPanel Shell quotControl.exequot vbNormalFocusEnd Sub控制面板里面有很多图标,每个图标执行一个或者多个任务。
众所周知,在每个图标后面都有一个程序的,当用户双击图标或者用箭头选择该图标然后按下Enter键,该程序都会被激活。
作为一个规律,你总是可以通过查看某个图标的属相来检查什么文件名驱动某个图标。
不幸的是,控制面板里面的图标的属性选择都被禁止了。
然后,你可以通过创建一个到该图标的快捷键来查找控制面板里图标文件。
例如,在你创建一个更改电脑原始设置的过程之前,我们来找出激活该图标的文件名称。
1. 从“开始”菜单里选择“设置”,然后选择“控制面板”(在Windows XP开始菜单里可以直接看到“控制面板”)2. 在控制面板窗口里,右键单击“初始选项”图标,并且从快捷菜单中选择创建快捷键3. 点击确定,将快捷键放在桌面上4. 关闭控制面板窗口5. 返回桌面,在初始选项的快捷键上单击右键,然后选择属性6. 在属性窗口,点击快捷键页,然后点击更改图标按钮图9-1 每个控制面板里的图标都有一个后缀名为.cpl的文件7. 写下.cpl文件名称(Control Panel Library)或者动态链接库文件(.dll)并关闭该练习中开启的所有窗口表9-2 激活控制面板图标的一些文件示例控制面板图标 .cpl或者.dll文件电话和调制解调器选项 TELEPHON.CPL或MODEM.CPL添加/删除程序 APPWIZ.CPL
网络和拨号连接 NETCPL.CPL或NETSHELL.DLL32-Bit ODBC ODBCCP32.CPL
系统 SYSDM.CPL邮件 MLCFG32.CPL用户和密码 PASSWORD.CPL或
NETPLWIZ.DLL日期/时间 TIMEDATE.CPL区域选项 INTL.CPLInternet选项 INETCPL.CPL声音和多媒体属性 MMSYS.CPL显示 DESK.CPL鼠标 MAIN.CPL下面的国产ChangeSettings示范如何使用Shell函数来启动控制面板的初始设置图标。
注意Shell函数的参数必须写在括号里,如果你后面需要在你的程序里使用它返回值的话。
1. 在当前模块里输入过程ChangeSettings,如下所示:Sub ChangeSettings Dim nrTask nrTask ShellquotControl.exe intl.cplquot vbMinimizedFocus Debug.Print nrTaskEnd Sub2. 运行几次过程ChangeSettings,每次从表9-2里列出的清单里提供一个不同的.cpl文件。
你可能需要将程序改为:Sub ChangeSettings2 Dim nrTask Dim iconFile As String iconFile InputBoxquotEnter the name of the CPL or DLL file:quot nrTask ShellquotControl.exe quot amp iconFile vbMinimizedFocus Debug.Print nrTaskEnd Sub如果你要启动的程序是微软应用程序, 那么除了使用Shell函数外, 你还可以很方便地使用
VB的方法ActivateMicrosoftApp来实现。
该方法在微软Excel应用程序的对象里是可用的,例如,要从立即窗口启动PowerPoint的话,你所有要做的事情就是输入下面的指令并且按下Enter:Application.ActivateMicrosoftApp xlMicrosoftPowerPoint注意ActivateMicrosoftApp方法要求一个常量来指定要启动的程序。
如果PowerPoint没有打开的话,上面的过程就会打开PowerPoint,但是如果该程序已经打开的话,该指令不会再打开一个新的PowerPoint界面,只是简单的激活已经在运行的应用程序。
你可以结合ActivateMicrosoftApp方法使用下列常量,常量的名称指名应用程序名称。
应用程序名称 常量Access xlMicrosoftAccessFoxPro xlMicrosoftFoxProMail xlMicrosoftMailPowerPoint xlMicrosoftPowerPointProject xlMicrosoftProjectSchedule xlMicrosoftSchedulePlusWord xlMicrosoftWord在应用程序之间切换因为用户可以同时在Windows环境下使用多个应用程序,所以你的
VBA过程必须要知道如何在打开的程序之间切换。
假设除了Excel之外,你还打开了另外两种应用程序:Word和Explorer。
你可以按照下面的语法使用AppActivate语句来激活已经打开的程序:AppActivate title wait只有标题参数是必须的,这是应用程序的名称,正如它显示在应用程序窗口的标题栏那样,或者它也可以是Shell函数返回的任务ID号码。
注意,参数title要跟每个正运行的应用程序的标题字符串进行对比,如果没有精确的匹配,那么任何标题字符串里前面的字符和参数title一致的应用程序就会被激活。
(译者:例如,你要激活Excel,那么title参数应该是“Microsoft Excel”,如果你写的是“Microsoft”,那么激活的就也可能是Word,PowerPoint……)。
第二个参数wait是可选的,它是个布尔值(True或False),明确
VB什么时候激活应用程序。
如果在这里是False的话,该应用程序就立即会被激活,甚至被调应用
程序并没有焦点。
如果在wait参数处放置True的话,那么被调的应用程序就会等到它有了焦点,然后才会激活该应用程序。
例如,要激活Word,你就得输入下列语句:AppActivate “Microsoft Word”注意,应用程序名称用双引号引用起来。
你也可以使用Shell函数返回的数值作为语句AppActivate的参数:‘ run Microsoft Word 运行Word应用程序ReturnValue ShellquotC:Microsoft OfficeOfficeWord.exequot1‘ activate Microsoft Word 激活WordAppActivate ReturnValue语句AppActivate用来在应用程序之间切换,所以要求这些程序已经在运行。
该语句仅仅改变焦点,指定的应用程序变为当前活动的窗口。
AppActivate语句不会启动任何应用程序,参见下一章节的过程FindCPLFiles,这也是使用该语句的一个例子。
我们来练习一下最近介绍的几个VBA语句:1. 通过在立即窗口里输入下列VBA语句来打开资源管理器:Shell quotExplorerquot按下回车键后,被请求的应用程序就被打开了,带有“我的文档”文件夹的图标就会出现在任务栏上。
2. 在立即窗口里输入下列
代码:AppActivate quotMy Documentsquot按下回车键后,焦点就会移至我的文档窗口。
控制其它应用程序既然你已经知道了如何使用VBA语句来启动一个程序, 以及在应用程序之间切换, 那么我们来看看一个应用程序是如何与另外一个应用程序交流的。
对于一个应用程序来说,要控制另一个应用程序的最简单的方式就是使用SendKeys语句。
该语句允许你将许多的按键发送到活动应用程序窗口,你可以发送一个或组合键并且得到直接使用键盘的同样效果。
SendKeys语句如下所示:SendKeys string wait这个必须的参数string是你要发送到活动应用程序窗口的键或组合键,例如,使用下列指令来发送字母“f”键:SendKeys quotfquot要发送组合键Altf,使用:SendKeys quotfquot百分符号()是表示Alt键的字符串。
要发送例如ShiftTab的组合键的话,那么就要使用下面的语句:SendKeys quotTABquot加号()表示Shift键。
要发送其它键或者其它组合键的话,请参见表9-3列出的相应字符串。
技巧9-1 SendKeys和其它应用程序你只能发送按键到那些为微软视窗操作系统设置的应用程序。
技巧9-2 SendKeys和被保护的字符有些字符在和SendKeys语句一起使用时具有特殊的意义,它们是:加号(),脱字符号(),符合()和括号()。
要发送这些字符到另一个应用程序的话,就必须将它们用打括号括起来。
要发送打括号时,则需要输入和SendKeys语句的第二个参数是可选的,wait是个逻辑值True或者False。
如果是False(缺省),那么
VB在发送按键后立即返回过程,如果为True,那么
VB只有在发送的按键执行后才能返回到过程。
如果要发送一个表格9-3里面没有列出的字符的话,那么记住这些
代码必须用引号括起来,例如:SendKeys “BACKSPACE”表9-3 SendKeys语句里使用的按键
代码键
代码 键
代码空格键 BACKSPACE 滚动锁定 SCROLLLOCK BS Tab TAB BKSP 向上箭头 UPBreak键 BREAK F1 F1大写锁定键 CAPSLOCK F2 F2删除键 DELETE F3 F3 DEL F4 F4向下箭头 DOWN F5 F5End键 END F6 F6回车键 ENTER F7 F7 F8 F8Esc键 ESC F9 F9帮助键 HELP F10 F10Home键 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-3 SendKeys语句对格敏感当你使用SendKeys语句发送按键时,你一定要牢记区分字符的大小格。
因此,要发送组合键Ctrld的话,你必须使用d,而发送CtrlShiftD的话,则必须使用字符串:d在本章前期,你学习了.cpl文件启动多种控制面板的图标。
你现在要创建的VBA过程目的是要定位你硬盘上所有扩展名为.cpl的文件。
1. 使用立即窗口来启动资源管理器:Shell “Explorer.”“我的文档”图标将出现在屏幕下方的任务栏上。
2. 在当前工程里插入新模块并且重命名为SendKeysStatement3. 输入过程FindCPLFiles,如下所示:Sub FindCPLFiles The keystrokes are for Windows 2000 AppActivate quotMy Documentsquot activate the Search window 激活搜索窗口 SendKeys quotF3quot True move the pointer to the Search for files将光标移到搜索文件 and folders named text box 和文件夹(名称在文本框里) SendKeys quotmquot True type in the search string 输入要
搜索的字符串 SendKeys quot.cplquot True move to the Look in drop down box 焦点移到下拉框 SendKeys quotTabTabquot True change to the root directory 更改根目录 SendKeys quotC:quot True execute the Search 执行搜索 SendKeys quotsquot TrueEnd Sub4. 切换到Excel应用程序窗口并且运行过程FindCPLFiles(使用AltF8打开宏对话框,选择过程名称,再点击运行)。
上面过程的第一条语句使用AppActivate语句(参见前面章节)来激活已经打开的应用程序,还记得你在立即窗口里使用Shell语句激活了资源管理器吗?剩余的语句发送一些必要的按键到活动应用程序。
本过程的结果是扩展名为.cpl的控制面板文件的搜索结果列表。
你也可以使用一个SendKeys语句来发送所有必须的按键(参见下面的例子),然而,一步一步发送按键更容易理解程序。
Sub FindCPLFiles2 AppActivate quotMy Documentsquot SendKeys quotF3 m.cplTabTabC:squot TrueEnd Sub控制应用程序的其它方法尽管你可以使用SendKeys语句来传递命令给其它应用程序,但是你还是必须要求助于其它方法来获得对该应用程序的充分控制。
有两种标准方法可以供应用程序和另外一种应用程序交流。
最新的方法,被称为自动控制,它允许你访问和操纵另一种应用程序的对象。
你可以通过自动控制编写VBA过程,通过引用其它应用程序的对象、属性和方法来控制其它应用程序。
在本章接下来的章节里,你将
学习如何通过自动控制来控制其它应用程序。
称为DDE(动态数据交换)的老数据交换技术是允许你在两个应用程序之间动态发送数据的协议,它通过创建一个特殊的通道来发送和结束信息。
DDE非常慢,使用困难,只有当你需要与一个不支持自动控制的老应用程序交流时,才需要使用DDE。
了解自动控制当和另外一个应用程序交流时,你可能需要更多的功能,而不只是激活它来发送按键。
例如,你可能需要在该应用程序里创建和操纵对象,你可以在Excel电子表格力插入整个Word文档。
因为Excel和Word都支持自动控制,所以,你可以在Excel里编写一个VBA过程在操作Word对象,比如文档或者段落。
支持自动控制的应用程序称为自动控制服务器(Automation servers)或者自动控制对象(Automation objects)。
能够操作服务器对象的应用程序称为自动控制控件。
有些应用程序只能是服务器或者控件,而其它的则既可以是服务器也可以是控件。
Microsoft Office 2000和2002都可以作为自动控制服务器和控件。
自动控制控件可以是安装在你电脑上的各种ActiveX控件,你将在下一章里学习这些对象。
了解链接和嵌入在你学习如何使用自动控制从VBA过程控制其它应用程序之前,我们来看一看如何手动链接和插入对象。
人们熟知的OLE,对象链接和嵌入,允许你创建组合
文档。
组合
文档包含其它应用程序创建的对象。
例如,如果你要在Excel里嵌入一个Word文档的话,Excel只要知道创建该对象需要用到的应用程序名称,以及该对象在屏幕上显示的方法。
组合文档有链接或者对象嵌入产生。
当你使用手动方法来嵌入对象时,你首先要在一个应用程序里复制它,再粘贴到另一个应用程序里。
链接对象和嵌入对象的主要区别是对象储存和更新的方式。
我们来试验一下:1. 激活Word并打开任意一个文档2. 选择和复制任意一段文本3. 在Excel
工作表里,使用下述四种方法之一将复制的文本进行粘贴: 粘贴为文本(选择编辑粘贴)。
复制的文本就会出现在活动单元格(见图9-2,单元格A2) 粘贴为嵌入对象(选择编辑选择性粘贴,点击“粘贴选项”按钮,并且在清单里选择“Microsoft Word Document 对 象”。
)粘贴的文本将作为一个嵌入的对象(见图9-2,单元格A5)。
该嵌入的对象成为了目的文件的一部分。
因为该 嵌入的对象没有和原始数据链接,所以该信息是静态的。
当文件源中的数据改变时,该嵌入的对象不会被更新。
如果 要更改嵌入的数据,你就必须双击它,这样就会打开该对象在源程序里编辑它。
当然,该源程序必须已经安装在你的 电脑上了。
当你嵌入对象时,所有的数据都会存储在目的文件里,这会导致文件大小显著增大。
注意,当你嵌入一个 对象后,Excel的编辑栏里将显示: EMBEDquotWord.Document.8quotquotquot 粘贴为链接对象(选择编辑选择性粘贴,点击“粘贴链接”选项,然后在
列表里选择“Microsoft Word Document 对 象”)。
虽然目的文件显示了所有的数据,但是它仅仅储存了该数据的地址。
当你双击该链接的对象时(见图9-2,单 元格A9),原应用程序就会被启动。
链接对象是一种动态的操作,这意味着当源文件里的数据改变时,链接的数据就 会自动更新。
因为目的文件只包含对象如何与源文件链接的信息,所以,对象链接并不会增加目的文件的大小。
下面 的公式是Excel用来链接对象的: Word.Document.8C:Documents and Settingstj8147My DocumentsTigerVBExcel2002_ProgrammingChineseExcel2002VBA_Ch9.docOLE_LINK2(译者:由于文件存 储位置不同,本节的翻译可能和你的情况不一样,请注意分辨) 粘贴为超链接(选择粘贴超链接译者:应该为“编辑”“粘贴为超链接”)粘贴的数据在工作表里显示为带下划线、 有颜色的文本(见图9-2,单元格A11)。
点击该超链接,你可以快速地激活该源文件。
图9-2 示范链接和嵌入使用VBA进行链接和嵌入过程InsertLetter示范了如何使用程序在Excel嵌入一个Word文档。
用你自己的文件名称代替引用 。
.