VBA(Visual Basic for Applications)で配列を扱う際、要素数が事前に決まっていない場合に非常に便利なのが ReDim
ステートメントです。動的配列のサイズを実行中に変更できるため、柔軟なデータ処理が可能になります。ただし、使い方を間違えるとデータが失われてしまうケースもあるため注意が必要です。本記事では、ReDim
の基本的な使い方から、データを保持したまま再定義する Preserve
オプション、実際の活用例まで、3000文字以上にわたって詳しく解説していきます。
ReDimとは?動的配列に必須のステートメント
ReDim
は「Redimension(再次元化)」の略で、動的配列の要素数を実行時に変更するために使用されます。静的配列では、あらかじめサイズを固定して宣言しますが、動的配列ではサイズを後から ReDim
を使って指定します。
Dim myArray() As Integer ' 動的配列の宣言
ReDim myArray(5) ' 要素数6の配列に初期化(0~5)
このように、ReDim
は配列のサイズを必要に応じて再定義することができます。
ReDimの基本構文
構文は以下の通りです。
ReDim [Preserve] 配列名(上限) As データ型
Preserve
(省略可能): 既存のデータを保持したまま再定義する場合に使用します配列名
: 再定義する動的配列の名前上限
: 新たに設定する配列の要素の上限インデックス(下限は0が基本)データ型
: 配列の要素の型(省略可能)
ReDimの使い方①:基本の再定義
以下は ReDim
を使って配列のサイズを変更する基本例です。
Sub Sample1()
Dim nums() As Integer
ReDim nums(3) ' 要素数4の配列に初期化
Dim i As Integer
For i = 0 To 3
nums(i) = i * 10
Next i
End Sub
このコードでは、0~3の4つの要素をもつ配列 nums
を作成し、それぞれに10の倍数を代入しています。
ReDimの使い方②:Preserveでデータを保持
通常の ReDim
は、サイズ変更時に配列の内容がすべて消えてしまいます。しかし、Preserve
キーワードを使うことで、既存のデータを保持したまま再定義することができます。
Sub Sample2()
Dim fruits() As String
ReDim fruits(1)
fruits(0) = "Apple"
fruits(1) = "Banana"
ReDim Preserve fruits(2)
fruits(2) = "Cherry"
End Sub
ここでは、もともと要素数2の配列 fruits
を作成し、その後 ReDim Preserve
を使って1つ要素を追加し、「Cherry」を代入しています。
ReDim Preserveの注意点:1次元配列に限定
ReDim Preserve
は多次元配列には使用できず、1次元配列のみ対応です。たとえば次のようなコードはエラーになります。
Dim data(,) As Integer
ReDim data(2, 2) ' 初期化
ReDim Preserve data(3, 2) ' エラー:多次元配列には使えない
多次元配列の場合、要素を保持したままサイズを変えることはできないので、別の配列にコピーする必要があります。
ReDimとForループの組み合わせ例
ReDimは、データの個数が逐次変動するようなシナリオに向いています。たとえば、ユーザー入力に応じて配列に値を追加していく場合です。
Sub Sample3()
Dim inputs() As String
Dim userInput As String
Dim count As Integer
count = 0
Do
userInput = InputBox("値を入力してください(キャンセルで終了)")
If userInput = "" Then Exit Do
ReDim Preserve inputs(count)
inputs(count) = userInput
count = count + 1
Loop
Dim i As Integer
For i = 0 To UBound(inputs)
MsgBox "入力された値:" & inputs(i)
Next i
End Sub
この例では、InputBoxで入力された値を配列に順次追加していきます。毎回 ReDim Preserve
で配列のサイズを拡張しているのがポイントです。
ReDimを使う上でのベストプラクティス
- 事前に最大サイズが予想できる場合は静的配列を使う方が高速です。
ReDim Preserve
を繰り返し使うとパフォーマンスが低下します。- → 一時的に大きめの配列を用意し、最後に必要なサイズでカットする方法が推奨されます。
- 多次元配列が必要な場合は、一時配列へのコピーなどの工夫が必要です。
ReDimを使った簡易データ収集アプリ例
最後に、ReDim
を使って簡単なデータ収集用マクロを作成してみましょう。
Sub CollectNames()
Dim names() As String
Dim i As Integer
Dim nameInput As String
i = 0
Do
nameInput = InputBox("名前を入力してください(終了するには空欄)")
If nameInput = "" Then Exit Do
ReDim Preserve names(i)
names(i) = nameInput
i = i + 1
Loop
Dim msg As String
msg = "入力された名前一覧:" & vbCrLf
For i = 0 To UBound(names)
msg = msg & "- " & names(i) & vbCrLf
Next i
MsgBox msg
End Sub
このように、ReDim
を活用することで、ユーザー入力のような動的データにも柔軟に対応できます。
まとめ
VBAの ReDim
ステートメントは、動的なデータ処理には欠かせない重要な機能です。配列のサイズを柔軟に変えられるだけでなく、Preserve
を組み合わせることで既存データを保持しながらサイズ変更が可能になります。ただし、多用するとパフォーマンスに影響を与えることもあるため、状況に応じた使い分けが必要です。
これを機に、あなたのVBAスキルに ReDim
を取り入れて、より柔軟なコードを書いてみてはいかがでしょうか。