Excel VBAのWin32 APIを64bit対応する ― PtrSafeとLongPtrを正しく使い分ける

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成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、未検証ドラフト表記、速度向上と直接関係しない断定を削除。

文書情報

記事タイトル
Excel VBAのWin32 APIを64bit対応する ― PtrSafeとLongPtrを正しく使い分ける
作成日
更新日
Source URL
https://papanda925.com/?p=5544

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

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