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