ReDim は「動的配列のサイズを“あとから決め直す”ための命令」
ReDim は、普通の変数には使いません。
「動的配列の“箱の数”を、あとから決めたり、変えたりするための命令」です。
固定配列はこうでした。
Dim a(1 To 5) As Long ' 最初から5個と決め打ち
VB一方、動的配列はこう始まります。
Dim a() As Long ' ここではサイズを決めない
VBこの「サイズ未定の配列」に対して、
「何個にするか」を後から指定するのが ReDim の役割です。
ReDim の基本構文と「作り直す」という感覚
一番シンプルな使い方
基本形はこうです。
ReDim 配列名(下限 To 上限)
VB例えば、動的配列を宣言してからサイズを決める流れはこうなります。
Dim scores() As Long ' 動的配列として宣言
ReDim scores(1 To 5) ' ここで 1~5 の5個分の箱を用意
VBこの時点で、scores(1)~scores(5) が使えるようになります。
ここで大事なのは、
ReDim は「配列を新しく作り直す」イメージだということです。
すでに同じ配列名があっても、「前の箱を捨てて、新しい箱を並べ直す」動きになります。
中身が消えることを体感する例
Sub SampleReDimReset()
Dim a() As Long
ReDim a(1 To 3)
a(1) = 10
a(2) = 20
a(3) = 30
ReDim a(1 To 5) ' ここで作り直し
a(4) = 40
a(5) = 50
MsgBox a(1) ' ここは 0(初期値)になる
End Sub
VB最初に入れた 10, 20, 30 は、
二回目の ReDim で「配列を作り直した瞬間」に消えています。
この「ReDim したら中身はリセットされる」という性質を、
まずしっかり頭に刻んでおくことがとても重要です。
ReDim が本領発揮する場面:サイズが実行時に決まるとき
シートのデータ件数に合わせて配列サイズを決める
「A列に何行データがあるか分からないけど、全部配列に入れたい」
こういうとき、ReDim はとても自然に使えます。
Sub SampleReDimWithSheet()
Dim data() As Variant
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
ReDim data(1 To lastRow)
For i = 1 To lastRow
data(i) = Range("A" & i).Value
Next i
MsgBox "データ件数は " & lastRow & " 件です。"
End Sub
VB流れを言葉で整理すると、
最初に Dim data() As Variant で「サイズ未定の配列」を宣言する。
実際のデータ件数(lastRow)を調べる。
その件数に合わせて ReDim data(1 To lastRow) で箱の数を決める。
For でシートから配列に値を入れていく。
という形です。
「何個必要か、実行してみないと分からない」
という状況で、ReDim は「ピッタリサイズの配列」を用意するための道具になります。
ReDim Preserve との違いをしっかり区別する
ReDim だけだと「中身は捨てる」
さっきの通り、普通の ReDim は「作り直し」なので、
前に入っていたデータは全部消えます。
ReDim a(1 To 3)
' 値を入れる
ReDim a(1 To 5) ' ここで前の値は全部消える
VB「サイズを変えたいけど、中身は残したい」
というときに使うのが ReDim Preserve です。
ReDim Preserve は「中身を残したままサイズ変更」
ReDim a(1 To 3)
a(1) = 10
a(2) = 20
a(3) = 30
ReDim Preserve a(1 To 5)
a(4) = 40
a(5) = 50
VBこの場合、
a(1)~a(3) の 10,20,30 はそのまま残り、
a(4), a(5) が新しく追加されます。
ここでの超重要ポイントは、
「ReDim は“箱を作り直す”」
「ReDim Preserve は“今の中身を持ったまま箱を広げる”」
という違いです。
ReDim を使うときは、
「ここで中身を捨ててもいいのか?」
「本当は Preserve が必要じゃないか?」
を毎回意識しておくと、バグを防げます。
ReDim を何度も使うパターンと注意点
途中で「やっぱりサイズを変えたい」とき
動的配列は、処理の途中で何度でも ReDim できます。
Dim a() As Long
ReDim a(1 To 3)
' 何か処理
ReDim a(1 To 10)
' さらに処理
VBただし、繰り返しになりますが、
普通の ReDim をすると、そのたびに中身はリセットされます。
「途中でサイズを変える」=「途中で中身を捨てていい」
という意味になるので、そこを理解したうえで使う必要があります。
「とりあえず大きめに取る」か「都度 ReDim する」か
実務では、次のような選択をすることがあります。
とりあえず最大になりそうなサイズで一気に ReDim しておく。
実際に使った要素数だけを意識して処理する。
あるいは、
見つかるたびに ReDim Preserve で1つずつ増やしていく。
後者はコードとしては分かりやすいですが、
ReDim Preserve を何度も呼ぶと処理が重くなりやすい、という面もあります。
超初心者の段階では、
「まずは分かりやすさ優先で ReDim / ReDim Preserve を素直に使う」
で十分です。
慣れてきたら「パフォーマンス」も意識していく、くらいの順番で大丈夫です。
まとめ:ReDim は「動的配列の箱をいつ・何個にするか決めるスイッチ」
ReDim の本質は、
「動的配列のサイズを、あとから決めたり、作り直したりする」
という一点です。
押さえておきたいポイントをぎゅっとまとめると、
ReDim は動的配列専用で、「箱の数」を決める命令。
普通の ReDim は「配列を作り直す」ので中身は消える。
中身を残したいときは ReDim Preserve を使う。
「何個必要か実行してみないと分からない」場面で特に威力を発揮する。
