Office 64bit版でExcelマクロが動かない原因と直し方|PtrSafe・LongPtrの書き換え手順

Uncategorized

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マクロが分からない…中身を確認する5つのポイント」でも解説しています。

Microsoft Excel、Microsoft Office は Microsoft Corporation の商標です。

コメント

タイトルとURLをコピーしました