[VBA] 64ビット版Excelでマクロが動かない事例(PtrSafe属性 Microsoft.Jet.OLEDB.4.0プロバイダ)

Pocket

ここでは、32ビット版のエクセルでは動作していたマクロを64ビット版エクセルで動かしたところ発生したエラーを紹介しています。なお、Office2010 から64ビット版アプリが提供されているようです。

他にもまだまだ、たくさんありそうな気がします

スポンサーリンク

PrtSafe属性

はずはじめはこちらのエラーです。

PtrSafe属性

このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントにPtrSafe属性を設定してください。

はい、意味がわかりませんが次のように、Declare ステートメントの後にPtrSafeを追加するだけでいいようです。もはや完全に思考が停止しています(笑)。

' 64ビット版のエクセルであるか確認
#If Win64 Then

    Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
                    ByVal lpAppName As String, _
                    ByVal lpKeyName As Any, _
                    ByVal lpDefault As String, _
                    ByVal lpReturnedString As String, _
                    ByVal nSize As Long, _
                    ByVal lpFileName As String) As Long
          

    Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
                    ByVal lpAppName As String, _
                    ByVal lpKeyName As Any, _
                    ByVal lpString As Any, _
                    ByVal lpFileName As String) As Long

#Else
' 32ビット版の場合は、現状のまま、こちらを使用する
' 動いているものは手をつけずにそのまま使う
    Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
                    ByVal lpAppName As String, _
                    ByVal lpKeyName As Any, _
                    ByVal lpDefault As String, _
                    ByVal lpReturnedString As String, _
                    ByVal nSize As Long, _
                    ByVal lpFileName As String) As Long
          
    Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
                    ByVal lpAppName As String, _
                    ByVal lpKeyName As Any, _
                    ByVal lpString As Any, _
                    ByVal lpFileName As String) As Long
#End If

Microsoft.Jet.OLEDB.4.0 プロバイダが見つからない

Accessに接続するマクロでは、Microsoft.Jet.OLEDB.4.0 を使用している場合が多いと思いますが、64ビット版では提供されていないようです。ないものはないので、使えないということです。

プロバイダーが見つかりません

実行時エラー ‘3706’:
プロバイダーが見つかりません。正しくインストールされていない可能性があります。

そのため、64ビット版でも提供されている代替の Microsoft.ACE.OLEDB.12.0 (または、それより新しいもの)を使用する必要があります。

Dim con As New ADODB.Connection

#If Win64 Then
    con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.mdb;"
#Else
    con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;"
#End If
 

Long型が意外と危険

64ビット版でマクロをコンパイルをしたところLong型の変数で「型が一致しません」と怒られていました。

LongLong型などに変更したりするとコンパイルエラーとならなくなったりもしたのですが、バリアント型変数(Variant)として宣言することで、32ビット版と64ビット版を意識せずに、マクロが勝手にいい感じに解釈してくれる可能性もあります。

面倒くさいと感じられる場合は一度、試してみるといいかもしれません。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *