Excel VBAでの2次元配列のReDimの使い方|業務効率化に役立つテクニック

こんにちは!大阪市を拠点に活動している『縁紡ぐ』の稲垣です。
SWELLを使ったホームページ制作や、Excel、ACCESS、RPAなどのシステム開発を行っています。
また、Excel、Word、Outlookの研修や、情報セキュリティ研修も行っています。身近なITの相談相手になりたいと思っています。
お気軽にお問い合わせください。
基本的なReDim使い方(2次元配列)
まず、ReDimを使って2次元配列のサイズを動的に変更する方法です。最初に配列のサイズを決めてから、必要に応じてReDim配列を拡張することができます。
基本的なReDim使い方
ReDimでサイズ変更してみる
まずは、直感的に使う方法で実行してみましょう。
Sub ExampleReDim2D()
Dim myArray() As Integer ' サイズ変更可能な2次元配列を宣言
' 配列にサイズを割り当てる(3行 x 2列)
ReDim myArray(1 To 3, 1 To 2)
' 値を代入
myArray(1, 1) = 10
myArray(1, 2) = 20
myArray(2, 1) = 30
myArray(2, 2) = 40
myArray(3, 1) = 50
myArray(3, 2) = 60
' 出力(デバッグ用)
Dim i As Integer, j As Integer
For i = 1 To 3
For j = 1 To 2
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
' 配列のサイズを変更(新しいサイズ: 4行 x 2列)
ReDim myArray(1 To 4, 1 To 2) ' 以前のデータは失われる
' 新しい要素に値を代入
myArray(4, 1) = 70
myArray(4, 2) = 80
' 出力(デバッグ用)
Debug.Print "配列を拡張した後:"
For i = 1 To 4
For j = 1 To 2
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
End Sub

ReDimで、宣言しなおすと以前の保持していたデータが失われます
そのため、拡張後の配列には、値がないため0が出力されています。
ReDim Preserveを使ってデータを保持しながらサイズを変更
ReDim Preserveを使うと、あなたのデータを保持した配列のサイズを変更することができます。ちなみに、2次元以上の配列の場合、最後の次元のみサイズ変更が可能です。
Sub ExampleReDimPreserve2D()
Dim myArray() As Integer ' サイズ変更可能な2次元配列を宣言
' 配列にサイズを割り当てる(2行 x 2列)
ReDim myArray(1 To 2, 1 To 2)
' 値を代入
myArray(1, 1) = 10
myArray(1, 2) = 20
myArray(2, 1) = 30
myArray(2, 2) = 40
' 出力(デバッグ用)
Debug.Print "初期配列:"
Dim i As Integer, j As Integer
For i = 1 To 2
For j = 1 To 2
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
' 配列の列数(最後の次元)を増やす(2行 x 3列に拡張)
ReDim Preserve myArray(1 To 2, 1 To 3) ' 行数は変更できない
' 新しい要素に値を代入
myArray(1, 3) = 50
myArray(2, 3) = 60
' 出力(デバッグ用)
Debug.Print "列を追加した後:"
For i = 1 To 2
For j = 1 To 3
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
End Sub

ReDim Preserveの制約
実は、ReDim Preserve
の制約があります。実際、行を増やそうとしてみることで確認ができます。
Sub ExampleReDimPreserve2D()
Dim myArray() As Integer ' サイズ変更可能な2次元配列を宣言
' 配列にサイズを割り当てる(2行 x 2列)
ReDim myArray(1 To 2, 1 To 2)
' 値を代入
myArray(1, 1) = 10
myArray(1, 2) = 20
myArray(2, 1) = 30
myArray(2, 2) = 40
' 出力(デバッグ用)
Debug.Print "初期配列:"
Dim i As Integer, j As Integer
For i = 1 To 2
For j = 1 To 2
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
' 配列の列数(最後の次元)を増やす(2行 x 3列に拡張)
ReDim Preserve myArray(1 To 3, 1 To 2) ' 行数を増やしてみる
' 新しい要素に値を代入
myArray(3, 1) = 50
myArray(3, 2) = 60
' 出力(デバッグ用)
Debug.Print "列を追加した後:"
For i = 1 To 2
For j = 1 To 3
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
End Sub
実行すると、ReDim Preserve myArray(1 To 3, 1 To 2) で、エラーになります。

ReDim Preserve myArray(1 To 2, 1 To 3)では、列(2次元目)を増やすことができますが、行(1次元目)を変更することはできません。
てことは、行を増やしたい時には使えないってことになりますよね😢
行を増やす方法
ReDim Preserveを使って行を増やせない場合、次のように新しい配列を作成して、既存の配列のデータを新しい配列にコピーして対応することで、実現します。
Sub ExampleAddRows()
Dim myArray() As Integer ' サイズ変更可能な2次元配列を宣言
' 配列にサイズを割り当てる(2行 x 2列)
ReDim myArray(1 To 2, 1 To 2)
' 値を代入
myArray(1, 1) = 10
myArray(1, 2) = 20
myArray(2, 1) = 30
myArray(2, 2) = 40
' 新しい配列を作成(3行 x 2列)
Dim newArray() As Integer
ReDim newArray(1 To 3, 1 To 2)
' 元の配列のデータを新しい配列にコピー
Dim i As Integer, j As Integer
For i = 1 To 2
For j = 1 To 2
newArray(i, j) = myArray(i, j)
Next j
Next i
' 新しいデータを追加
newArray(3, 1) = 50
newArray(3, 2) = 60
' 新しい配列を元の配列に代入
myArray = newArray
' 出力(デバッグ用)
Debug.Print "行を追加した後:"
For i = 1 To 3
For j = 1 To 2
Debug.Print "myArray(" & i & ", " & j & ") = " & myArray(i, j)
Next j
Next i
End Sub

新しい配列newArray
を作成し、元の配列myArray
のデータをコピーしています。
コピーした後に、新しい配列の追加した行に新しいデータを入れているという流れになります。
まとめ
ReDim
は2次元配列にも使用可能で、サイズを自由に変更できます。ちなみに、ReDim
使うと以前のデータは消えてしまいます。
ReDim Preserve
を使うと、データを保持しながらサイズ変更ができますが、最後の次元のみサイズ変更が可能です(列は変更できるが、行は変更できません)。
行を増やす場合は、新しい配列を作ってデータをコピーするという方法で行ってみてくださいね!

稲垣
- Excel、ACCESSでのシステム開発が得意
- ITスキルを共有し実践的に学びながら成長する人を見るのが幸せ
- 自家焙煎するほどのコーヒー好き
- 使用言語 VBA、Python、Javascript、Java、HTML、CSS etc.
- 保有資格 Kintoneアソシエイト、日商簿記検定2級、マンション管理士、管理業務主任者、情報セキュリティマネジメント、ExcelVBA etc.
- 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
- お客様にとって本当に良いことかを第一に考える人
コメント