Categories: excel

VBAのReDimステートメント徹底解説:配列サイズを柔軟に変更する方法と活用例

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を使う上でのベストプラクティス

  1. 事前に最大サイズが予想できる場合は静的配列を使う方が高速です。
  2. ReDim Preserve を繰り返し使うとパフォーマンスが低下します。
    • → 一時的に大きめの配列を用意し、最後に必要なサイズでカットする方法が推奨されます。
  3. 多次元配列が必要な場合は、一時配列へのコピーなどの工夫が必要です。

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 を取り入れて、より柔軟なコードを書いてみてはいかがでしょうか。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。