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.
  • 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
  • お客様にとって本当に良いことかを第一に考える人
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次