【入門編】Long型とLongLong型の使い分け:64bit環境におけるメモリ最適化とAPI呼び出しの注意点 – Excel VBA解析バイブル

スポンサーリンク

64bit時代のVBA:Long型とLongLong型を制する者が、メモリと安定を制する

こんにちは。現場で叩き上げ、数多のExcelマクロを保守・改修してきたエンジニアです。

皆さんは「とりあえず整数なら `Integer` かな? いや、なんとなく `Long` を使っておこう」と、思考停止で型を選んでいませんか? その直感、実は64bit Officeの時代には危険信号かもしれません。

今日は、なぜ現代のVBAにおいて `Long` が標準であり、なぜ時として `LongLong` という「禁断の型」が必要になるのか。その裏側にあるメモリの真実を解説します。ここを理解すれば、あなたのコードは「動く」から「堅牢で速い」へと確実に進化します。

1. そもそもなぜ「型」を意識する必要があるのか?

VBAの変数は、いわば「データを保管するための箱」です。この箱には「大きさ(メモリサイズ)」が決まっています。

  • Integer (16bit): -32,768 ~ 32,767。現代のExcelでは小さすぎて、すぐにオーバーフローします。
  • Long (32bit): 約±21億まで。現代のVBAにおける「正義」です。
  • LongLong (64bit): 桁外れの巨大数。64bit版Officeでのみ使用可能。

「大きな箱を使えばいいのでは?」と思うかもしれません。しかし、メモリは有限です。巨大な箱ばかり用意すれば、処理速度は落ち、メモリリークのリスクも高まります。適材適所こそ、プロの流儀です。

2. Long型こそが現代のスタンダード

多くの初心者が誤解していますが、32bit版でも64bit版でも、VBAの `Long` 型は非常に優秀です。

なぜか? 32bit環境のCPUは、32bit単位のデータ処理に最適化されています。64bit環境でも、VBAエンジンは `Long` を高速に処理できるよう設計されています。

鉄則:
> VBAにおいて「整数」を扱うなら、迷わず `Long` を使ってください。`Integer` を使う理由は、今やメモリが極端に不足している特殊な環境以外には存在しません。

3. LongLong型が必要になる「唯一無二」の瞬間

では、`LongLong` はいつ使うのか? それは「Windows API」を叩くときです。

Windows OS(64bit)と連携する際、メモリ上の「アドレス(場所)」を指し示すデータは、64bit幅(8バイト)でなければなりません。ここで `Long`(32bit)を使うと、「情報の切り捨て(データ損失)」や「アクセス違反(クラッシュ)」が発生します。

誤った実装と正しい実装(API呼び出しの例)

例えば、ウィンドウのハンドル(ポインタ)を取得するコードを見てみましょう。

‘ 【ダメな例:32bit環境でしか動かない】
‘ Longは32bitなので、64bit OS上のメモリ番地をすべて保持できません。
If VBA7 Then
Private Declare PtrSafe Function GetActiveWindow Lib “user32” () As Long
End If

‘ 【正しい例:PtrSafeとLongPtrを活用する】
‘ ここで登場するのが「LongPtr」という魔法の型です。
If VBA7 Then
‘ LongPtrは、32bit環境ならLong(4バイト)に、
‘ 64bit環境ならLongLong(8バイト)に自動変換されます。
Private Declare PtrSafe Function GetActiveWindow Lib “user32” () As LongPtr
End If

ここがポイント!

APIを扱う際は、`LongLong` を直接書くよりも、`LongPtr` を使いましょう。これが「環境に合わせて自動で箱の大きさを調整してくれる魔法の型」です。これを使うことで、32bit/64bit両対応の堅牢なコードが書けます。

4. 陥りやすい罠:暗黙の型変換

よくあるミスが、計算過程でのオーバーフローです。

Dim i As Long
Dim result As Long
i = 50000
result = i i ‘ ここでエラー!
‘ 50000 50000 = 25億。Longの限界(約21億)を超えてしまいます。

この場合、結果を受け取る変数を `Double`(浮動小数点型)にするか、計算途中で `CLngLng()` を使って一時的に64bitに昇格させる必要があります。

まとめ:明日からの設計ルール

1. 基本は `Long`: 整数計算はすべて `Long` で統一する。`Integer` は忘れてよい。
2. API連携は `LongPtr`: メモリアドレスを扱うときは、環境依存を自動吸収する `LongPtr` を使う。
3. `LongLong` は最後の手段: 64bit環境専用の巨大な数値を扱う場合のみ、直接 `LongLong` を使用する。

「動けばいい」というコードから、「環境の変化を許容する」コードへ。この型定義の作法を身につけるだけで、あなたのVBAエンジニアとしての格は一段上がります。

もし、「APIがうまく動かない」「謎のクラッシュが起きる」という時は、ぜひこの「箱のサイズ」を疑ってみてください。それが、伝説の自動化エンジニアへの第一歩です。

それでは、良いコーディングライフを!

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