Delare 陳述式

在模組層級使用以宣告對動態連結程式庫 (DLL) 中外部程序的參考。

注意事項

具有 PtrSafe 關鍵字的 Declare 陳述式是建議的語法。 包含 PtrSafe 的 Declare 陳述式只有在 Declare 陳述式 (參數和傳回值) 中需要儲存 64 位元數目的所有資料型別更新為使用 LongLong (對於 64 位元整數) 或 LongPtr (對於指標和控制代碼) 後,才能在 32 位元和 64 位元平台的 VBA 版本 7 開發環境中正確運作。 若要確保 VBA 版本 6 或更早版本的回溯相容性,請使用下列建構︰

#If VBA7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf

語法 1

[ 公眾 | 私人 ] 宣告子名稱lib 「libname」 [ 別名 「aliasname」 ] [ ( [ arglist ] ) ]

語法 2

[ 公眾 | 私人 ] 宣告函式名稱Lib 「libname」 [ 別名 “aliasname” ] [ ( [ arglist ] ) ] [ 作為類型 ]

VBA7 Declare 陳述式語法

注意事項

若要讓程式碼在 64 位元版本的 Microsoft Office 中執行,所有 Declare 陳述式都必須包含 PtrSafe 關鍵字,且在 Declare 陳述式 (參數和傳回值) 中需要儲存 64 位元數目的所有資料型別都必須更新為使用 LongLong (對於 64 位元整數) 或 LongPtr (對於指標和控制代碼)。

語法 1 (Sub)

[ 公眾 | 私人 ] 宣告PtrSafe子名稱lib 「libname」 [ 別名 「aliasname」] [ ( [ arglist ] ) ]

2 (Function)

[ 公眾 | 私人 ]宣告PtrSafe函式名稱Lib「libname」[別名「aliasname」] [ ( [arglist ] ) ] [ 型別 ]

部分 描述
Public 選用。 用來宣告可供全部模組中所有其他程序使用的程序。
Private 選用。 用來宣告只能在建立該宣告之模組中使用的程序。
PtrSafe 64 位元的必要項。 PtrSafe 關鍵字會判斷提示 Declare 陳述式是否能夠安全地在 64 位元版本的 Microsoft Office 中執行。
Sub 選用 (Sub 或 Function 必須擇一出現)。 表示程序並不會傳回值。
Function 選用 (Sub 或 Function 必須擇一出現)。 表示程序傳回可在運算式中使用的值。
name 必要。 任何有效的程序名稱。 請注意,DLL 進入點區分大小寫。
Lib 必要。 表示 DLL 或代碼資源包含所宣告的程序。 Lib 子句是所有宣告的必要項。
libname 必要。 包含所宣告程序之 DLL 或代碼資源的名稱。
Alias 選用。 表示所呼叫的程序在 DLL 中有另一個名稱。 這在外部程序名稱與關鍵字相同時非常有用。 當 DLL 程序具有相同的公用變數、常數、或在同一個範圍中任何其他程序名稱時,您也可以使用 Alias。 如果 DLL 程序名稱中的任何字元不受 DLL 命名慣例所允許,Alias 也很有用。
aliasname 選用。 DLL 或代碼資源中的程序名稱。 如果第一個字元不是數字記號 (#),則 aliasname 為 DLL 中的程序進入點名稱。 如果 (#) 為第一個字元,後面的所有字元都必須都指出程序進入點的序號。
arglist 選用。 變數清單,代表呼叫時傳遞至程序的引數。
type 選用。 Function 程序所傳回值的資料型別;可能是 ByteBoolean、Integer、LongLongLong、LongPtrCurrencySingleDoubleDecimal (目前不支援)、DateString (僅可變長度),Variant、使用者定義型別,或物件型別。 (LongLong 只有在 64 位元平台上是有效的宣告型別。)

arglist 引數具有下列語法和部分︰

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ Astype ]

部分 描述
Optional 選用。 表示引數不是必要的。 若使用, arglist 中所有後續參數也必須為可選,並以 Optional 關鍵字宣告。 如果已使用 ParamArray ,則不能在任何引數中使用 Optional 。
ByVal 選用。 表示引數以傳值方式傳遞。
ByRef 表示引數以傳參考方式傳遞。 ByRef 是 VBA 的預設,與 Visual Basic .NET 不同。
ParamArray 選用。 僅作為 arglist 的最後一個參數,表示最後一個參數是 Variant 元素的可選陣列。 ParamArray 關鍵字可讓您提供引數的任意數。 ParamArray 關鍵字不能與 ByVal 、 ByRef ,或 Optional 一起使用。
varname 必要。 表示傳遞至程序引數的變數名稱;依循標準變數命名慣例。
( ) 陣列變數的必要項。 表示 varname 是一個陣列。
type 選用。 傳遞至程序之引數的資料型別;可能是 Byte、Boolean、Integer、Long、LongLong、LongPtr、Currency、SingleDouble、Decimal (目前不支援)、DateString (僅可變長度)、ObjectVariant、使用者定義型別或物件型別。 (LongLong 只有在 64 位元平台上是有效的宣告型別。)

備註

Declare Sub First Lib "MyLib" () 

如果您包含引數清單,引數的數目和型別會在每次呼叫程序的時候受到檢查。 在下列範例中,使用一個 Long 引數:

Declare Sub First Lib "MyLib" (X As Long) 

注意事項

  • 您不能在 Declare 陳述式的引數清單中有固定長度字串;只有可變長度字串可以傳遞到程序。 固定長度字串可作為程序引數顯示,但它們會在傳遞之前轉換成可變長度字串。
  • 當呼叫外部程序,而外部程序需要的字串其值為零時,會使用 vbNullString 常數。 這和零長度字串 ("") 不一樣。

範例

此範例顯示 Declare 陳述式如何在標準模組的模組層級上使用,來宣告對動態連結程式庫 (DLL) 中外部程序的參考。 如果 Declare 陳述式為 Private,您可以將 Declare 陳述式置於類別模組中。

' In Microsoft Windows (16-bit): 
Declare Sub MessageBeep Lib "User" (ByVal N As Integer) 
' Assume SomeBeep is an alias for the procedure name. 
Declare Sub MessageBeep Lib "User" Alias "SomeBeep"(ByVal N As Integer) 
' Use an ordinal in the Alias clause to call GetWinFlags. 
Declare Function GetWinFlags Lib "Kernel" Alias "#132"()As Long 
 
' In 32-bit Microsoft Windows systems, specify the library USER32.DLL, 
' rather than USER.DLL. Use conditional compilation to write 
' code that can run on either Win32 or Win16. 
#If Win32 Then 
    Declare Sub MessageBeep Lib "User32" (ByVal N As Long) 
#Else 
    Declare Sub MessageBeep Lib "User" (ByVal N As Integer) 
#End If 
 
 
' 64-bit Declare statement example: 
Declare PtrSafe Function GetActiveWindow Lib "User32" () As LongPtr 
 
' Conditional Compilation Example 
#If Vba7 Then 
     ' Code is running in  32-bit or 64-bit VBA7. 
     #If Win64 Then 
          ' Code is running in 64-bit VBA7. 
     #Else 
          ' Code is not running in 64-bit VBA7. 
     #End If 
#Else 
     ' Code is NOT running in 32-bit or 64-bit VBA7. 
#End If 
 

另請參閱

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應。