Excelマクロ起動時に、突然の「コンパイルエラー」
このコンパイルエラーについて、回避策をまとめました。
コンパイルエラー:
「このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントに、PtrSafe属性を設定してください。」
という内容でエラーが表示される場合の対処法についてご紹介したいと思います。
Office 32ビット版の環境でExcelマクロを利用していたが、最近、Office365導入により、新たなパソコン環境で当該エラーに遭遇するケースがありますが、VBAソースへの部分改修などで対応が可能です。
Excel には、[32ビット版]と[64ビット版]が存在する?
Microsoft Excel アプリケーションは、[32ビット版]と[64ビット版]が存在します。
Excelをインストールする際に、これまでは、「32ビット版」が規定値だったのですが、現在では、「64ビット版」が規定値に変わりました。
あまり気にすることなく、規定値のままインストールする、という方が多いと思いますが、お使いのExcelが64ビット版であり、Excelマクロ内で、PtrSafe宣言なしで、WindowsAPIを使用している場合、このエラーが表示されますので、この場合は、APIステートメント内での宣言が必要です。
Excel 32ビット/64ビットはどこで確認できる?
Excelを起動>ファイルメニュー>アカウント>Excelのバージョン情報
で32ビット版/64ビット版いずれかのエディションが確認できるので、まずは、確認してみましょう。
こちらが64ビット版の場合、必要に応じて、Excelマクロツール内の宣言の部分修正が必要です。
「Declare」ステートメントの後に「PtrSafe」付与
【64bit対応①】
たとえば、以下のような「Declare」ステートメントが使われている場合は、「Declare」の直後に「PtrSafe」付与が必要です。
‘/ 64ビット版【対応その1】:「Declare」ステートメントの後に「PtrSafe」付与
‘////////////////////////////////////////////////////////////////////////////////////////
‘——————–【ネットワークへの参照アクセスを可能に
Declare PtrSafe Function SetCurrentDirectory Lib “kernel32” Alias “SetCurrentDirectoryA” (ByVal CurrentDir As String) As Long
‘——————–【Path存在チェックを可能に
Declare PtrSafe Function PathFileExists Lib “shlwapi” Alias “PathFileExistsA” (ByVal lpszPath As String) As Double
「#If VBA7 Then」分岐のソースを追記
【64bit対応②】
‘/ 64ビット版【対応その2】「#If VBA7 Then」分岐のソースを追記
‘////////////////////////////////////////////////////////////////////////////////////////
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
#Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
#End If
ExcelVBAバージョンの確認
ExcelVBAバージョンの確認は、Excelを起動し、[開発タブ]からExcelVBEを表示し、「バージョン情報」で確認ができます。
CSVデータ取込で、Excelメモリ不足って?
ご利用のExcelが32ビット版の場合で、大量なデータをExcelに取り込むような場合、例えば、膨大なCSVデータをインポートしてみた場合、次のエラーに遭遇。
「この操作を完了するにはメモリが不足しています。扱うデータ量を減らすか、他のアプリケーションを終了してください。使用できるメモリを増やすには、以下を検討してください。
-64ビット版のMicrosoft Excel を使う。」
よっぽど大きなFileサイズでない限り、このエラーに遭遇することも少ないのですが、この場合は、十分に検討して、Excel[64ビット版]に移行する必要があります。32ビットでしが動作しないプラグインなどもあるため、主流は64ビットに移行してゆくと思われますが、32ビットで動作するならその方が安心かもしれません。
但し、Fileサイズが直接要因の場合、それでも取込ができないケースもありますので、「手間をかけて64ビット版に移行したものの、結局、32ビット版に戻す…」というのは避けたいものですので、十分に、必要性を検討する必要があるかもしれません。