はじめに:最近は64bitが主流
近年、Officeのインストールが既定で64bit版になったことで、従来の32bit向けに書かれたVBAコードで次のような問題が頻発しています。
- **「PtrSafe属性が必要です」**というコンパイルエラー
- API関数が呼び出せない、クラッシュする
- 古いシステムやアドインが64bitで動かない
本記事では、32bit VBAから64bit Office環境への移行で必要なすべての対応手順を解説します。
1.64bit版Officeで発生する主なエラー

このエラーは、Win32 API宣言などに64bit対応の属性が付いていないことが原因です。
2.64bitと32bitのVBAの違いとは?
項目 | 32bit VBA | 64bit VBA |
---|---|---|
Long型 | 32bit整数(4バイト) | 変わらない |
LongPtr型 | なし | アドレス格納用の新型 |
Declare文 | PtrSafeなし | PtrSafe 必須 |
APIの型 | Long , Integer | LongPtr などに変更必要 |
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)」 | Long → LongPtr へ置換 |
「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対応手順