Declare 语句

模块级别用于声明对动态链接库中外部过程的引用, (DLL) 。

注意

建议的语法是,将 Declare 语句与 PtrSafe 关键字一起使用。 只有在 Declare 语句中的所有数据类型都 (参数和返回值) 需要存储 64 位数量的) 更新为将 LongLong 用于 64 位整型或将 LongPtr 用于 64 位整型或将 LongPtr 用于指针和句柄之后,包含PtrSafe声明语句才能在 32 位和 64 位平台上的 VBA 版本 7 开发环境中正常工作。 若要确保与 VBA 版本 6 及更低版本向后兼容,请使用以下构造:

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

语法 1

[ 公共 | 专用 ] DeclareSubnameLiblibname” [ Aliasaliasname” ] [ ( [ arglist ] ) ]

语法 2

[ 公共 | 专用 ] DeclareFunctionnameLiblibname” [ Aliasaliasname” ] [ ( [ arglist ] ) ] [ Astype ]

VBA7 Declare 语句语法

注意

若要在 64 位版本的 Microsoft Office 中运行代码,所有 Declare 语句都必须包含 PtrSafe 关键字 (keyword) ,并且 Declare 语句中的所有数据类型 (参数和返回值,需要存储 64 位数量的) 必须更新为将 LongLong 用于 64 位整型或将 LongPtr 用于指针和句柄。

语法 1 (Sub)

[ 公共 | 专用 ] DeclarePtrSafeSubnameLiblibname” [ Aliasaliasname” ] [ ( [ arglist ] ) ]

语法 2 (Function)

[ 公共 | 专用 ] DeclarePtrSafe函数名称Liblibname” [ 别名aliasname” ] [ ( [ arglist ] ) ] [ Astype ]

Part 说明
Public 可选。 用于声明可供所有模块中的所有其他过程使用的过程。
Private 可选。 用于声明仅在其中做出声明的模块中可用的过程。
PtrSafe 对于 64 位版本是必需的。 PtrSafe 关键字 (keyword) 断言 Declare 语句在 64 位版本的 Microsoft Office 中是安全的。
Sub 可选 (SubFunction 必须出现在) 。 指示过程不会返回值。
函数 可选(SubFunction 必须显示)。 指示过程将返回可在表达式中使用的值。
名称 必填。 任何有效的过程名称。 请注意,DLL 入口点区分大小写。
自由 必填。 指示 DLL 或代码资源包含所声明的过程。 所有声明都需要 Lib 子句。
libname 必填。 包含已声明过程的 DLL 或代码资源。
Alias 可选。 指示所调用的过程在 DLL 中具有其他名称。 这在外部过程名称与关键字相同时特别有用。 您还可在 DLL 过程与公共变量常量或同一范围内的任何其他过程具有相同的名称时,使用 AliasAlias 在 DLL 命名约定不允许 DLL 过程名称中的任何字符时十分有用。
aliasname 可选。 DLL 或代码资源中的过程的名称。 如果第一个字符不是数字记号 (#),则 aliasname 是 DLL 中的过程的入口点名称。 如果 (#) 是第一个字符,则其后的所有字符必须指示过程的入口点序号。
arglist 可选。 表示调用过程时将传递到过程的参数的列表。
type 可选。 函数过程返回的值的数据类型;可以是 ByteBooleanIntegerLongLongLongLongPtrCurrencySingleDoubleDecimal (当前不支持) 、DateString (变量长度) 、Variant用户定义类型对象类型。 (LongLong 仅在 64 位平台上是有效声明类型)。

Arglist 参数具有以下语法和部分:

[ 可选 ][ ByVal | ByRef ][ ParamArray ] varname [ ( ) ] [ Astype ]

Part 说明
可选 可选。 指示不需要参数。 如果使用,arglist 中的所有后续参数也必须是可选的,并使用 Optional 关键字 (keyword) 进行声明。 如果使用了 ParamArray,则不能将 Optional 用于任何参数。
ByVal 可选。 指示按值传递参数。
ByRef 指示按引用传递参数。 ByRef 是 VBA 中的默认值,与 Visual Basic .NET 中不同。
ParamArray 可选。 仅用作 arglist 中的最后一个参数,以指示最终参数是 Variant 元素的 Optional数组ParamArray 关键字允许您提供任意数目的参数。 ParamArray 关键字不能与 ByValByRefOptional 一起使用。
varname 必填。 表示要传递到过程的参数的变量的名称;遵循标准变量命名约定。
( ) 对于数组变量是必需的。 指示 varname 是一个数组。
type 可选。 要传递到过程的参数的数据类型;数据类型可能为 ByteBooleanIntegerLongLongLongLongPtrCurrencySingleDoubleDecimal(当前不支持)、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 支持和反馈,获取有关如何接收支持和提供反馈的指南。