API 声明和用法

声明 DLL 过程以使用不同的 VBA 版本:

Option Explicit

#If Win64 Then

    Private Declare PtrSafe Sub xLib "Kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

#ElseIf Win32 Then

    Private Declare Sub apiSleep Lib "Kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

#End If

上面的声明告诉 VBA 如何调用文件 Kernel32.dll 中定义的函数 Sleep

Win64 和 Win32 是用于条件编译的预定义常量

预定义的常量

一些编译常量已经预先定义。哪些存在将取决于你运行 VBA 的办公室版本的位数。请注意,Vba7 是与 Office 2010 一起引入的,以支持 64 位版本的 Office。

不变 16 位 32 位 64 位
VBA6 如果是 Vba6
VBA7 如果是 Vba7 真正
Win16 真正
Win32 真正 真正
Win64 平台 真正
苹果电脑 如果 Mac 如果 Mac

这些常量指的是 Office 版本,而不是 Windows 版本。例如,32 位 Office 中的 Win32 = TRUE,即使操作系统是 64 位版本的 Windows。

声明 API 时的主要区别在于引入新参数类型的 32 位和 64 位 Office 版本(有关更多详细信息,请参阅备注部分)

笔记:

  • 声明放在模块的顶部,并放在任何子或函数之外
  • 标准模块中声明的过程默认是公共的
  • 声明一个模块的私有过程在声明前面加上 Private 关键字
  • 在任何其他类型的模块中声明的 DLL 过程对该模块是私有的

Sleep API 调用的简单示例:

Public Sub TestPause()

    Dim start As Double

    start = Timer

    Sleep 9000      'Pause execution for 9 seconds

    Debug.Print "Paused for " & Format(Timer - start, "#,###.000") & " seconds"

    'Immediate window result: Paused for 9.000 seconds

End Sub

建议创建一个专用的 API 模块,以便从 VBA 包装器中轻松访问系统功能 - 正常的 VBA Subs 或函数,它封装了实际系统调用所需的详细信息,例如库中使用的参数,以及这些参数的初始化

该模块可以包含所有声明和依赖项:

  • 方法签名和所需的数据结构
  • 执行输入验证的包装器,并确保按预期传递所有参数

要声明 DLL 过程,请将 Declare 语句添加到代码窗口的 Declarations 部分。

如果过程返回一个值,则将其声明为 Function

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

如果过程未返回值,则将其声明为 Sub

Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]
  • !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!

另外值得注意的是,对 API 的大多数无效调用都会导致 Excel 崩溃,并可能损坏数据文件

  • !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!

Office 2011 for Mac

Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long

Sub RunSafari()
    Dim result As Long
    result = system("open -a Safari --args http://www.google.com")
    Debug.Print Str(result)
End Sub

下面的示例(Windows API - 专用模块(1 和 2))显示了一个 API 模块,其中包含 Win64 和 Win32 的常见声明