【保存版】VBAの32bitから64bit対応方法まとめ|Declare文・API・エラー対策まで完全ガイド

Access VBA

はじめに:最近は64bitが主流

近年、Officeのインストールが既定で64bit版になったことで、従来の32bit向けに書かれたVBAコードで次のような問題が頻発しています。

  • **「PtrSafe属性が必要です」**というコンパイルエラー
  • API関数が呼び出せない、クラッシュする
  • 古いシステムやアドインが64bitで動かない

本記事では、32bit VBAから64bit Office環境への移行で必要なすべての対応手順を解説します。


1.64bit版Officeで発生する主なエラー

このエラーは、Win32 API宣言などに64bit対応の属性が付いていないことが原因です。


2.64bitと32bitのVBAの違いとは?

項目32bit VBA64bit VBA
Long型32bit整数(4バイト)変わらない
LongPtr型なしアドレス格納用の新型
Declare文PtrSafeなしPtrSafe必須
APIの型Long, IntegerLongPtrなどに変更必要

3.必須!Declare文の修正ポイント

64bit環境でWin32 APIなどの外部関数を使う場合は、すべてPtrSafeに変更する必要があります。

🔸 Before(32bit用)


Declare Function GetTickCount Lib "kernel32" () As Long

🔸 After(64bit対応済)


Declare Function GetTickCount Lib "kernel32" () As Long

🔸 引数や戻り値にポインタを使う場合(LongPtr使用)


Declare PtrSafe Function FindWindow Lib "user32" _
    Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

4.LongPtrとは?簡単に理解しよう

  • LongPtr型は、ポインタサイズに合わせて32bit/64bitで自動的に変わる特殊な型
  • API関数の戻り値やポインタ引数に使うと、安全に互換性を保てます

5.32bit/64bitを判別して分岐させる方法(マクロ互換)


#If VBA7 Then
    #If Win64 Then
        ' 64bit用のDeclare文
    #Else
        ' 32bit用のDeclare文
    #End If
#Else
    ' VBA6以前(Office 2010未満)
#End If

これにより、1つのコードで両対応が可能になります。


6.外部ライブラリ・参照設定にも注意

  • 64bit Officeでは、32bit用のDLLやActiveXコントロールが使えないことがあります
  • 外部COMコンポーネントの使用時は、64bit対応版の提供があるか確認してください
  • Oracle OO4Oや古いADOドライバは非対応 → ADO+ODBCに移行が必要

7.エラー対応チェックリスト(対処表)

エラー内容対応方法
「PtrSafe属性が必要です」Declare文に PtrSafe を追加
「型が一致しません(Long→LongPtr)」LongLongPtr へ置換
「ActiveXコンポーネントは登録されていません」対応DLLが64bitで存在するか確認
64bit環境で動かないフォーム部品古い参照ライブラリを使用していないか確認

8.安全な移行手順まとめ(実践的チェックリスト)

  • コード全体をバックアップ(.accdb + .basなど)
  • Declare文をすべて検索・修正(PtrSafe + LongPtr)
  • Longを使ったAPI戻り値・引数を LongPtr に変更
  • 64bitで非対応なActiveX/DLLがないか確認
  • #If ディレクティブで32bitと64bitの両対応に分岐
  • テスト環境(64bit Office)で動作確認
  • 外部環境(Oracle、Excel連携など)との互換性テスト
  • バージョン情報や動作条件をドキュメント化

9.よくある質問(FAQ)

Q. すべてのDeclareにPtrSafeをつければOKですか?

→ 基本的にはOKですが、戻り値や引数の型も見直す必要があります。

Q. LongPtr に変えると32bitで動かなくなりませんか?

→ VBA7以降なら自動で切り替わるため、問題ありません(#Ifで分岐も可能)。

Q. Declareを使っていないコードは修正不要?

→ はい、通常のVBA構文やAccess内の処理はそのままで問題ありません


まとめ

ポイント内容
64bit対応の主な作業Declare文の修正(PtrSafe+LongPtr)
共通化の鍵#If VBA7#If Win64 で分岐
テストすべきポイントAPIの動作・外部DLL・ActiveXの動作確認

キーワード

  • VBA 64bit 対応方法
  • VBA Declare PtrSafe 使い方
  • VBA LongPtr とは
  • VBA 64bit エラー 解決
  • Access VBA 32bit 移行
  • Office VBA 64bit対応手順

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