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
[ 公用 | Private ] 宣告子名稱Lib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]
語法 2
[ 公用 | Private ] 宣告函式名稱Lib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]
VBA7 Declare 陳述式語法
注意事項
若要讓程式碼在 64 位元版本的 Microsoft Office 中執行,所有 Declare 陳述式都必須包含 PtrSafe 關鍵字,且在 Declare 陳述式 (參數和傳回值) 中需要儲存 64 位元數目的所有資料型別都必須更新為使用 LongLong (對於 64 位元整數) 或 LongPtr (對於指標和控制代碼)。
語法 1 (Sub)
[ 公用 | Private ] 宣告PtrSafe子名稱Lib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]
2 (Function)
[ 公用 | Private ] 宣告PtrSafe函式名稱Lib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]
部分 | 描述 |
---|---|
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 支援與意見反應。