【入門編】API連携時に必須となる「LongLong型」と「LongPtr型」の64bit/32bit両対応テクニック – Excel VBA解析バイブル

スポンサーリンク

【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の基本はバッチリ。自信を持って、次の高みへ進んでください!

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