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 的常見宣告