【VBAの深淵へ】64bit時代の必須教養:`LongPtr`と`LongLong`でAPI連携を完全制覇する
こんにちは。現場で「動けばいい」というコードを何千と見てきましたが、その先にある「落ちないコード」「誰が使っても安定するコード」を書くためには、メモリという名の深淵を少しだけ覗く必要があります。
今日は、VBAを「マクロの記録」から脱却させ、OSの心臓部(Windows API)を自在に操るための必須知識、「`LongPtr`」と「`LongLong`」について解説します。ここを理解すれば、あなたのVBAは一段上の信頼性を手に入れます。
—
1. なぜ「型の不一致」が起きるのか?
Windowsには、Excelの外側にある強力な機能(ファイル操作やウィンドウ制御など)を呼び出す「Windows API」という仕組みがあります。
かつての世界は32bitが主流でしたが、現代のPCのほとんどは64bitです。ここで問題が起きます。
- 32bitのメモリ番地(ポインタ): 4バイト
- 64bitのメモリ番地(ポインタ): 8バイト
APIを呼び出す際、VBA側が「メモリの場所(アドレス)」を渡す必要がありますが、このサイズが環境によって違うため、適当に書くとExcelが即座にクラッシュします。 これが「型の不一致」の正体です。
—
2. 二つの救世主:`LongPtr` と `LongLong`
この「環境依存問題」を解決するために、VBAには2つの型が用意されています。
① `LongPtr`(ポインタを扱うための「カメレオン型」)
これが今回の主役です。
- 32bit環境では「4バイト(Long相当)」に自動変換される。
- 64bit環境では「8バイト(LongLong相当)」に自動変換される。
- 用途: メモリ番地(ハンドル、ポインタ)を扱う時は必ずこれを使ってください。
② `LongLong`(とにかく巨大な数字を扱うための「戦車型」)
- 常に「8バイト」を確保します。
- 用途: APIの戻り値や引数で、明示的に64bitの整数値が必要な場合に使います。算術計算用と考えてください。
—
3. 実践:環境を問わないAPI宣言の書き方
APIを呼び出すときは、必ず `PtrSafe` 属性と `LongPtr` をセットで使いましょう。以下のコードは、Windowsの「Sleep関数(処理を一時停止する)」を呼び出すための標準的なテンプレートです。
If VBA7 Then
‘ VBA7 (Office 2010以降) の場合の宣言
‘ PtrSafeは「64bit環境でも安全ですよ」という宣言
Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
Else
‘ 非常に古いOfficeを使っている場合(互換性維持)
Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
Sub Test_API_Call()
‘ 1000ミリ秒(1秒)停止する
‘ 引数にLongPtrを使っているため、32bitでも64bitでもクラッシュしない
Debug.Print “停止します…”
Sleep 1000
Debug.Print “再開しました。”
End Sub
ここがポイント!
- `#If VBA7 Then`: コンパイル条件分岐です。古いVBAでは `PtrSafe` という言葉自体が存在しないため、こうやって分けるのが「伝説のコード」の定石です。
- `PtrSafe`: これを書き忘れると、64bit環境で「このコードは64bitシステムで使用するために更新する必要があります」と怒られます。
—
4. 初学者が陥りやすい罠
よくある間違いが、「何でもかんでも `LongPtr` にすればいいんでしょ?」という考えです。
- 罠: ファイルのサイズやカウントなど、ポインタ(メモリ上の住所)ではない「単なる数字」まで `LongPtr` にしないでください。それは単なるメモリの無駄遣いです。
- 正解:
- `ハンドル(hWnd)` や `ポインタ(lp…)` → `LongPtr`
- `件数` や `サイズ` → `Long` (32bit) または `LongLong` (64bit環境のみで扱う巨大な値の場合)
—
最後に:プロのエンジニアへの第一歩
「変数の型」を意識することは、コンピュータがメモリをどう扱っているかを想像することと同義です。
`LongPtr` を使いこなせれば、あなたはもう単なる「マクロ記録ユーザー」ではありません。OSの仕様を理解し、環境の変化に動じない「堅牢なシステム」を作れるエンジニアの入り口に立っています。
まずは、自分のコードの中で `Declare` 宣言をしている箇所を探してみてください。そこに `PtrSafe` はありますか?もしなければ、それがあなたのコードを強化する最高の練習台です。
ここをクリアすれば、VBAの基本はバッチリ。自信を持って、次の高みへ進んでください!
