Officeを新しいパソコンに入れ替えたら、今まで動いていたExcelマクロが「コンパイル エラー:このプロジェクトのコードを 64 ビット システムで使用するには、更新する必要があります」と表示されて動かなくなった——という相談は少なくありません。
この記事では、64bit版Officeでマクロが動かなくなる原因と直し方、32bit版と64bit版の両方で動く書き方を解説します。
※この記事で紹介するツールは、当ブログ(自動化ラボ)の筆者が開発・販売しているものです。
原因:Windows API を呼び出す Declare 文
ほとんどの原因は、Windows の機能(API)を呼び出す Declare 文です。64bit版のVBAでは、次の2つが必要になりました。
Declareの後ろにPtrSafeを付ける(付いていないとコンパイルエラー)- ウィンドウハンドルやポインタを受け渡す引数・戻り値を
LongからLongPtrにする(そのままだと誤動作のおそれ)
直し方
修正前(32bit版の書き方)
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
修正後(64bit版対応)
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
ポイントは、すべての Long を LongPtr にするわけではないことです。ハンドル(hWnd など)やポインタだけを LongPtr にし、回数やミリ秒などの普通の数値は Long のままにします。
関数名ごと変わるもの
GetWindowLong や SetWindowLong は、64bit版では GetWindowLongPtr / SetWindowLongPtr を呼ぶ必要があります(Alias を書き換えます)。
32bit版と64bit版の両方で動かすには
社内に32bit版のPCも残っている場合は、条件付きコンパイルで書き分けます。
#If VBA7 Then
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
#Else
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
#End If
API以外にも注意したいところ
- ハンドルを入れる変数(
Dim hWnd As Longなど)も LongPtr に VarPtr/ObjPtr/StrPtrの結果を入れる変数- ListView・TreeView などの古いコントロール(64bit版Officeに無いことがある)
チェックと修正案づくりを自動化する
Declare 文が多いブックや、ファイルが何十個もある場合、手作業で探すのは大変です。「64bit対応チェックくん」は、マクロ入りのExcelを選ぶだけで、64bit版で問題になる箇所を一覧にし、修正案と修正済みモジュール(.bas)を作ります。

- Excelのインストール不要。マクロを実行せずに読み取ります
- 元のファイルは変更しません
- 処理はPC内で完結(通信なし)
- 買い切り
まとめ
64bit版で動かないマクロの多くは、Declare に PtrSafe を付け、ハンドルやポインタを LongPtr にすることで直せます。32bit版も使うなら #If VBA7 で書き分けましょう。修正後は必ず両方の環境で動作を確認してください。
ほどき工房のExcelマクロ ツール
- マクロ解読くん:マクロの仕様書(Excel/Word)を自動作成
- 64bit対応チェックくん:64bit版で動かない書き方を検出・修正案を作成
- マクロ比較くん:改修前後のマクロを新旧対照表に
- マクロ棚卸しくん:フォルダ内のマクロを一括調査
マクロの中身の確認方法は「前任者のExcelマクロが分からない…中身を確認する5つのポイント」でも解説しています。
Microsoft Excel、Microsoft Office は Microsoft Corporation の商標です。


コメント