Excel VBAは、Excelの機能を自動化したり、カスタマイズしたりするのにとてもに便利なツールです。しかし、32ビット版のExcelで作成したVBAプログラムを64ビット版のExcelで動作させようとすると、いくつかの変更が必要になる場合があります。この記事では、初心者向けにその変更方法を具体的に説明します。
32ビット版と64ビット版の違い
まずは、32ビット版と64ビット版の違いについて簡単に説明します。
ビット数は、処理できるデータ量の単位です。一般的に、64ビット版は32ビット版に比べて大きなデータを扱うことができ、パフォーマンスも向上します。しかし、その反面、64ビット版は32ビット版用に書かれたプログラムをそのまま動作させることができない場合があります。
32ビット版VBAコードの典型的な問題
32ビット版のVBAで書かれたコードを64ビット版で実行しようとすると、主に次のような問題が発生することがあります。
DeclareステートメントでのPtrSafeキーワードの不足
外部ライブラリやAPIを呼び出すためのDeclareステートメントが、64ビット版ではそのまま使えないことがあります。
Long型とLongPtr型の違い
32ビット版ではLong型がよく使われますが、64ビット版ではメモリの扱い方が異なるため、LongPtr型に変更する必要があります。
Windows APIの呼び出しの問題
32ビット版用に設計されたWindows APIの呼び出しが、64ビット版では動作しないことがあります。
64ビット版での対応方法
では、32ビット版VBAコードを64ビット版で動作させるために必要な変更方法を見ていきましょう。
PtrSafeキーワードの追加
外部ライブラリやAPIを呼び出すDeclareステートメントを使う場合、64ビット版ではPtrSafeキーワードを追加する必要があります。例えば、次のようなコードがあるとします。
Declare Function GetTickCount Lib "kernel32" () As Long
このコードは32ビット版では問題なく動作しますが、64ビット版では次のように変更する必要があります。
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
PtrSafeキーワードを追加することで、このコードが64ビット版でも実行できるようになります。
LongPtr型の使用
メモリのアドレスを扱う際には、32ビット版ではLong型が一般的に使用されますが、64ビット版ではLongPtr型に変更する必要があります。例えば、次のようなコードがあるとします。
Dim hwnd As Long
64ビット版では、これを次のように変更します。
Dim hwnd As LongPtr
LongPtr型は、32ビット版と64ビット版の両方で動作します。
VBA7の条件分岐を使用
VBAのバージョンに応じてコードを切り替える方法もあります。これは、32ビット版と64ビット版の両方に対応させるために有効です。例えば、次のように条件分岐を使用してVBA7以降(64ビット対応)の場合のコードを記述します。
#If VBA7 Then
Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongPtr
#Else
Declare Function GetTickCount Lib "kernel32" () As Long
#End If
このように記述することで、VBA7以前の環境でも、VBA7以降の環境でも問題なく動作するコードが書けます。
参考: Office の 32 ビット バージョンと 64 ビット バージョン間の互換性 | Microsoft Learn
まとめ
この記事では、Excel VBAで、32ビット版から64ビット版への変更方法について説明しました。
適切な手順を踏めば、それほど難しいものではありません。PtrSafeキーワードの追加、LongPtr型の使用、条件分岐によるコードの切り替えなどを行うことで、移行はスムーズに進みます。この記事を参考に、自分のVBAコードを64ビット版で動作させ、快適なExcelの自動化を実現してください。