- 「今日の処理データは何件だろう……。念のため多めに1万件分くらい枠を確保しておけば大丈夫かな?」
- 「あ、ReDimを使ったら、今まで入れてたデータが全部消えちゃった!どうして!?」
実務の現場でVBAを教えていると、必ずと言っていいほどぶつかる壁の1つが「配列のサイズ変更」です。
私も初心者の頃、せっかく数分かけて計算した数万件のデータを、たった1行のReDimで失ってしまったことがあります。
今日は、こうしたミスを未然に防ぎ、データを安全に保持したままサイズを変更する「ReDim Preserve」の正しい運用法を解説します。
1. なぜ「動的配列」が必要なのか?
プログラミングには、大量のデータを効率よく管理するための「仕切り付きの収納ボックス」のような仕組み、すなわち「配列」が存在します。
通常、配列のサイズを「10個分」と最初に定義すると、後から変更することはできません。これを「静的配列」と呼びます。
しかし、実際の業務では扱うデータ量が日によって大きく変動するため、固定されたサイズでは対応が難しくなります。
最大値を想定して過剰な領域を確保すると、メモリを不必要に消費し、システムの動作を遅延させる原因になります。
そこで、実行時に必要な分だけサイズを最適化できる「動的配列(ReDim)」が真価を発揮します。
2. ReDimは「初期化」、Preserveは「拡張」
ここが今回、最も重要なポイントになります。
- ReDim:領域をゼロから再定義します。既存のデータはすべて破棄されます。
- ReDim Preserve:現在のデータを維持したまま、サイズのみを変更します。
既存のデータを保持したまま要素数を増やしたい場合は、必ず「Preserve」を併記しなければなりません。
この使い分けが、データの消失を防ぐ鍵となります。
3. 実践!コピペで使える動的配列コード
例えば、件数の不明な「売上リスト」から、特定の条件に合うものだけを抽出して格納する例を見てみましょう。
Sub DynamicArrayExample()
' 変数の宣言
Dim salesData() As String ' 括弧の中を空にすると「動的配列」になります
Dim count As Long
Dim i As Long
count = 0
' 例として1から100までループ処理を行います
For i = 1 To 100
' データの数に合わせて配列を1つずつ増やす
' Preserveがないと、i=2の時にi=1のデータが消えてしまいます
ReDim Preserve salesData(count)
' 配列にデータを格納
salesData(count) = "データ " & i
' カウントを増やす
count = count + 1
Next i
' 結果を確認
For i = 0 To UBound(salesData)
Debug.Print salesData(i)
Next i
End Sub
4. ReDim Preserveの制約と注意点
非常に便利なReDim Preserveですが、一つだけ制約があります。
それは「多次元配列の場合、変更できるのは最後の次元のみ」というルールです。
例えば、2次元配列(行と列)の場合、列方向(最後の方)は増やせますが、行方向を増やすことはできません。
これを解決するには、一度「行と列を逆」にして格納し、最後に転置(入れ替え)するなどのテクニックを使いますが、まずは1次元配列の操作を確実にマスターすることが上達の近道となります。
5. 配列を使うとどれくらい速くなる?
セルに1つずつ値を書き込む処理と、配列にまとめてから一気に書き込む処理では、速度が全く違います。
10倍変わることも珍しくありません。
このスピード感こそがVBAによる自動化の醍醐味です。ぜひ取り入れてみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント