【VBAスタンダード対策】ReDim Preserveの「保持」と「制約」を攻略!
動的配列のサイズを変更する際、以前の ReDim だけでは中身が消えてしまいました。既存のデータを守りながら箱を大きくするには Preserve キーワードが不可欠です。しかし、この「魔法の言葉」には多次元配列における厳しい構造的制限があります。
1. 問題:ReDim Preserveで変更可能な次元
【 問題 】 下記のように宣言・代入された二次元配列 DataList があります。Preserve を使ってデータを保持したままサイズを変更しようとした際、エラーにならずに実行できるコードはどれでしょうか?
ReDim DataList(2, 3) ' --- 縦3×横4の配列として定義
DataList(0, 0) = "TEST"
' --- ここからサイズ変更を試みる ---
① ReDim Preserve DataList(5, 3)
② ReDim Preserve DataList(2, 5)
③ ReDim Preserve DataList(5, 5)
④ ReDim DataList(5, 5) '(Preserveなし)
2. 正解:サイズ変更の制約に関する正解
正解: ② ReDim Preserve DataList(2, 5)
3. 解説:「最後の次元」しかいじれない!
ReDim Preserve を使用して中身を保持する場合、VBAのメモリ構造上の理由から、変更できるのは「最後の次元のみ」という鉄の掟があります。
DataList( 1次元目 , 2次元目 )
↑ ↑
変更不可 変更可能!
★ ①がダメな理由:最初の次元(行方向)を変えようとしているためエラーになります。
★ ②が正解の理由:最後の次元(列方向)のみを 3 から 5 に増やしているため、構造的に許可されます[cite: 1]。
★ ④について:エラーにはなりませんが、
Preserve がないため「TEST」というデータは消えてしまいます[cite: 1]。1. ここが試験に出る!: 試験では「行方向(1次元目)を増やそうとしてエラーになるコード」が頻出します[cite: 1]。実務でどうしても行を増やしたい場合は、一度「行列を入れ替えてから拡張し、また戻す」というテクニックが必要になります。
2. エンジニアの視点: メモリを「連続した一行のデータ」として管理している古典的な言語構造ゆえの制約です。この制約があるからこそ、効率的に末尾にデータを追加できる設計になっています。理系NEOな開発者なら、最初から「変動する方を最後の次元にする」ように設計図を引くのが定石です。
4. まとめ
「データを守りたければPreserve。ただし、いじれるのは最後だけ」。このフレーズを丸暗記するだけで、配列の拡張に関するトラブルの8割は回避できます。制限を知ってこそ、動的配列の真のパワーを引き出すことができるのです。