忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】ReDim Preserveの「保持」と「制約」を攻略!

動的配列のサイズを変更する際、以前の ReDim だけでは中身が消えてしまいました。既存のデータを守りながら箱を大きくするには Preserve キーワードが不可欠です。しかし、この「魔法の言葉」には多次元配列における厳しい構造的制限があります。

1. 問題:ReDim Preserveで変更可能な次元

【 問題 】 下記のように宣言・代入された二次元配列 DataList があります。Preserve を使ってデータを保持したままサイズを変更しようとした際、エラーにならずに実行できるコードはどれでしょうか?

Dim DataList() As Variant
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割は回避できます。制限を知ってこそ、動的配列の真のパワーを引き出すことができるのです。


PR