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

このエラーは、Win32 API宣言などに64bit対応の属性が付いていないことが原因です。
64bitと32bitのVBAの違いとは?
| 項目 | 32bit VBA | 64bit VBA |
|---|---|---|
| Long型 | 32bit整数(4バイト) | 変わらない |
| LongPtr型 | なし | アドレス格納用の新型 |
| Declare文 | PtrSafeなし | PtrSafe必須 |
| APIの型 | Long, Integer | LongPtrなどに変更必要 |
必須!Declare文の修正ポイント
64bit環境でWin32 APIなどの外部関数を使う場合は、すべてPtrSafeに変更する必要があります。
Before(32bit用)
Declare Function GetTickCount Lib "kernel32" () As Long
After(64bit対応済)
#If VBA7 Then
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
Declare Function GetTickCount Lib "kernel32" () As Long
#End If引数や戻り値にポインタを使う場合(LongPtr使用)
Declare PtrSafe Function FindWindow Lib "user32" _
Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
LongPtrとは?簡単に理解しよう

- LongPtr型は、ポインタサイズに合わせて32bit/64bitで自動的に変わる特殊な型
- API関数の戻り値やポインタ引数に使うと、安全に互換性を保てます
32bit/64bitを判別して分岐させる方法(マクロ互換)
#If VBA7 Then
#If Win64 Then
' 64bit用のDeclare文
#Else
' 32bit用のDeclare文
#End If
#Else
' VBA6以前(Office 2010未満)
#End If
これにより、1つのコードで両対応が可能になります。
外部ライブラリ・参照設定にも注意
- 64bit Officeでは、32bit用のDLLやActiveXコントロールが使えないことがあります
- 外部COMコンポーネントの使用時は、64bit対応版の提供があるか確認してください
- Oracle OO4Oや古いADOドライバは非対応 → ADO+ODBCに移行が必要
エラー対応チェックリスト(対処表)
| エラー内容 | 対応方法 |
|---|---|
| 「PtrSafe属性が必要です」 | Declare文に PtrSafe を追加 |
| 「型が一致しません(Long→LongPtr)」 | Long → LongPtr へ置換 |
| 「ActiveXコンポーネントは登録されていません」 | 対応DLLが64bitで存在するか確認 |
| 64bit環境で動かないフォーム部品 | 古い参照ライブラリを使用していないか確認 |
安全な移行手順まとめ(実践的チェックリスト)
- コード全体をバックアップ(.accdb + .basなど)
Declare文をすべて検索・修正(PtrSafe + LongPtr)Longを使ったAPI戻り値・引数をLongPtrに変更- 64bitで非対応なActiveX/DLLがないか確認
#Ifディレクティブで32bitと64bitの両対応に分岐- テスト環境(64bit Office)で動作確認
- 外部環境(Oracle、Excel連携など)との互換性テスト
- バージョン情報や動作条件をドキュメント化
よくある質問(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対応手順

