64 ビット Visual Basic for Applications の概要

Microsoft Visual Basic for Applications (VBA) は、Microsoft Office に付属している Visual Basic のバージョンです。 Microsoft Office 2010 の VBA には、32 ビット版と 64 ビット版の両方の環境で VBA コードを正常に実行できるようにする言語機能が含まれています。

注:

既定で、Office 2010、2013、および 2016 では 32 ビット版がインストールされます。 64 ビット版をインストールするには、セットアップ中に明示的に選択する必要があります。 Office 2019 および Microsoft 365 以降、既定は 64 ビット版です。

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

注:

64 ビット版の Microsoft Office で実行する場合にのみ、VBA コードを変更する必要があります。

従来の VBA コードを 64 ビット版の Office で実行する場合の問題点は、64 ビットを 32 ビット データ型に読み込もうとすると、64 ビットの大きさが切り捨てられることです。 これによりメモリ オーバーランが発生し、コードが予期しない結果になり、アプリケーション障害が発生する可能性があります。

この問題に対処し、VBA コードが 32 ビットと 64 ビットの両方の環境で正しく動作できるようにするため、複数の言語機能が VBA に追加されています。 このドキュメントの下部にある表に、VBA の新しい言語機能を示します。 3 つの重要な追加機能は、LongPtr 型エイリアス、LongLong データ型、PtrSafe キーワードです。

  • LongPtr。 VBA には変数型エイリアス LongPtr が追加されています。 LongPtr が解決される実際のデータ型は、実行している Office のバージョンによって決まります。32 ビット版の Office では LongPtrLong に解決され、64 ビット版の Office では LongPtrLongLong に解決されます。 LongPtr はポインターおよびハンドルに使用します。

  • LongLongLongLong データ型は符号付きの 64 ビット整数であり、64 ビット版の Office でのみ使用できます。 LongLong は 64 ビット整数に使用します。 LongLong (64 ビットのプラットフォームの LongPtr を含む) をそれよりも小さい整数型に明示的に代入するには、変換関数を使用する必要があります。 LongLong をそれよりも小さい整数に暗黙的に変換することはできません。

  • PtrSafePtrSafe キーワードは、Declare ステートメントが 64 ビット版の Office で実行しても安全であることを示します。

重要

64 ビット版の Office で実行するときは、すべての Declare ステートメントに PtrSafe キーワードが含まれている必要があります。 PtrSafe キーワードを Declare ステートメントに追加しただけでは Declare ステートメントが 64 ビットを明示的に対象にしていることを示しているだけであると理解しておくことが重要です。 64 ビットを格納する必要があるステートメント内のすべてのデータ型 (戻り値とパラメーターを含む) を、64 ビットの大きさを保持するように変更する必要があります。

注:

PtrSafe キーワードを含む Declare ステートメントが推奨される構文です。 PtrSafe を含む Declare ステートメントは、32 ビットと 64 ビットの両方のプラットフォーム上の VBA7 開発環境で正常に動作します。

VBA7 以前との下位互換性を保証するには、次の構造を使用してください。

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

次のような Declare ステートメントの例について考えます。 修正前の Declare ステートメントを 64 ビット版の Office で実行すると、Declare ステートメントに PtrSafe 修飾子が含まれないというエラーが発生します。 修正後の VBA の例には PtrSafe 修飾子が含まれますが、戻り値 (アクティブなウィンドウへのポインター) が Long データ型を返すことに注意してください。 64 ビット版の Office では、ポインターは 64 ビットである必要があるので、これは正しくありません。 PtrSafe 修飾子はコンパイラに対して Declare ステートメントが 64 ビットを対象としていることを伝えるので、ステートメントはエラーなしで実行されます。 しかし、戻り値は 64 ビット データ型に更新されていないため、戻り値は切り捨てられて、正しくない値が返されます。

次に、修正されていない従来の VBA Declare ステートメントの例を示します。

Declare Function GetActiveWindow Lib "user32" () As Long

以下の VBA Declare ステートメントの例では、PtrSafe 修飾子を含むように修正されていますが、まだ 32 ビットの戻り値を使用しています。

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

前に説明したように、Declare ステートメントを修正して PtrSafe 修飾子を含めるだけでなく、ステートメント内で 64 ビットの大きさを保持する必要があるすべての変数を、変数が 64 ビット データ型を使用するように更新する必要もあります。

次に、PtrSafe キーワードを含むように修正され、適切な 64 ビット (LongPtr) データ型を使用するように更新された VBA Declare ステートメントの例を示します。

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

まとめると、64 ビット版の Office でコードを動作させるには、既存のすべての Declare ステートメントを探して、PtrSafe 修飾子を使用するように修正する必要があります。 また、これらの Declare ステートメント内でハンドルまたはポインターを参照しているすべてのデータ型を探して新しい 64 ビット互換の LongPtr 型エイリアスを使用するように修正し、64 ビット整数を保持する必要のある型を新しい LongLong データ型に修正する必要があります。 さらに、ユーザー定義型 (UDT) でポインターまたはハンドルを格納するもの、または 64 ビットデータ型を格納するものを、64 ビット データ型を使用するように更新し、すべての変数の代入が正しく、型不一致エラーが発生しないことを確認する必要があります。

32 ビットと 64 ビットの両方の Office で動作するコードを作成する

32 ビット版と 64 ビット版の Office の間で移植できるコードを作成するために必要なのは、すべてのポインターとハンドラーの値に Long または LongLong ではなく新しい LongPtr 型エイリアスを使用することだけです。 LongPtr 型エイリアスは、実行している Office のバージョンに応じて、適切な Long データ型または LongLong データ型に解決されます。

異なるロジックで実行する必要がある場合は (たとえば、大きい Excel プロジェクトで 64 ビットの値を操作する必要がある場合)、次のセクションで示すように Win64 条件付きコンパイル定数を使用できます。

Office 2010 (32 ビットまたは 64 ビット) と以前のバージョンの Office の両方で動作するコードの作成

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

#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 言語の更新のまとめ

次の表に、VBA 言語の新しい追加機能とその説明を示します。

名前 説明
PtrSafe キーワード Declare ステートメントが 64 ビット システムを対象としていることを示します。 64 ビットでは必須です。
LongPtr データ型 32 ビット システムの Long または 64 ビット システムの LongLong に対応する型エイリアスです。
LongLong データ型 64 ビット システムでのみ使用できる 8 バイト データ型です。 数値型。 -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 の範囲の整数値です。

LongLong は、64 ビット プラットフォームでのみ有効な宣言型です。 また、LongLong を暗黙で小さい型に変換することはできません (たとえば、LongLongLong には代入できません)。 これは、不注意によるポインターの切り捨てを防ぐためです。

明示的な強制型変換は可能なので、前の例では、CLngLongLong に適用し、結果を Long に代入できます (64 ビット プラットフォームにおいてのみ有効)。
^ LongLong 型宣言文字 リテラル値を LongLong として明示的に宣言します。 最大の Long 値より大きい LongLong リテラル値を宣言するために必要です (指定しないと、暗黙で倍精度浮動小数点型に変換されます)。
CLngPtr 型変換関数 単純な式を LongPtr に変換します。
CLngLng 型変換関数 単純な式を LongLong データ型に変換します (64 ビット プラットフォームにおいてのみ有効)。
vbLongLong VarType 定数 LongLong 型の整数 (64 ビット プラットフォームでのみ有効)。
DefLngPtr DefType ステートメント ある範囲の変数の既定のデータ型を LongPtr に設定します。
DefLngLng DefType ステートメント ある範囲の変数の既定のデータ型を LongLong に設定します。

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。