【VBAスタンダード対策】動的配列を定義する「ReDim」の基本構造を攻略!
サイズが決まっていない「動的配列」は、そのままでは使えません。ReDim ステートメントを使ってメモリ上に領域を確保する際のルールと、実行時に中身がどう変化するかという構造的特徴を確認しましょう。
1. 問題:ReDimによる配列の再定義と初期化
【 問題 】 下記のコードを実行した際、最後のメッセージボックスで表示される値として正しいものはどれでしょうか?
Sub ArrayTest()
Dim myAry() As Integer ' --- (1) 動的配列の宣言
ReDim myAry(2) ' --- (2) サイズを3つ(0-2)に決定
myAry(0) = 10
myAry(1) = 20
ReDim myAry(5) ' --- (3) サイズを6つ(0-5)に変更
MsgBox myAry(0)
End Sub
Dim myAry() As Integer ' --- (1) 動的配列の宣言
ReDim myAry(2) ' --- (2) サイズを3つ(0-2)に決定
myAry(0) = 10
myAry(1) = 20
ReDim myAry(5) ' --- (3) サイズを6つ(0-5)に変更
MsgBox myAry(0)
End Sub
① 0
② 10
③ 20
④ エラー(実行時エラー)が発生する
2. 正解:ReDimによる初期化に関する正解
正解: ① 0
3. 解説:ReDimは「箱の作り直し」である
動的配列を使う上で、ReDim がメモリに対してどのような操作を行っているか、その構造的な動きを理解することが重要です。
[ ReDimの構造的プロセス ]
1. 宣言時:Dim myAry()
「動的配列を使うよ」という名前だけの登録です。中身は空っぽで、このまま
2. 初回ReDim:ReDim myAry(2)
ここで初めてメモリ上に 0, 1, 2 の3つの箱が作られます。
3. 二度目のReDim:ReDim myAry(5)
【重要】 単なる
そのため、それまでに代入していた「10」や「20」といったデータはすべて消え去り、数値型なら「0」にリセット(初期化)されます。
1. 宣言時:Dim myAry()
「動的配列を使うよ」という名前だけの登録です。中身は空っぽで、このまま
myAry(0) = 1 と書くとエラーになります。2. 初回ReDim:ReDim myAry(2)
ここで初めてメモリ上に 0, 1, 2 の3つの箱が作られます。
3. 二度目のReDim:ReDim myAry(5)
【重要】 単なる
ReDim は、既存の配列を一度破棄し、新しいサイズの配列をゼロから作り直します。そのため、それまでに代入していた「10」や「20」といったデータはすべて消え去り、数値型なら「0」にリセット(初期化)されます。
1. ここが試験に出る!: 試験では「ReDimをすると既存のデータはどうなるか?」という点がストレートに問われます。「作り直し = 初期化」という構造を即座にイメージできるようにしましょう。
2. エンジニアの視点: 「とりあえず大きく確保し直せばいいだろう」という安易な ReDim は、データ消失のバグを生みます。もしデータを残したいなら、次の次の問題で扱う Preserve キーワードが必要になりますが、まずは「ReDim = リセット」という基本構造を叩き込むのが理系NEOな学習順序です。
4. まとめ
「ReDimは、新しい箱への完全な取り替え」。このルールがあるからこそ、配列のサイズを自由に変えられる柔軟性が生まれます。データが消えるというリスクを正しく把握して初めて、動的配列という強力な武器を使いこなせるようになるのです。
PR