Обзор 64-разрядной версии Visual Basic для приложений64-bit Visual Basic for Applications overview

Microsoft Visual Basic для приложений (VBA) — это версия Visual Basic, поставляемая вместе с Microsoft Office.Microsoft Visual Basic for Applications (VBA) is the version of Visual Basic that ships with Microsoft Office. В Microsoft Office 2010 язык VBA содержит такие функциональные возможности, которые позволяют коду VBA правильно выполняться как в 32-разрядных, так и в 64-разрядных средах.In Microsoft Office 2010, VBA includes language features that enable VBA code to run correctly in both 32-bit and 64-bit environments.

Примечание

По умолчанию пакет Office 2010 устанавливает 32-разрядную версию.By default, Office 2010 installs the 32-bit version. Во время установки необходимо явно выбрать 64-разрядную версию.You must explicitly choose to install the 64-bit version during setup.

Выполнение кода VBA, который был написан до выпуска Office 2010 (VBA версии 6 и более ранних), на 64-разрядной платформе может приводить к возникновению ошибок, если код не был модифицирован для работы в 64-разрядных версиях Office.Running VBA code that was written before the Office 2010 release (VBA version 6 and earlier) on a 64-bit platform can result in errors if the code is not modified to run in 64-bit versions of Office. Ошибки будут возникать по той причине, что язык VBA версии 6 и более ранних версий неявно ориентирован на 32-разрядные платформы и обычно содержит операторы Declare, запускающие в действие функции API Windows путем использования 32-разрядных типов данных для указателей и дескрипторов.Errors will result because VBA version 6 and earlier implicitly targets 32-bit platforms, and typically contains Declare statements that call into the Windows API by using 32-bit data types for pointers and handles. Так как язык VBA версии 6 и более ранних версий не имеет специального типа данных для указателей и дескрипторов, им используется тип данных Long, который является 32-разрядным 4-байтным типом данных, предназначенным для ссылки на указатели и дескрипторы.Because VBA version 6 and earlier does not have a specific data type for pointers or handles, it uses the Long data type, which is a 32-bit 4-byte data type, to reference pointers and handles. Указатели и дескрипторы в 64-разрядных средах являются 8-байтными 64-разрядными числами.Pointers and handles in 64-bit environments are 8-byte 64-bit quantities. Эти 64-разрядные числа не могут храниться в 32-разрядных типах данных.These 64-bit quantities cannot be held in 32-bit data types.

Примечание

Код VBA нуждается в модификации, только если он выполняется в 64-разрядной версии Microsoft Office.You only need to modify VBA code if it runs in the 64-bit version of Microsoft Office.

Проблема с выполнением унаследованного программного кода VBA в 64-разрядном пакете Office заключается в том, что при попытке загрузить 64-разрядные значения в 32-разрядный тип данных 64-разрядные числа усекаются.The problem with running legacy VBA code in 64-bit Office is that trying to load 64-bits into a 32-bit data type truncates the 64-bit quantity. Это может приводить к переполнениям памяти, неожиданным результатам в коде и возможным сбоям приложения.This can result in memory overruns, unexpected results in your code, and possible application failure.

Для устранения этой проблемы и обеспечения правильной работы кода VBA как в 32-разрядных, так и в 64-разрядных средах в язык VBA добавлен ряд функциональных возможностей.To address this problem and enable VBA code to work correctly in both 32-bit and 64-bit environments, several language features have been added to VBA. Новые возможности языка VBA обобщены в таблице, представленной внизу этого документа.The table at the bottom of this document summarizes the new VBA language features. Три важных добавления: псевдоним типа LongPtr, тип данных LongLong и ключевое слово PtrSafe.Three important additions are the LongPtr type alias, the LongLong data type, and the PtrSafe keyword.

  • LongPtr.LongPtr. Теперь язык VBA включает псевдоним типа переменной LongPtr.VBA now includes the variable type alias LongPtr. Фактический тип данных, в который разрешается тип LongPtr, зависит от версии пакета Office, в котором он используется; тип LongPtr разрешается в тип Long в 32-разрядных пакетах Office, и тип LongPtr разрешается в тип LongLong в 64-разрядных версиях пакета Office.The actual data type that LongPtr resolves to depends on the version of Office that it is running in; LongPtr resolves to Long in 32-bit versions of Office, and LongPtr resolves to LongLong in 64-bit versions of Office. Используйте тип LongPtr для указателей и дескрипторов.Use LongPtr for pointers and handles.

  • LongLong.LongLong. Тип данных LongLong — это 64-разрядные целые числа со знаком, которые доступны только в 64-разрядных версиях пакета Office.The LongLong data type is a signed 64-bit integer that is only available on 64-bit versions of Office. Используйте тип LongLong для 64-разрядных целых чисел.Use LongLong for 64-bit integrals. Для явного присвоения значений типа LongLong (включая тип LongPtr на 64-разрядных платформах) целочисленным типам данных меньшего размера должны использоваться функции преобразования.Conversion functions must be used to explicitly assign LongLong (including LongPtr on 64-bit platforms) to smaller integral types. Неявные преобразования типа LongLong в меньшие целочисленные типы не допускаются.Implicit conversions of LongLong to smaller integrals are not allowed.

  • PtrSafe.PtrSafe. Ключевое слово PtrSafe декларирует, что оператор Declare безотказно выполняется в 64-разрядных версиях пакета Office.The PtrSafe keyword asserts that a Declare statement is safe to run in 64-bit versions of Office.

Важно!

Теперь все операторы Declare должны содержать ключевое слово PtrSafe, когда выполняются в 64-разрядных версиях пакета Office.All Declare statements must now include the PtrSafe keyword when running in 64-bit versions of Office. Важно понимать, что просто добавление ключевого слова PtrSafe в оператор Declare означает только, что оператор Declare явно ориентирован на 64-разрядные данные.It is important to understand that simply adding the PtrSafe keyword to a Declare statement only signifies that the Declare statement explicitly targets 64-bits. Все типы данных в операторе, предназначенные для хранения 64-разрядных значений (включая возвращаемые значения и параметры), все еще нуждаются в изменении, чтобы хранить 64-разрядные числа.All data types within the statement that need to store 64-bits (including return values and parameters) must still be modified to hold 64-bit quantities.

Примечание

Операторы Declare с ключевым словом PtrSafe представляют собой рекомендованный синтаксис.Declare statements with the PtrSafe keyword is the recommended syntax. Операторы Declare, содержащие слово PtrSafe, работают корректно в среде разработки VBA7 как на 32-разрядных, так и на 64 разрядных платформах.Declare statements that include PtrSafe work correctly in the VBA7 development environment on both 32-bit and 64-bit platforms.

Чтобы обеспечить обратную совместимость в VBA7 и более ранних версиях, используйте следующую структуру:To ensure backwards compatibility in VBA7 and earlier use the following construct:

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

Рассмотрим следующие примеры оператора Declare. Consider the following Declare statement examples. Выполнение немодифицированного оператора Declare в 64-разрядных версиях пакета Office приводит к ошибке, показывающей, что оператор Declare не содержит спецификатора PtrSafe.Running the unmodified Declare statement in 64-bit versions of Office will result in an error indicating that the Declare statement does not include the PtrSafe qualifier. Модифицированный пример кода VBA содержит спецификатор PtrSafe, однако заметим, что возвращаемое значение (указатель на активное окно) возвращает тип данных Long.The modified VBA example contains the PtrSafe qualifier, but notice that the return value (a pointer to the active window) returns a Long data type. В 64-разрядном пакете Office это неправильно, так как указатель должен быть 64-разрядным.On 64-bit Office, this is incorrect because the pointer needs to be 64-bits. Спецификатор PtrSafe сообщает компилятору, что оператор Declare ориентирован на 64-разрядные числа, так что оператор выполняется без ошибки.The PtrSafe qualifier tells the compiler that the Declare statement is targeting 64-bits, so the statement executes without error. Но поскольку возвращаемое значение не обновлено до 64-разрядного типа данных, возвращаемое значение усекается, в результате чего возвращается некорректное значение.But because the return value has not been updated to a 64-bit data type, the return value is truncated, resulting in an incorrect value returned.

Ниже приведен пример немодифицированного устаревшего оператора Declare языка VBA:Following is an unmodified legacy VBA Declare statement example:

Declare Function GetActiveWindow Lib "user32" () As Long

Приведенный ниже пример оператора Declare языка VBA модифицирован для включения спецификатора PtrSafe, но по-прежнему использует 32-разрядное возвращаемое значение:The following VBA Declare statement example is modified to include the PtrSafe qualifier but still use a 32-bit return value:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long

Чтобы повторно выполнить цикл, следует модифицировать оператор Declare для включения спецификатора PtrSafe, а также необходимо обновить все переменные в операторе, которые требуются для хранения 64-разрядных чисел, чтобы переменные использовали 64-разрядные типы данных.To reiterate, you must modify the Declare statement to include the PtrSafe qualifier, and you must update any variables within the statement that need to hold 64-bit quantities so that the variables use 64-bit data types.

Приведенный ниже пример оператора Declare языка VBA модифицирован для включения ключевого слова PtrSafe и обновлен для использования 64-разрядного типа данных (LongPtr):Following is a VBA Declare statement example that is modified to include the PtrSafe keyword and is updated to use the proper 64-bit (LongPtr) data type:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr

Итак, для правильной работы кода в 64-разрядных версиях пакета Office необходимо найти и модифицировать все существующие операторы Declare, чтобы они использовали спецификатор PtrSafe.In summary, for code to work in 64-bit versions of Office, you need to locate and modify all existing Declare statements to use the PtrSafe qualifier. Внутри этих операторов Declare также необходимо найти и модифицировать все типы данных, которые ссылаются на дескрипторы или указатели, чтобы использовать псевдоним нового 64-разрядного совместимого типа LongPtr и типы, необходимые для хранения 64-разрядных целых чисел с новым типом данных LongLong.You also need to locate and modify all data types within these Declare statements that reference handles or pointers to use the new 64-bit compatible LongPtr type alias, and types that need to hold 64-bit integrals with the new LongLong data type. Кроме того, следует обновить все определенные пользователем типы, содержащие указатели или дескрипторы и 64-разрядные целые числа, чтобы использовать 64-разрядные типы данных, и убедиться в правильности присвоений всех переменных, чтобы предотвратить появление ошибок несоответствия типов.Additionally, you must update any user defined types (UDTs) that contain pointers or handles and 64-bit integrals to use 64-bit data types, and verify that all variable assignments are correct to prevent type mismatch errors.

Написание кода, который работает как в 32-разрядных, так и 64-разрядных версиях OfficeWriting code that works on both 32-bit and 64-bit Office

Чтобы написать код, переносимый между 32-разрядными и 64-разрядными версиями Office, требуется лишь использовать для всех указателей и значений дескрипторов псевдоним нового типа LongPtr вместо типа Long или LongLong.To write code that can port between both 32-bit and 64-bit versions of Office, you only need to use the new LongPtr type alias instead of Long or LongLong for all pointers and handle values. Псевдоним типа LongPtr разрешается в правильный тип данных Long или LongLong в зависимости от того, какая версия пакета Office используется.The LongPtr type alias will resolve to the correct Long or LongLong data type depending on which version of Office is running.

Обратите внимание, что если требуется реализовать другую логику, например при работе с 64-разрядными значениями в больших проектах Excel, можно использовать константу условной компиляции Win64, как показано в следующем разделе.Note that if you require different logic to execute, for example, you need to manipulate 64-bit values in large Excel projects, you can use the Win64 conditional compilation constant as shown in the following section.

Написание кода, который работает как в Office 2010 (32-разрядный или 64-разрядный пакет), так и в предыдущих версиях OfficeWriting code that works on both Office 2010 (32-bit or 64-bit) and previous versions of Office

Чтобы написать код, работающий как в новой, так и в старой версиях Office, можно использовать комбинацию новых условных констант компилятораVBA7 и Win64.To write code that can work in both new and older versions of Office, you can use a combination of the new VBA7 and Win64 conditional Compiler constants. Условная константа компилятора Vba7 применяется, чтобы определить, работает ли программный код в версии 7 редактора VB (версия VBA, которая поставляется в Office 2010).The Vba7 conditional compiler constant is used to determine if code is running in version 7 of the VB editor (the VBA version that ships in Office 2010). Условная константа компиляции Win64 применяется, чтобы определить, какая версия (32-разрядная или 64-разрядная) Office функционирует на компьютере.The Win64 conditional compiler constant is used to determine which version (32-bit or 64-bit) of Office is running.

#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

Сводка обновлений языка VBA7Summary of VBA7 language updates

Новые дополнения языка VBA обобщаются и объясняются в приведенной ниже таблице.The following table summarizes the new VBA language additions and provides an explanation of each.

ИмяName ТипType ОписаниеDescription
PtrSafePtrSafe Ключевое словоKeyword Утверждает, что оператор Declare ориентирован на 64-разрядные системы.Asserts that a Declare statement is targeted for 64-bit systems. Требуется для 64-разрядных данных.Required on 64-bits.
LongPtrLongPtr Тип данныхData type Псевдоним типа, который отображается на тип Long в 32-разрядных системах или на тип LongLong в 64-разрядных системах.Type alias that maps to Long on 32-bit systems, or LongLong on 64-bit systems.
LongLongLongLong Тип данныхData type 8-байтный тип данных, который доступен только в 64-разрядных системах.8-byte data type that is only available on 64-bit systems. Числовой тип.Numeric type. Целые числа в диапазоне от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.Integer numbers in the range of -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.

Использование типа LongLong допустимо только на 64-разрядных платформах.LongLong is a valid declared type only on 64-bit platforms. Кроме того, тип LongLong может не преобразовываться неявно в тип данных меньшего размера (например, невозможно присвоить тип LongLong типу Long).Additionally, LongLong may not be implicitly converted to a smaller type (for example, you can't assign a LongLong to a Long). Это необходимо для предотвращения случайного усечения указателя.This is done to prevent inadvertent pointer truncation.

Явное приведение типов данных допускается, так что в приведенном выше примере можно было бы применить CLng к LongLong и присвоить результат типу Long (действительно только для 64-разрядных платформ).Explicit coercions are allowed, so in the previous example, you could apply CLng to a LongLong and assign the result to a Long (valid on 64-bit platforms only).
^ Символ объявления типа LongLongLongLong type-declaration character Явно объявляет литерал как тип LongLong.Explicitly declares a literal value as a LongLong. Требуется для объявления литерала LongLong, который больше чем максимальное значение типа Long (иначе он будет неявно преобразован в тип double).Required to declare a LongLong literal that is larger than the maximum Long value (otherwise it will get implicitly converted to double).
CLngPtrCLngPtr функция преобразования типаtype conversion function Преобразует простое выражение в LongPtr.Converts a simple expression to a LongPtr.
CLngLngCLngLng функция преобразования типаtype conversion function Преобразует простое выражение в тип данных LongLong (действительно только для 64-разрядных платформ).Converts a simple expression to a LongLong data type (valid on 64-bit platforms only).
vbLongLongvbLongLong Константа VarTypeVarType constant Целое число LongLong (действительно только для 64-разрядных платформ).LongLong integer (valid on 64-bit platforms only).
DefLngPtrDefLngPtr Оператор DefTypeDefType statement Устанавливает для диапазона переменных тип данных по умолчанию как LongPtr.Sets the default data type for a range of variables as LongPtr.
DefLngLngDefLngLng Оператор DefTypeDefType statement Устанавливает для диапазона переменных тип данных по умолчанию как LongLong.Sets the default data type for a range of variables as LongLong.

См. такжеSee also

Поддержка и обратная связьSupport and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.