32ビット版、64ビット版での共用利用




32ビットExcel64ビット版Excelでも同じワークブックを開くことができます。



社内の導入されるPCはその導入時期などによってExcel(Office)のバージョンが異なることが多く、 近年では32ビット版、64ビット版が混在することも発生していると思います。



Excelワークブック自体は、開く側のExcel32ビット版であっても、64ビット版であっても区別なく開くことができるので、 特にAPIを含むマクロを実装する場合は、実行されるExcel環境が32ビット版なのか64ビット版なのかを マクロの側で判断して切り分ける必要があります。



では、この対応を行なわないとどうなるでしょうか。



従来の32ビット版APIのみを含むマクロを64ビット版Excel環境で実行すると、
64ビット版Excel環境エラー
このように「コンパイルエラー」になってしまいます。



このページでは実行されるExcel環境を見分けてAPIを呼び出すことでこのようなエラーなく運用できるようにする方法を説明します。
但し、32ビット版、64ビット版それぞれのAPI構文が解っていることが前提となります。 これらはWeb上で検索すればいくらでも見つかるものです。

例えば、コンピュータ名を取得するAPIをこの後のページで紹介していますが、 これを32ビット版、64ビット版別に記載すると、
[32ビット版]

' ■コンピュータ名取得API
Private Declare Function GetComputerName Lib "KERNEL32.dll" Alias "GetComputerNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long



[64ビット版]

' ■コンピュータ名取得API
Private Declare PtrSafe Function GetComputerName Lib "KERNEL32.dll" Alias "GetComputerNameA" _
    (ByVal lpBuffer As String, nSize As Long) As Long
となります。
このAPIの場合は「PtrSafe」の有無だけの違いですが、 「64ビットではPtrSafeを追加すれば良い」ということではなく、引数や戻り値のデータ型が異なったり、呼び出し名が違うものがあるので個々に確認して下さい。
このページでの説明はこれらの呼び出し方の区別についてです。

実際は64ビットかどうかですが....



やることは「条件付きコンパイル」です。 VBAでは、マクロの実行時に瞬時にコンパイルされるので、環境依存の部分は「条件付きコンパイル」で切り分けます。



マイクロソフトの説明を要約すると、

#If VBA7 Then
    ' VBA7以降で実行されている⇒Excel(Office)のバージョンが2010以降である
    #If Win64 Then
        ' 64ビット版Excel(Office)で実行されている ※①
    #Else
        ' 32ビット版Excel(Office)で実行されている ※②
    #End If
#Else
    ' VBA6以前で実行されている⇒Excel(Office)のバージョンが2007以前である ※③
#End If
となります。
VBA7」と「Win64」はシステムの予約語で実行環境が返されます。
作成したマクロの実行環境に関する問題ですが、「VBA7」の判断で「Else」となるのは相当古いExcel(Office)ということになり、 「社内」などある程度バージョン管理が行き届いている環境であれば無視できるのではないでしょうか。



となると、条件付きコンパイルでの64ビット版Excelかどうかの判断は、

#If Win64 Then
ですが、実際にWebサイトを検索すると大半は、

#If VBA7 Then
と記載されていると思います。
VBA7」は64ビット版Excelかどうかの判断ではなく、 利用中のExcel(Office)のバージョンが2010以降かどうかの判断になります。
つまり、実際に64ビット版Excelと目される記述で、32ビット版Excelでも動作していることになり、 現実問題として、上記の「PrtSafe」のついたAPI記述があるマクロを32ビット版Excelで実行しても問題なく動作します。



このことにより、既にサポート終了となったExcel(Office)のバージョンを利用していないのであれば、 「VBA7」などの判断なく64ビット版Excel側の運用で構わないことになります。



なお、当サイト内のサンプルについては、利用者側のExcel(Office)のバージョンが不特定なので「VBA7」の記述を残した形になっております。