この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。旧本文の内部プロンプトと重複H1を除去し、VBA7のPtrSafe・LongPtrの役割が混同されないように再構成しました。検証ステータス:✅ Microsoft VBA仕様に沿って構造確認済み
64bit版OfficeでWin32 APIを呼び出すときは、API宣言へPtrSafeを追加するだけでは不十分です。引数や戻り値のうち、ポインタやハンドルのように32bit/64bitで幅が変わる値をLongPtrへ直す必要があります。
PtrSafeとLongPtrは役割が違う
PtrSafe:VBA7で64bit対応したDeclare文であることを宣言する。LongPtr:32bit OfficeではLong、64bit OfficeではLongLong相当になるポインタ用の型。
すべてのLongをLongPtrへ置換するのは誤りです。API仕様上32bit固定のDWORDなどはLongのまま扱います。
条件付きコンパイルの基本
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
#End If
古いVBA6まで本当にサポートする必要がなければ、互換コードを残すこと自体が保守負担になります。対象Officeのバージョンを先に決めてから分岐を残します。
移行時の確認ポイント
| 確認対象 | 考え方 |
|---|---|
| HWND / HANDLE / ポインタ | LongPtrを検討 |
| DWORD / BOOLなど固定幅値 | API仕様に合わせ、機械的にLongPtrへ変えない |
| Declare文 | VBA7ではPtrSafeを付与 |
| 構造体 | メンバー内のポインタ型も個別確認 |
公式情報
この記事の更新履歴
- 2026-09-14 追加:PtrSafeとLongPtrの役割分担、型ごとの確認表を追加。
- 2026-09-14 変更:API利用例中心の記事から、64bit移行時の型判断を中心とする構成へ整理。
- 2026-09-14 削除:内部style_prompt、本文H1、未検証ドラフト表記、速度向上と直接関係しない断定を削除。

