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 的常见声明