Оператор Declare
Используется на уровне модуля для объявления ссылок на внешние процедуры в библиотеке динамической компоновки (DLL).
Примечание.
Операторы Declare с ключевым словом PtrSafe представляют собой рекомендованный синтаксис. Инструкции Declare , включающие PtrSafe , правильно работают в среде разработки VBA версии 7 на 32-разрядных и 64-разрядных платформах только после того, как все типы данных в инструкции Declare (параметры и возвращаемые значения), которые должны хранить 64-разрядные количества, будут обновлены для использования LongLong для 64-разрядных интегралов или LongPtr для указателей и дескрипторов. Чтобы обеспечить обратную совместимость с VBA версии 6 и более ранних версий, используйте следующую конструкцию:
#If VBA7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf
Синтаксис 1
[ Общедоступная | Приватный ] ОбъявлениевложенногоимениLib "libname" [ Псевдоним "псевдоним" ] [ ( [ arglist ] ) ]
Синтаксис 2
[ Общедоступная | Приватный ] ОбъявлениеименифункцииLib "libname" [ Alias "aliasname" ] [ ( [ arglist ] ) ] [ Astype ]
Синтаксис оператора VBA7 Declare
Примечание.
Чтобы код выполнялся в 64-разрядных версиях Microsoft Office, все инструкции Declare должны включать ключевое слово PtrSafe , а все типы данных в операторе Declare (параметры и возвращаемые значения), которые должны хранить 64-разрядные количества, должны быть обновлены, чтобы использовать LongLong для 64-разрядных интегралов или LongPtr для указателей и дескрипторов.
Синтаксис 1 (Sub)
[ Общедоступная | Приватный ] ОбъявлениеPtrSafeSubnameLib "libname" [ Alias "aliasname" ] [ ( [ arglist ] ) ]
Синтаксис 2 (Function)
[ Общедоступная | Приватный ] ОбъявлениеPtrSafeFunctionnameLib "libname" [ Alias "aliasname" ] [ ( [ arglist ] ) ] [ Astype ]
Part | Описание |
---|---|
Public | Необязательный параметр. Используется для объявления процедур, которые доступны всем другим процедурам во всех модулях. |
Private | Необязательный параметр. Используется для объявления процедур, которые доступны только в рамках модуля, в котором делается объявление. |
PtrSafe | Требуется 64-разрядная версия. Ключевое слово PtrSafe утверждает, что инструкция Declare безопасна для запуска в 64-разрядных версиях Microsoft Office. |
Sub | Необязательный (должен появиться sub или function ). Указывает, что процедура не возвращает значение. |
Function | Необязательный элемент (должно появиться свойство Sub или Function). Указывает, что процедура возвращает значение, которое может использоваться в выражении. |
name | Обязательно. Имя любой действительной процедуры. Обратите внимание, что в точках входа DLL учитывается регистр. |
Lib | Обязательно. Указывает, что источник DLL или кода содержит объявленную процедуру. Предложение Lib необходимо для всех объявлений. |
libname | Обязательно. Имя источника DLL или кода, содержащее объявленную процедуру. |
Alias | Необязательный параметр. Указывает, что вызванная процедура имеет другое имя в DLL. Это полезно, когда имя внешней процедуры совпадает с ключевым словом. Вы также можете использовать свойство Alias, если имя процедуры DLL совпадает с именем общедоступной переменной, константы или другой процедуры в этой области. Свойство Alias также полезно, если знаки в имени процедуры DLL не разрешены соглашением об именовании DLL. |
псевдоним | Необязательный параметр. Имя процедуры в DLL или источнике кода. Если первый знак не является цифрой (#), aliasname — имя точки входа процедуры в DLL. Если первым знаком является (#), все последующие знаки должны указывать порядковый номер точки входа процедуры. |
arglist | Необязательный параметр. Список переменных, представляющий аргументы, которые передаются в процедуру при ее вызове. |
type | Необязательный параметр. Тип данных значения, возвращаемого процедурой Function; Может быть Byte, Boolean, Integer, LongLong, LongPtr, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только переменная длина), Variant, определяемый пользователем тип или тип объекта. (LongLong - это действительный объявленный тип только для 64-разрядных платформ.) |
Аргумент arglist имеет следующий синтаксис и элементы:
[ Необязательно ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ Astype ]
Part | Описание |
---|---|
Необязательное | Необязательный параметр. Указывает, что аргумент не является обязательным. Если используется, все последующие аргументы в списке ресурсов также должны быть необязательными и объявляться с помощью ключевого слова Optional . Optional не может использоваться для каких-либо аргументов, если используется ParamArray. |
ByVal | Необязательный параметр. Указывает, что аргумент передается значением. |
ByRef | Указывает, что аргумент передается по ссылке. ByRef является значением по умолчанию в Visual Basic. |
ParamArray | Необязательный параметр. Используется только в качестве последнего аргумента в списке ресурсов , чтобы указать, что окончательный аргумент является необязательныммассивом элементов Variant . Ключевое слово ParamArray позволяет предоставить произвольное количество аргументов. Ключевое слово ParamArray не может использоваться со свойствами ByVal, ByRef или Optional. |
варнаме | Обязательно. Имя переменной, представляющее аргумент, который передается процедуре; соответствует стандартным соглашениям об именовании переменных. |
( ) | Обязательный элемент для массива переменных. Указывает, что 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 в модули классов, если операторы Declare являются Private.
' 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 и обратная связь.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по