Office VBA 和 API

我们都知道,Visual Basic? for Applications (VBA) 是一种功能强大的编程语言,可用来开发自定义 Microsoft Office 解决方案。将 VBA 和一个或多个 Office 应用程序对象模块配合使用,您可以轻松地修改 Office 应用程序的功能,或者使两个或多个应用程序协同工作,从而完成单个应用程序无法完成的任务。VBA 只能控制操作系统的一小部分,即直接向 VBA 公开的那些函数和对象。Windows? 应用程序编程接口 (API) 提供了众多函数,可让您深入控制操作系统的绝大部分内容。您可以从 VBA 中调用 Windows API 函数,扩展和优化自定义 Office 解决方案。

在这个月的专栏中,我将为您简单介绍如何在 VBA 中使用 Windows API,并提供一些有用的示例。您可以复制这些示例,在自己的自定义解决方案中直接使用它们。

警告:调用 Windows API 和其他 DLL 函数可能会影响您的应用程序的可靠性。当您从自己的代码中直接调用 DLL 函数时,会跳过 VBA 在正常情况下提供的一些安全机制。如果您错误地定义或调用 DLL 函数(任何程序员都难免犯这类错误),就可能会产生应用程序错误,也称为常规保护错误,即 GPF。如果使用了 API,那么在运行代码前一定要保存项目,并确保已理解调用 DLL 函数的原理。

理解 API

简单地说,API 就是您用来控制组件、应用程序或操作系统的一组函数。API 通常包含一个或多个可以提供某些特定功能的 DLL。

DLL 是一些包含任何 Windows 应用程序都可以调用的函数的文件。在运行过程中,DLL 中的函数“动态地链接”到调用它的应用程序中。不管有多少个应用程序调用 DLL 中的函数,该函数只存在于驱动器上的一个单一的文件中,并且该 DLL 在内存中只创建一次。

您最常听说的 API 可能是 Windows API,它包含组成 Windows 操作系统的所有 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 交互作用。Windows API 可以保证所有在 Windows 中运行的应用程序都按照统一的方式运行。

除了 Windows API 外,还有其他一些公开的 API。例如,邮件应用程序编程接口 (MAPI) 是用于编写电子邮件应用程序的一组 DLL。

传统上 API 是为那些创建 Windows 应用程序的 C 和 C++ 程序员编写的,但使用 VBA 也可以调用 DLL 中的函数。由于大部分 DLL 及其文档最初是为 C/C++ 程序员编写的,所以调用 DLL 函数和调用 VBA 函数可能会有所不同。为了使用 API,您需要了解如何向 DLL 函数传递参数。

为了调用 Windows API 中的函数,您需要参考有关文档,了解有哪些函数可供使用以及如何在 VBA 中声明和调用这些函数。以下是两个很有用的资源:

文件 Win32API.txt,包含在 Microsoft Office 2000 Developer 和 Microsoft Visual Basic 中。文件 Win32API.txt 包含了大部分 Windows API 函数所使用的 VBA Declare 语句。您可以使用 API Viewer 外接程序(同样包含在 Office 2000 Developer 中)来查找和复制您需要的 Declare 语句。有关安装和使用 API Viewer 外接程序的信息,请参阅 Office 2000 Developer 中的 apiload.txt 文件。Microsoft Visual Basic 附带的 API Viewer 应用程序具有相同的功能,只不过它是一个独立的应用程序。

初次运行 API Viewer 应用程序时,它将加载 Win32API.txt 文件。该文本文件可以导出到一个 Microsoft Access 数据库(.mdb 文件)中,这样能加速加载和浏览 API 数据的过程。

Microsoft Platform SDK,包含完整的 Windows API 文档。它可以在 Microsoft Developer Network 站点上免费获得:http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/portals/win32start_1n6t.htm(英文)。

使用 Declare 语句

在从 VBA 调用 DLL 中的函数前,您必须先告诉 VBA 该函数位于何处以及如何调用它。有两种方法可以实现这一目的:


  • 设置 DLL 类型库的引用。
  • 在模块中使用 Declare 语句。


设置 DLL 类型库的引用是使用 DLL 函数的最简单的方法。一旦设置了引用,您便可以调用 DLL 函数,就好象它是项目中的一部分。然而,这里有一些需要注意的地方。首先,设置引用多个类型库会影响应用程序的性能。其次,并非所有 DLL 都提供类型库。尽管可以设置引用一个不提供类型库的 DLL,但却不能象将其作为项目中的一部分那样调用该 DLL 中的函数。

请注意,组成 Windows API 的 DLL 不提供类型库,因而不能通过设置引用这些 DLL 来调用其中的函数。要调用 Windows API 中的函数,您必须在项目中的模块声明部分插入一条 Declare 语句。

Declare 语句是一条定义语句,它告诉 VBA 从何处获得特定的 DLL 函数以及如何调用该函数。在代码中添加 Declare 语句的最简单方法是使用 API Viewer 外接程序,该程序包含了大部分 Windows API 函数所使用的 Declare 语句,以及一些函数需要的常量和类型定义。

下例所示为 GetTempPath 函数的 Declare 语句,该函数将返回 Windows 临时文件夹的路径(默认情况下为 C:\Windows\Temp):

Private Declare Function GetTempPath Lib "kernel32" _
   Alias "GetTempPathA" (ByVal nBufferLength As Long, _
   ByVal lpBuffer As String) As Long


关键字 Declare 告诉 VBA 您要在项目中包含一个 DLL 函数的定义。标准模块中的 Declare 语句可以是公共的或是私有的,这取决于您想使该 API 函数只在单个模块中可用还是在整个项目中都可用。在类模块中,Declare 语句必须为私有的。

紧随关键字 Function 的函数名是您从 VBA 中调用该函数时要使用的名称。该名称可以与 API 函数本身的名称相同,也可以使用 Declare 语句中的 Alias 关键字,表示您要在 VBA 中使用不同的名称(“别名”)调用该函数。

在上面的示例中,在 DLL 内 API 函数的名称为 GetTempPathA,而从 VBA 中调用它时使用的名称就是 GetTempPath。请注意,DLL 函数的真实名称应出现在 Alias 关键字的后面。另外,GetTempPath 是 Win32API.txt 文件中使用的函数别名,您可以把它更改为任何您需要的名称。

以下是您可能要在 Declare 语句中使用别名的几个原因:


  • 有些 API 函数的名称以下划线字符 (_) 开头,这在 VBA 中是非法的。为了从 VBA 中调用这类函数,您需要使用别名。
  • 由于可以任意定义 DLL 函数的别名,因此您可以在 VBA 中按照自己的标准来命名函数。
  • 由于 API 函数区分大小写,而 VBA 函数不区分,您可以使用别名来改变函数名称的大小写。
  • 有些 DLL 函数具有可使用多种数据类型的参数。VBA 的 Declare 语句可将这些函数的参数定义为 Any 类型。将 DLL 函数的参数定义为 Any,调用时可能会有危险,因为 VBA 不会为您检查数据类型。如果想避免以 Any 类型传递参数带来的危害,您可以为同一个 DLL 函数声明多个不同版本,每一个版本都使用不同的名称和不同的数据类型。


Windows API 中所有使用字符串参数的函数都具有两个版本:ANSI 版和 Unicode 版。ANSI 版以字母“A”开头,如上例所示,而 Unicode 版以字母“W”开头。尽管 VBA 内部使用 Unicode,但在调用 DLL 函数前,它会将所有字符串都转换成 ANSI 字符串。因此当您从 VBA 中调用 Windows API 函数时,通常还是使用 ANSI 版。API Viewer 外接程序将自动为所有使用字符串参数的函数命名,这样您可以不用包含首字母“A”而直接调用函数。

关键字 Lib 指明包含该函数的 DLL。请注意 DLL 的名称包含在 Declare 语句的一个字符串中。如果在 Lib 关键字后指定了一个用户系统上不存在的 DLL,那么调用该函数时将导致运行时错误 48,“加载 DLL 时出错”。在 VBA 代码中可以处理这些错误,您可以编写具有适当错误处理的代码,使之运行稳定可靠。(如果您调用基本 Windows DLL 中的函数,这就不成为问题,因为当您加载应用程序时,就必然要用到这些 DLL。)

下表列出了 Windows API 中最常用的 DLL。


下载 TXT 文本版[7Z][TXT]:下载文件 点击下载此文件
[本日志由 parno 于 2009-12-15 04:37 AM 编辑]
上一篇: 窗口事件的发生顺序
下一篇: 常用 ASCII 码表
文章来自: 网络
引用通告: 查看所有引用 | 我要引用此文章
Tags: VBA Office vbscript API
相关日志:
评论: 0 | 引用: 0 | 查看次数: 41875
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 500 字 | UBB代码 关闭 | [img]标签 关闭