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
[ 公共 | 专用 ] DeclareSubnameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]
语法 2
[ 公共 | 专用 ] DeclareFunctionnameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]
VBA7 Declare 语句语法
注意
若要在 64 位版本的 Microsoft Office 中运行代码,所有 Declare 语句都必须包含 PtrSafe 关键字 (keyword) ,并且 Declare 语句中的所有数据类型 (参数和返回值,需要存储 64 位数量的) 必须更新为将 LongLong 用于 64 位整型或将 LongPtr 用于指针和句柄。
语法 1 (Sub)
[ 公共 | 专用 ] DeclarePtrSafeSubnameLib “libname” [ Alias “aliasname” ] [ ( [ arglist ] ) ]
语法 2 (Function)
[ 公共 | 专用 ] DeclarePtrSafe函数名称Lib “libname” [ 别名 “aliasname” ] [ ( [ arglist ] ) ] [ Astype ]
Part | 说明 |
---|---|
Public | 可选。 用于声明可供所有模块中的所有其他过程使用的过程。 |
Private | 可选。 用于声明仅在其中做出声明的模块中可用的过程。 |
PtrSafe | 对于 64 位版本是必需的。 PtrSafe 关键字 (keyword) 断言 Declare 语句在 64 位版本的 Microsoft Office 中是安全的。 |
Sub | 可选 (Sub 或 Function 必须出现在) 。 指示过程不会返回值。 |
函数 | 可选(Sub 或 Function 必须显示)。 指示过程将返回可在表达式中使用的值。 |
名称 | 必填。 任何有效的过程名称。 请注意,DLL 入口点区分大小写。 |
自由 | 必填。 指示 DLL 或代码资源包含所声明的过程。 所有声明都需要 Lib 子句。 |
libname | 必填。 包含已声明过程的 DLL 或代码资源。 |
Alias | 可选。 指示所调用的过程在 DLL 中具有其他名称。 这在外部过程名称与关键字相同时特别有用。 您还可在 DLL 过程与公共变量、常量或同一范围内的任何其他过程具有相同的名称时,使用 Alias。 Alias 在 DLL 命名约定不允许 DLL 过程名称中的任何字符时十分有用。 |
aliasname | 可选。 DLL 或代码资源中的过程的名称。 如果第一个字符不是数字记号 (#),则 aliasname 是 DLL 中的过程的入口点名称。 如果 (#) 是第一个字符,则其后的所有字符必须指示过程的入口点序号。 |
arglist | 可选。 表示调用过程时将传递到过程的参数的列表。 |
type | 可选。 函数过程返回的值的数据类型;可以是 Byte、Boolean、Integer、Long、LongLong、LongPtr、Currency、Single、Double、Decimal (当前不支持) 、Date、String (变量长度) 、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 关键字不能与 ByVal、ByRef 或 Optional 一起使用。 |
varname | 必填。 表示要传递到过程的参数的变量的名称;遵循标准变量命名约定。 |
( ) | 对于数组变量是必需的。 指示 varname 是一个数组。 |
type | 可选。 要传递到过程的参数的数据类型;数据类型可能为 Byte、Boolean、Integer、Long、LongLong、LongPtr、Currency、Single、Double、Decimal(当前不支持)、Date、String(仅长度可变)、Object、Variant、用户定义类型或对象类型。 (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 支持和反馈,获取有关如何接收支持和提供反馈的指南。