VBA Declareステートメント 32BIT 64Bit 同時対応 | 管理人Nのブログ

管理人Nのブログ

システム開発関係者の独り言


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ビット版のプログラムが利用できます。