VBA 32Bit版と64Bit版でDeclareステートメントの宣言を分ける方法
MS Office は、Version2010 より、32Bit 版と 64Bit 版が
リリースされました。
64Bit 版 Office では、32Bit 版に比べて使用できるメモリ容量が大きくなり、2GB を超えるサイズのファイルを扱うことができるようになりました。
これに伴い、VBA も VBA7 (Microsoft Visual Basic for Applications 7.0) にバージョンアップされました。
64Bit 版では、ポインターやハンドルのサイズが 32Bit 版に比べて大きくなったため、Long 型を使用すると予期しないエラーが発生する可能性があります。
そのため、Office 2010 以降ではその問題に対応した新しいデータ型として、LongPtr 型(ポインターデータ型)と LongLong型(64Bit 数値型)が追加されています。型変換するための CLngPtr() や CLngLng() も追加されています。
64Bit 版では、Declare ステートメントを使って Windows API を呼び出す場合、これまで使っていた Long 型を適切な形で置き換える必要があります。そうなると、32Bit 版なのか、64Bit 版なのかを判別する方法が必要になります。
Office 2010 以降、VBA7 と Win64 という条件付きコンパイル定数が追加されました。
VBA7 は VBA のバージョンを区別するもので、Win64 は 32Bit/64Bit を区別するために利用します。
また、64Bit 版では Declare ステートメントに PtrSafe 属性がないとコンパイル時にエラーが発生します。
実際のソースです。
'--------------------------------------------
' Win32APIをVBAから呼び出すための定義
'--------------------------------------------
#If VBA7 And Win64 Then
Public Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
#Else
Public Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
#End If
64ビット版Excelで表示した場合。32ビット版の記述は赤字になるがコンパイルエラーにはならない。
このため、Excelを開いた直後から64ビット版のプログラムが利用できます。