VBAで2次元配列をマスターする:データの効率的な管理と操作方法

2次元配列について VBA

VBAで複雑なデータを扱う際、2次元配列はどうやって使うんだろう…
そんな疑問を持っていませんか?

お悩みポイント
悩む人
  • データをExcelシートのように整理して管理したい
  • 2次元配列の基本的な概念を理解したい
  • VBA初心者でも簡単に2次元配列を使いこなしたい

この記事では、VBAにおける「2次元配列」を使ってデータを効率的に管理する方法を詳しく解説します。

2次元配列を使うことで、複雑なデータ構造をシンプルに扱い、プログラムの効率性を大幅に向上させることができます。

この記事では、2次元配列の基本的な概念からその使い方、さらに配列のデータをセルに貼り付ける方法まで詳しく解説します。

使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。

そもそも配列とは?という方は、そちらを解説した記事もありますので是非ご覧ください。


【 この記事の概要 】

  よく使う度    4.5  
  難しさ     3.5  
  覚えておくと安心度    4.5  

この記事でできるようになること

この記事を読むことで、以下のことができるようになります。

この記事を見てできるようになること

2次元配列の基本について

2次元配列とは、行と列の両方にインデックスを持つ配列のことです。

Excelのシートのように、行と列でデータを整理するのに適しています。

2次元配列を使うことで、複数のデータセットを効率的に管理でき、VBAのプログラムの柔軟性が向上します。

グリッドによる2次元配列の視覚的な説明

2次元配列は、Excelシートのように行と列でデータを整理します。
以下のように考えると理解しやすいでしょう。

2次元配列とはどんなもの?

上記の例では、3行4列のデータがあり、それぞれの数字が配列の要素に対応します。
VBAでこのデータを扱う場合、myArray(1, 1)は1に、myArray(3, 4)は12に対応します。
行と列のインデックスを使うことで、特定のデータにアクセスできます。
※この説明では、エクセルの表と合わせるため、要素の下限を「1」としていますが、通常「0」から始まります。

2次元配列の宣言方法

2次元配列を宣言する際には、Dimステートメントを使用します。

配列のサイズをあらかじめ決める静的配列で宣言する方法と、後でサイズを変更できる動的配列として宣言する方法があります。

静的配列の場合

2次元配列の構成(静的配列)
設定解説
  • 配列名 (必須)
    • この配列の名前を指定します。
      配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
  • 行数と列数 (必須)
    • 配列の行数と列数を指定します。
      例えば、Dim myArray(3, 4)では、3行4列の2次元配列を作成しています。
      行と列の数を指定することで、配列のサイズが決まります。
      ここでは、インデックスがデフォルトで「0」から始まるため、myArray(0,0)からmyArray(3,4)までの範囲を持ちます。
  • 型 (必須)
    • この配列がどのような種類のデータを格納するのかを指定する部分です。
      VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。

動的配列の場合

2次元配列の構成(動的配列)
設定解説
  • 配列名 (必須)
    • この配列の名前を指定します。
      配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
  • 型 (必須)
    • この配列がどのような種類のデータを格納するのかを指定する部分です。
      VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
  • ReDim (必須)
    • 動的配列のサイズを設定・変更する際に使用します。
      ReDimを使うことで、後から配列のサイズを自由に変更できます。
  • 行数と列数 (必須)
    • 配列の行数と列数を指定します。
      例えば、Dim myArray(3, 4)では、3行4列の2次元配列を作成しています。
      行と列の数を指定することで、配列のサイズが決まります。
      ここでは、インデックスがデフォルトで「0」から始まるため、myArray(0,0)からmyArray(3,4)までの範囲を持ちます。

2次元配列にデータを格納する

2次元配列にデータを格納する際は、行と列のインデックスを使ってデータを代入します。

以下のコードは、2次元配列にデータを格納する例です。

手動でデータを格納する方法

Sub StoreDataIn2DArray()
    Dim myArray(2, 3) As Long
    
    '// データの格納
    myArray(0, 0) = 1
    myArray(0, 1) = 2
    myArray(0, 2) = 3
    myArray(0, 3) = 4
    myArray(1, 0) = 5
    myArray(1, 1) = 6
    myArray(1, 2) = 7
    myArray(1, 3) = 8
    myArray(2, 0) = 9
    myArray(2, 1) = 10
    myArray(2, 2) = 11
    myArray(2, 3) = 12
End Sub

処理結果

手動で2次元配列に格納した結果

上記のコードでは、myArrayという2次元配列を作成し、各行と列にデータを格納しています。
例えば、myArray(0, 0) = 1は、1行1列目に1を格納することを示します。

CurrentRegionを使用して範囲を配列に格納

Excelシートの範囲をそのまま2次元配列に取り込む場合、Range.CurrentRegionを使用すると便利です。
これを使うと、指定した範囲のデータを一括で配列に格納できます。

Sub GetArrayFromRange()
    Dim arr As Variant
    
    '// 範囲全体を配列に格納
    arr = Range("A1").CurrentRegion.Value
End Sub

処理結果

CurrentRegionを使用して範囲を配列に格納した結果

このコードでは、セル「A1」を起点とした範囲全体をCurrentRegionを使って取得し、配列「arr」に格納しています。

ポイント

CurrentRegionを使って取得した配列は、通常のVBA配列と異なり、下限要素が「1」から始まります。
これは、Excelのシートの行・列のインデックスが「1」から始まることと一致しています。

2次元配列がよく使用される場面

2次元配列がよく使用される場面を紹介します。
実際の使用例については、事項の使用例で紹介しますので、そちらをご覧ください。

よく使われる事例
  • 配列内のデータに基づいて条件分岐を行いたい場合
    • 2次元配列を使ってデータを管理する場合、条件分岐を組み合わせることで、配列内のデータに基づいた柔軟な処理が可能です。
      例えば、成績データを使って各生徒の合格・不合格を判定する場合に、2次元配列を活用できます。
  • データを一括でExcelシートに表示したい場合
    • Excelシートにデータを一括で表示したいとき、2次元配列を使うと、データをまとめてセルに貼り付けることができます。
      これにより、個別にデータを処理するよりも効率的に作業ができます。
  • 複数のデータを同時に処理したい場合
    • 2次元配列を使うと、複数のデータを同時に処理するのが簡単になります。
      例えば、テストの点数を集計する場合、各生徒の点数を行列で管理し、一度に計算することができます。

2次元配列を使用する際の注意ポイント

2次元配列を使用する際には、以下のポイントに注意する必要があります。

  • CurrentRegionを使用して配列を取得する際の注意
    • CurrentRegionを使用してExcelのデータ範囲を配列に格納すると、その配列のインデックスは通常の配列と異なり、最下位の要素が「0」ではなく「1」から始まります。
      この違いを認識しておくことで、配列操作の際に予期しない動作を防ぐことができます。
  • 2次元配列のサイズ変更について
    • VBAでは、2次元配列のサイズを変更する際に、最終次元(通常は列数)しか変更できません
      例えば、行数を変更したい場合は、配列全体を再宣言する必要があります。
      これを理解しておくことで、予期しないエラーを防ぐことができます。
  • 2次元配列のデータをセルに貼り付ける際の注意
    • 2次元配列に格納したデータをExcelシートに一括で貼り付ける際、配列の行数と列数がシートのセル範囲と一致していることを確認する必要があります。
      範囲が一致していない場合、エラーが発生する可能性があります。
  • Transpose関数を使用する際の注意
    • Transpose関数を使用すると、2次元配列の行と列を入れ替えることができますが、行数が多すぎるとエラーが発生する可能性があります。
      大量のデータを扱う場合は、手動での転置を検討する必要があります。
      また、Transpose関数を使用しない場合、配列を手動で転置する方法もあります。

2次元配列の使用例をご紹介

ここでは、2次元配列を活用した具体的な使用例を紹介します。

VBAを使用して実際に動作させることで、2次元配列の基本的な操作方法や実用的な活用法を学ぶことができます。

使用例1: 2次元配列にデータを格納してシートに貼り付ける

2次元配列にデータを格納し、そのデータをExcelシートに貼り付ける方法を紹介します。

主な使用用途
この方法は、大量のデータを管理し、迅速にシート上に反映させる必要がある場合に特に有効です。
個別にデータを入力する手間を省き、ミスを防ぐためにも、2次元配列を活用することで、業務の効率化を図ることが可能です。

Sub PasteArrayToRange()
    Dim myArray(2, 3) As Long
    
    '// 配列にデータを格納
    myArray(0, 0) = 1
    myArray(0, 1) = 2
    myArray(0, 2) = 3
    myArray(0, 3) = 4
    myArray(1, 0) = 5
    myArray(1, 1) = 6
    myArray(1, 2) = 7
    myArray(1, 3) = 8
    myArray(2, 0) = 9
    myArray(2, 1) = 10
    myArray(2, 2) = 11
    myArray(2, 3) = 12
    
    '// 配列のデータをシートに貼り付け
    Sheets("Sheet1").Range("A1:D3").Value = myArray
End Sub
動作概要
  • STEP1
    2次元配列の宣言

    Dim myArray(2, 3) As Longで2次元配列「myArray」を宣言します。
    この配列は、3行4列の要素を持つ配列です。

  • STEP2
    配列にデータを格納

    配列の各要素にデータを格納します。
    myArray(0, 0) = 1からmyArray(2, 3) = 12まで、12個のデータが配列に格納されます。

  • STEP3
    配列をシートに貼り付け

    配列に格納されたデータを、Sheets(“Sheet1”).Range(“A1:D3”).Value = myArrayを使ってExcelシートの範囲「A1」に一括で貼り付けます。

処理結果

使用例1の結果

このコードで使用している機能

  • なし

1行ずつ解説

コードの詳細
  1. Sub PasteArrayToRange()
    • 新しいサブルーチン「PasteArrayToRange」を定義しています。
      このサブルーチンは、2次元配列にデータを格納し、Excelシートに貼り付ける機能を持っています。
  2. Dim myArray(2, 3) As Long
    • 3行4列の要素を持つ2次元配列「myArray」をLong型で宣言しています。
      この配列は整数データを格納します。
  3. myArray(0, 0) = 1 ~ myArray(2, 3) = 12
    • 配列「myArray」の各要素にデータを格納します。
      ここでは、myArray(0, 0)に「1」、myArray(2, 3)に「12」と、各要素に値を設定しています。
  4. Sheets(“Sheet1”).Range(“A1”).Value = myArray
    • 配列「myArray」に格納されたデータを、Excelのシート「Sheet1」の範囲「A1」に一括で貼り付けます。
      この操作により、配列内のデータがシートに反映されます。
  5. End Sub
    • サブルーチンの終了を示しています。
      すべての処理が完了し、2次元配列に格納されたデータがシートに貼り付けられます。

この使用例では、2次元配列を使って複数のデータを効率的に管理し、そのデータを一括でExcelシートに反映する方法を学ぶことができます。
これにより、手動でデータを入力する手間を省き、より迅速なデータ処理が可能になります。

使用例2: CurrentRegion使ってシートにデータを貼り付ける

CurrentRegionを使ってシート上のデータを2次元配列に格納し、そのデータを別のシートに貼り付ける方法を紹介します。

主な使用用途
このコードは、シート上のデータを2次元配列に格納し、そのデータを別のシートに一括で貼り付ける場合に使用します。
これにより、データの効率的な転送が可能となり、手動でのデータコピーよりも迅速かつ正確に処理が行えます。

Sub ArrayAndPaste()
    Dim arr As Variant
    
    '// 範囲全体を配列に格納
    arr = Range("A1").CurrentRegion.Value
    
    '// データをシートに貼り付け
    With Sheets("Sheet2")
        .Range(.Cells(1, 1), .Cells(UBound(arr, 1), UBound(arr, 2))) = arr
    End With
End Sub
動作概要
  • STEP1
    2次元配列の宣言

    Dim arr As Variant により、2次元配列 arr を宣言します。
    この配列は、シート上のデータを格納するために使用されます。

  • STEP2
    CurrentRegionを使用して範囲全体を配列に格納

    arr = Range(“A1”).CurrentRegion.Value によって、A1セルを含む範囲全体(CurrentRegion)を2次元配列「arr」に格納します。
    「CurrentRegion」は、連続したセル範囲を自動的に選択します。

  • STEP3
    配列のデータを別のシートに貼り付け

    With Sheets(“Sheet2”) を使って、「Sheet2」を対象にします。
    .Range(.Cells(1, 1), .Cells(UBound(arr, 1), UBound(arr, 2))) = arr では、Sheet2の A1 セルから配列「arr」のデータを一括で貼り付けます。
    UBound(arr, 1) は配列の行数、UBound(arr, 2) は列数を表しています。

処理結果

使用例2の結果

このコードで使用している機能

1行ずつ解説

コードの詳細
  1. Sub ArrayAndPaste()
    • VBAで新しいサブルーチン(プロシージャ)ArrayAndPasteを定義します。
      このサブルーチンは、シート上のデータを配列に格納し、別のシートに貼り付ける一連の処理を実行します。
  2. Dim arr As Variant
    • 2次元配列「arr」を宣言します。
      この配列はVariant型として宣言されており、他のさまざまなデータ型を格納できます。
      この配列は後にシートから取得したデータを保持します。
  3. arr = Range(“A1”).CurrentRegion.Value
    • Range(“A1”)から始まるCurrentRegion、つまり連続したデータの範囲を取得し、その範囲の値を2次元配列「arr」に格納します。
      「CurrentRegion」は、空白行や空白列に囲まれた範囲を選択します。
      これにより、データの範囲全体が2次元配列「arr」に保存されます。
  4. With Sheets(“Sheet2”)
    • Withステートメントを使って、今後の操作対象を「Sheet2」に限定します。
      このステートメント内で指定するSheets(“Sheet2”)がデフォルトで使われるため、コードが簡潔になります。
  5. .Range(.Cells(1, 1), .Cells(UBound(arr, 1), UBound(arr, 2))) = arr
    • 「Sheet2」のセル範囲を指定し、その範囲に2次元配列「arr」のデータを貼り付けます。
      • .Cells(1, 1)は「Sheet2」の「A1」セルを指定します。
      • .Cells(UBound(arr, 1), UBound(arr, 2))は、2次元配列「arr」の行数と列数の最終セルを指定します。
        UBound(arr, 1)は配列の行の上限インデックス(最終行)、UBound(arr, 2)は配列の列の上限インデックス(最終列)を表します。
      • Range(.Cells(1, 1), .Cells(UBound(arr, 1), UBound(arr, 2)))は、「A1」セルから始まり、2次元配列「arr」のサイズに対応する範囲を表します。
        この範囲に2次元配列「arr」の内容が貼り付けられます。
  6. End With
    • Withステートメントを終了します。
      これにより、Sheets(“Sheet2”)に対する一連の操作が完了します。
  7. End Sub
    • ArrayAndPasteサブルーチンを終了します。
      この行でサブルーチン全体が終了し、VBAの実行が次のプロシージャまたは命令に移ります。

このサブルーチンは、ExcelのSheet1にあるデータをすべてコピーし、Sheet2に一括で貼り付けることができます。
手動でのコピー&ペースト操作よりも正確で効率的です。
特に、データ量が多い場合や定期的に行う操作を自動化したい場合に非常に便利です。

使用例3: CurrentRegionで取得したデータに条件分岐を適用し、別のシートに貼り付ける

この例では、CurrentRegionを使ってシート上のデータを2次元配列に格納し、その配列のデータに条件分岐を適用してから、条件に合致するデータのみを別のシートに貼り付ける方法を紹介します。

主な使用用途
CurrentRegionで取得したデータを条件分岐に基づいてフィルタリングし、条件に合致するデータだけを別のシートに転記する操作を行います。
これにより、大量のデータから特定の条件に一致する情報を効率的に抽出し、別の場所に出力することが可能になります。

Sub FilterAndPasteData()
    Dim arr As Variant
    Dim filteredArray() As Variant
    Dim i As Long, j As Long
    Dim rowCount As Long
    
    '// 範囲全体を配列に格納
    arr = Sheets("Sheet1").Range("A1").CurrentRegion.Value
    
    '// フィルタリングしたデータを格納する配列のサイズを初期化
    ReDim filteredArray(UBound(arr, 1) - 1, UBound(arr, 2) - 1)
    rowCount = 0
    
    '// 条件に合うデータのみを別の配列に格納
    For i = 1 To UBound(arr, 1)
        If arr(i, 5) >= 1200 Then '// 例えば、5列目の値が1200以上の場合にデータを抽出
            For j = 1 To UBound(arr, 2)
                filteredArray(rowCount, j - 1) = arr(i, j)
            Next j
            rowCount = rowCount + 1
        End If
    Next i
    
    '// フィルタリングしたデータをSheet2に貼り付け
    Sheets("Sheet2").Range("A1").Resize(rowCount, UBound(filteredArray, 2) + 1).Value = filteredArray
End Sub
動作概要
  • STEP1
    シートからデータを配列に格納

    Sheets(“Sheet1”).Range(“A1”).CurrentRegion.Valueを使用して、Sheet1のA1セルを起点とした連続するデータ範囲を取得し、その値をarrという2次元配列に格納します。この配列には、Sheet1のデータ範囲全体が含まれます。

  • STEP2
    フィルタリング用の配列を初期化

    ReDimステートメントを使用して、フィルタリングされたデータを格納する配列filteredArrayのサイズを、元の配列arrと同じサイズで初期化します。rowCount変数は、条件に合致するデータの行数をカウントするために使用します。

  • STEP3
    条件に合うデータを抽出

    Forループを使用して、元の配列arrの各行をチェックします。5列目の値が1200以上の場合、その行全体をfilteredArrayに格納します。格納後にrowCountを1増やし、次の条件に合致する行のためのインデックスを準備します。

  • STEP4
    フィルタリングしたデータを別のシートに貼り付け

    最後に、filteredArrayに格納されたデータをSheet2のA1セルから開始する範囲に貼り付けます。Resizeメソッドを使用して、filteredArrayの行数に合わせて貼り付け範囲を動的に調整します。

処理結果

使用例3の結果

このコードで使用している機能

1行ずつ解説

コードの詳細
  1. Sub FilterAndPasteData()
    • 新しいサブルーチン「FilterAndPasteData」を定義します。
      このサブルーチンは、シートからデータを取得し、条件に合致するデータを別のシートに貼り付ける一連の処理を実行します。
  2. Dim arr As Variant
    • Variant型の2次元配列「arr」を宣言します。
      この変数は、「CurrentRegion」から取得したデータを格納する2次元配列となります。
  3. Dim filteredArray() As Variant
    • もう一つのVariant型の2次元配列「filteredArray」を宣言します。
      これは、条件に合致したデータを格納するための配列です。
      サイズは後でReDimで動的に指定します。
  4. Dim i As Long, j As Long
    • ループカウンタ用のLong型変数「i」と「j」を宣言します。
      「i」は行のカウンタとして、「j」は列のカウンタとして使用します。
  5. Dim rowCount As Long
    • 条件に合致する行数をカウントするためのLong型変数「rowCount」を宣言します。
      この変数は、配列「filteredArray」へのデータ格納時に使用されます。
  6. arr = Sheets(“Sheet1”).Range(“A1”).CurrentRegion.Value
    • 「Sheet1」の「CurrentRegion」、つまり「A1」セルを起点とした連続するデータ範囲を取得し、その値を配列「arr」に格納します。
      これにより、シート上のデータを2次元配列として扱えるようになります。
  7. ReDim filteredArray(UBound(arr, 1) – 1, UBound(arr, 2) – 1)
    • 配列「filteredArray」のサイズを、元の配列「arr」と同じサイズで初期化します。
      ただし、ここでは下限を「0」から開始するために、UBound(arr, 1) – 1とUBound(arr, 2) – 1でサイズを調整しています。
      これにより、配列「filteredArray」は「0」ベースのインデックスを持つ配列として設定されます。
  8. rowCount = 0
    • 変数「rowCount」を「0」に初期化します。
      これは、配列「filteredArray」にデータを格納する際に使用される行位置のカウンタです。
  9. For i = 1 To UBound(arr, 1)
    • 配列「arr」の行数だけループを回します。
      「i」は現在処理している行を示します。
  10. If arr(i, 5) >= 1200 Then
    • 条件分岐を行います。
      ここでは、配列「arr」の5列目の値が1200以上かどうかをチェックします。
      この条件が「True」の場合、次のステップでその行のデータが配列「filteredArray」に格納されます。
  11. For j = 1 To UBound(arr, 2)
    • 内側のループを使用して、現在の行のすべての列を処理します。
      「j」は列を示し、1列目から最後の列までループします。
  12. filteredArray(rowCount, j – 1) = arr(i, j)
    • 条件に合致したデータを配列「filteredArray」に格納します。
      配列「filteredArray」は「0」ベースのインデックスを持つため、「j – 1」を使用して列のインデックスを調整しています。
  13. Next j
    • 内側のループを終了し、次の列の処理に移ります。
  14. rowCount = rowCount + 1
    • データを格納した後、変数「rowCount」を「1」増やします
      次に条件に合致する行が見つかった場合に備えて、次の行位置を準備します。
  15. End If
    • If文を終了します。
      この時点で、条件に合致したデータが配列「filteredArray」に格納されています。
  16. Next i
    • 外側のループを終了し、次の行の処理に移ります。
  17. Sheets(“Sheet2”).Range(“A1”).Resize(rowCount, UBound(filteredArray, 2) + 1).Value = filteredArray
    • 最後に、配列「filteredArray」の内容を「Sheet2」の「A1」セルから開始する範囲に貼り付けます
      Resizeメソッドを使用して、フィルタリングされたデータの行数に合わせて貼り付け範囲を動的に設定します。
  18. End Sub
    • サブルーチン「FilterAndPasteData」を終了します。
      これにより、指定した条件に基づいたデータが「Sheet2」に貼り付けられます。

このコードでは、CurrentRegionを使用してシート上のデータを2次元配列に格納し、その中から特定の条件(ここでは5列目の値が1200以上)に合致するデータをフィルタリングして、別のシートに貼り付けます。
特定の条件に基づいてデータを効率的に抽出し、別シートに移動することができるため、データの整理や分析に役立ちます。

まとめ

2次元配列は、VBAプログラミングにおいて複雑なデータ構造を整理し、効率的に管理するための強力なツールです。
データをExcelシートのように扱う場面では特に有用で、柔軟で効率的なプログラム作成に貢献します。

この記事では、2次元配列の基本的な概念からデータの格納方法、さらにExcelシートへのデータの貼り付け方法まで詳しく解説しました。
これらの知識を活用することで、データ管理がよりシンプルになり、プログラムの可読性も向上します。

ポイントのおさらい

さらに学ぶために

動的配列の基本を理解したら、次は配列を使った高度なデータ操作や、他の配列関連の技術に挑戦してみましょう。
データ管理のスキルが向上し、より複雑なシナリオにも対応できるようになります。

タイトルとURLをコピーしました