64 ビット Visual Basic for Applications の概要64-bit Visual Basic for Applications overview

Microsoft Visual Basic for Applications (VBA) は、Microsoft Office に付属している Visual Basic のバージョンです。Microsoft Visual Basic for Applications (VBA) is the version of Visual Basic that ships with Microsoft Office. Microsoft Office 2010 の VBA には、32 ビット版と 64 ビット版の両方の環境で VBA コードを正常に実行できるようにする言語機能が含まれています。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.

Office 2010 のリリース (VBA バージョン 6 以前) より前に 64 ビット プラットフォームで作成された VBA コードを実行すると、コードが Office の 64 ビット版で実行するように変更されていない場合は、エラーが発生する可能性があります。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. このエラーは、バージョン 6 以前の VBA では、暗黙で 32 ビット プラットフォームが対象になっており、通常は、ポインターやハンドルに 32 ビット データ型を使用する Windows API を呼び出す Declare ステートメント が含まれるために発生します。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 以前では、ポインターまたはハンドルに対する特定のデータ型がなく、32 ビットで 4 バイトのデータ型である Long データ型がポインターおよびハンドルを参照するために使用されています。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.

注意

64 ビット版の Microsoft Office で実行する場合にのみ、VBA コードを変更する必要があります。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. 3 つの重要な追加機能は、LongPtr 型エイリアス、LongLong データ型、PtrSafe キーワードです。Three important additions are the LongPtr type alias, the LongLong data type, and the PtrSafe keyword.

  • LongPtrLongPtr. VBA には変数型エイリアス LongPtr が追加されています。VBA now includes the variable type alias LongPtr. LongPtr が解決される実際のデータ型は、実行している Office のバージョンによって決まります。32 ビット版の Office では LongPtrLong に解決され、64 ビット版の Office では LongPtrLongLong に解決されます。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.

  • LongLongLongLong. 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 (64 ビットのプラットフォームの LongPtr を含む) をそれよりも小さい整数型に明示的に代入するには、変換関数を使用する必要があります。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.

  • PtrSafePtrSafe. PtrSafe キーワードは、Declare ステートメントが 64 ビット版の Office で実行しても安全であることを示します。The PtrSafe keyword asserts that a Declare statement is safe to run in 64-bit versions of Office.

重要

64 ビット版の Office で実行するときは、すべての Declare ステートメントに PtrSafe キーワードが含まれている必要があります。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.

注意

PtrSafe キーワードを含む Declare ステートメントが推奨される構文です。Declare statements with the PtrSafe keyword is the recommended syntax. PtrSafe を含む Declare ステートメントは、32 ビットと 64 ビットの両方のプラットフォーム上の VBA7 開発環境で正常に動作します。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.

次に、修正されていない従来の VBA Declare ステートメントの例を示します。Following is an unmodified legacy VBA Declare statement example:

Declare Function GetActiveWindow Lib "user32" () As Long

以下の VBA Declare ステートメントの例では、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.

次に、PtrSafe キーワードを含むように修正され、適切な 64 ビット (LongPtr) データ型を使用するように更新された VBA Declare ステートメントの例を示します。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. さらに、ユーザー定義型 (UDT) でポインターまたはハンドルを格納するもの、または 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 ビットの両方の Office で動作するコードを作成するWriting code that works on both 32-bit and 64-bit Office

32 ビット版と 64 ビット版の Office の間で移植できるコードを作成するために必要なのは、すべてのポインターとハンドラーの値に Long または LongLong ではなく新しい LongPtr 型エイリアスを使用することだけです。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 型エイリアスは、実行している Office のバージョンに応じて、適切な Long データ型または LongLong データ型に解決されます。The LongPtr type alias will resolve to the correct Long or LongLong data type depending on which version of Office is running.

異なるロジックで実行する必要がある場合は (たとえば、大きい Excel プロジェクトで 64 ビットの値を操作する必要がある場合)、次のセクションで示すように 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 ビット) と以前のバージョンの Office の両方で動作するコードの作成Writing code that works on both Office 2010 (32-bit or 64-bit) and previous versions of Office

新しいバージョンと以前のバージョンの両方の Office で動作可能なコードを作成するには、新しい VBA7Win64 の条件付きコンパイラ定数を組み合わせて使用することができます。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 エディター (Office 2010 に付属する VBA のバージョン) で実行するかどうかを判別するために使用されます。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 条件付きコンパイル定数は、実行している Office のバージョン (32 ビットまたは 64 ビット) を特定するために使用されます。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 

VBA7 言語の更新のまとめSummary 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 32 ビット システムの Long または 64 ビット システムの LongLong に対応する型エイリアスです。Type alias that maps to Long on 32-bit systems, or LongLong on 64-bit systems.
LongLongLongLong データ型Data type 64 ビット システムでのみ使用できる 8 バイト データ型です。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 を暗黙で小さい型に変換することはできません (たとえば、LongLongLong には代入できません)。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.

明示的な強制型変換は可能なので、前の例では、CLngLongLong に適用し、結果を 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).
^ LongLong 型宣言文字LongLong type-declaration character リテラル値を LongLong として明示的に宣言します。Explicitly declares a literal value as a LongLong. 最大の Long 値より大きい LongLong リテラル値を宣言するために必要です (指定しないと、暗黙で倍精度浮動小数点型に変換されます)。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 VarType 定数VarType constant LongLong 型の整数 (64 ビット プラットフォームでのみ有効)。LongLong integer (valid on 64-bit platforms only).
DefLngPtrDefLngPtr DefType ステートメントDefType statement ある範囲の変数の既定のデータ型を LongPtr に設定します。Sets the default data type for a range of variables as LongPtr.
DefLngLngDefLngLng DefType ステートメントDefType 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.