配列のメモリ効率を極める:Variant型配列 vs 静的配列の「真実」
こんにちは。Excel VBAの深淵へようこそ。
「とりあえず`Dim v As Variant`と書いておけばエラーにならないし楽だよね」……そう思っているあなた。その安易な選択が、いずれ数万行のデータを扱う際にExcelを「フリーズ」させる爆弾になることを知っていますか?
今日は、VBAという言語の「メモリの裏側」を覗き、データ型の選択がなぜパフォーマンスに直結するのか、その真実をお話しします。
—
1. なぜ「Variant型」は諸刃の剣なのか
VBAにおける`Variant`型は、いわば「何でも入る魔法の箱」です。数値、文字列、日付、果てはオブジェクトまで、型を意識せず詰め込めるため非常に便利です。
しかし、この魔法には代償があります。
`Variant`型は、格納されているデータが何であるかを判断するために、メタデータ(型情報)を常に保持しています。
- Integer/Long型: 4バイト(固定)
- Variant型: 16バイト〜22バイト(+中身のデータ量)
たった数バイトの差に見えますか?100万行のデータを配列に読み込んだとき、数メガバイトの差が「メモリの空き容量不足」という致命的なエラーを引き起こすのです。
—
2. 実測!メモリ消費量の比較
以下のコードは、10万行のデータを配列に格納した際の挙動を擬似的に示したものです。
Sub CompareMemoryEfficiency()
Dim i As Long
Dim vArr As Variant ‘ 汎用的なVariant型配列
Dim lArr(1 To 100000) As Long ‘ 厳密なLong型配列
‘ Variantは中身を判断するためにオーバーヘッドが発生する
ReDim vArr(1 To 100000)
For i = 1 To 100000
vArr(i) = i
Next i
‘ Long型はメモリ上に連続した領域を確保するため、圧倒的に高速かつ省メモリ
For i = 1 To 100000
lArr(i) = i
Next i
MsgBox “処理完了。型を明示することでメモリの断片化を防げます。”
End Sub
なぜ「静的配列」が強いのか?
`Dim lArr(1 To 100000)`のように、サイズが確定している配列を「静的配列」と呼びます。これらはコンパイル時にメモリ領域が確定するため、実行時の負荷が極めて低くなります。逆に、`ReDim`を繰り返す動的配列は、メモリの再確保(アロケーション)が発生し、断片化(フラグメンテーション)を招きます。
—
3. 配列再定義(ReDim)のコストを最小化する戦略
データ量が事前に分からない場合、ついやりがちなのが「1行増えるたびに`ReDim Preserve`」です。これはVBAにおいて最も避けるべきアンチパターンです。
‘ 【NGコード】ループのたびに再定義するのは「自殺行為」です
For i = 1 To 10000
ReDim Preserve myArr(i)
myArr(i) = Cells(i, 1).Value
Next i
推奨される「黄金律」
1. 最大値で見積もる: ワークシートの最大行(1,048,576)を超えない限り、最初から多めに確保する。
2. チャンク(塊)で拡張する: どうしても動的に増やしたい場合、1行ずつではなく「1000行ずつ」増やすアルゴリズムを実装する。
—
4. 今日からできる「メモリに優しい」VBA開発
初学者がマクロの記録から脱却し、エンジニアとして成長するための「型」の心得をまとめました。
- 変数は「ケチ」であるべき: 文字列なら`String`、整数なら`Long`(`Integer`はVBA内部で結局`Long`に変換されるため、今や`Long`一択です)。
- Variantは「逃げ道」: どうしても型が特定できないデータ(日付と数値が混在するセル範囲など)以外では使用を控える。
- 配列への転送は一括で行う: `Cells(i, 1).Value`をループで回すのは遅いです。`vData = Range(“A1:A100000”).Value`のように、セル範囲を一度にVariant型配列にぶち込むのが最速です。
—
最後に:先輩からのアドバイス
「メモリ効率を考える」ということは、単に速くするだけではありません。「コンピュータに対して敬意を払う」ということです。
プログラムがメモリをどう使い、どう捨てているかを想像できるようになれば、あなたの書くコードは驚くほど安定し、バグが減るはずです。まずは今のプロジェクトで、`Variant`と書いている場所を、適切な型に書き換えてみてください。
その小さな一歩が、あなたを「マクロを使える人」から「自動化エンジニア」へと変える鍵になります。
また次回の講義でお会いしましょう。質問があればいつでもどうぞ。あなたのコードが、より洗練されたものになることを応援しています!
