VBAを始めよう・32/64ビット互換性

スポンサーリンク
コンピュータ

今回は、VBAの32ビットバージョンと64ビットバージョンとの互換性について記事にしています。

この記事の内容は、Office 2010 をベースに書いています。Office 2013、Office 2016、Office 2019 とは一部、見た目や文言が相違する場合があります。

Office 2010 は 2020 年 10 月 13 日にサポートが終了します。

Office 2010 のサポート終了 - Office 365
Office 2010 は 2020 年 10 月 13 日にサポートが終了します。まだ Office 2010 を使用しているお客様は、生産性を向上させるため Office 365 の導入をご検討ください。

バージョンについて

VBAのバージョン

Office2010のVBAバージョンはVBA7になります。32ビット版と64ビット版で考えると非互換部分があり、windowsAPIを使用する様なVBAでは考慮する必要があります。

1台のPCだったり、同じシステム構成のPCでの使用が分かっているのであれば専用で作成すれば良いのですが、Webで公開する場合(どんなシステム構成か不明になる)ので考慮する必要が出てきます。

この記事で書いているのは、OSの32/64ビットではありません。64ビット版windowsに32ビット版のOfficeもインストールできます。

32/64ビットの判断

Office2010から搭載されているVBA7には新しい「VBA7」と「Win64」という条件付きコンパイル定数があります。「VBA7」は、VBAバージョンが7、「Win64」は、64ビットバージョンとなります。

Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性

コードの書き方

WEB上には色々なサイトがあります。分からないことを検索して調べる事はとても重要ですが、複数のサイトを見て、この情報は本当に正しいのかという点も考えて下さい。悪意ではなく記事を書いた時点では正しい内容でも今は正しくない事もあります。

条件付きコンパイルの注意点

32ビットの場合、現行の書き方で良い。

64ビットの場合、Declare の後に、PtrSafe を追加、Long型をLongPtr型に変更する。

※Long型をLongLong型にしているサイトも見受けられます。LongLong型は64ビットバージョンの Office2010でのみ使用できる型なので推奨しません。

32/64ビットの判断

#If VBA7 And Win64 Then ' 64Bit 版
    Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
#Else ' 32Bit 版
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
#End If

「VBA7」と「Win64」定数はVBA7から追加されたので、Win64だけの分岐でも良さそうですが、念の為、VBA7とのAND条件にしています。

最後に

VBAを記述する上で何処まで考慮するかだと思います。64ビット版になると扱えるデータ量も増え、今までInteger型で管理できていた内容が オーバーフローする可能性もあります。個人的な考えですが、VBAはツール的な立ち位置なので、「動作するシステム構成を指定して、簡潔に記述する」がベ ストなのかなと考えます。

コメント

タイトルとURLをコピーしました