VBAで複雑なデータを扱う際、2次元配列はどうやって使うんだろう…
そんな疑問を持っていませんか?
この記事では、VBAにおける「2次元配列」を使ってデータを効率的に管理する方法を詳しく解説します。
2次元配列を使うことで、複雑なデータ構造をシンプルに扱い、プログラムの効率性を大幅に向上させることができます。
この記事では、2次元配列の基本的な概念からその使い方、さらに配列のデータをセルに貼り付ける方法まで詳しく解説します。
使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。
そもそも配列とは?という方は、そちらを解説した記事もありますので是非ご覧ください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事でできるようになること
この記事を読むことで、以下のことができるようになります。
2次元配列の基本について
2次元配列とは、行と列の両方にインデックスを持つ配列のことです。
Excelのシートのように、行と列でデータを整理するのに適しています。
2次元配列を使うことで、複数のデータセットを効率的に管理でき、VBAのプログラムの柔軟性が向上します。
グリッドによる2次元配列の視覚的な説明
2次元配列は、Excelシートのように行と列でデータを整理します。
以下のように考えると理解しやすいでしょう。
上記の例では、3行4列のデータがあり、それぞれの数字が配列の要素に対応します。
VBAでこのデータを扱う場合、myArray(1, 1)は1に、myArray(3, 4)は12に対応します。
行と列のインデックスを使うことで、特定のデータにアクセスできます。
※この説明では、エクセルの表と合わせるため、要素の下限を「1」としていますが、通常「0」から始まります。
2次元配列の宣言方法
2次元配列を宣言する際には、Dimステートメントを使用します。
配列のサイズをあらかじめ決める静的配列で宣言する方法と、後でサイズを変更できる動的配列として宣言する方法があります。
静的配列の場合
- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 行数と列数 (必須)
- 配列の行数と列数を指定します。
例えば、Dim myArray(3, 4)では、3行4列の2次元配列を作成しています。
行と列の数を指定することで、配列のサイズが決まります。
ここでは、インデックスがデフォルトで「0」から始まるため、myArray(0,0)からmyArray(3,4)までの範囲を持ちます。
- 配列の行数と列数を指定します。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
- この配列がどのような種類のデータを格納するのかを指定する部分です。
動的配列の場合
- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
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
処理結果
上記のコードでは、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
処理結果
このコードでは、セル「A1」を起点とした範囲全体をCurrentRegionを使って取得し、配列「arr」に格納しています。
2次元配列がよく使用される場面
2次元配列がよく使用される場面を紹介します。
実際の使用例については、事項の使用例で紹介しますので、そちらをご覧ください。
2次元配列を使用する際の注意ポイント
2次元配列を使用する際には、以下のポイントに注意する必要があります。
- CurrentRegionを使用して配列を取得する際の注意
- CurrentRegionを使用してExcelのデータ範囲を配列に格納すると、その配列のインデックスは通常の配列と異なり、最下位の要素が「0」ではなく「1」から始まります。
この違いを認識しておくことで、配列操作の際に予期しない動作を防ぐことができます。
- CurrentRegionを使用してExcelのデータ範囲を配列に格納すると、その配列のインデックスは通常の配列と異なり、最下位の要素が「0」ではなく「1」から始まります。
- 2次元配列のサイズ変更について
- VBAでは、2次元配列のサイズを変更する際に、最終次元(通常は列数)しか変更できません。
例えば、行数を変更したい場合は、配列全体を再宣言する必要があります。
これを理解しておくことで、予期しないエラーを防ぐことができます。
- VBAでは、2次元配列のサイズを変更する際に、最終次元(通常は列数)しか変更できません。
- 2次元配列のデータをセルに貼り付ける際の注意
- 2次元配列に格納したデータをExcelシートに一括で貼り付ける際、配列の行数と列数がシートのセル範囲と一致していることを確認する必要があります。
範囲が一致していない場合、エラーが発生する可能性があります。
- 2次元配列に格納したデータをExcelシートに一括で貼り付ける際、配列の行数と列数がシートのセル範囲と一致していることを確認する必要があります。
- Transpose関数を使用する際の注意
- Transpose関数を使用すると、2次元配列の行と列を入れ替えることができますが、行数が多すぎるとエラーが発生する可能性があります。
大量のデータを扱う場合は、手動での転置を検討する必要があります。
また、Transpose関数を使用しない場合、配列を手動で転置する方法もあります。
- Transpose関数を使用すると、2次元配列の行と列を入れ替えることができますが、行数が多すぎるとエラーが発生する可能性があります。
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
- STEP12次元配列の宣言
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行ずつ解説
- Sub PasteArrayToRange()
- 新しいサブルーチン「PasteArrayToRange」を定義しています。
このサブルーチンは、2次元配列にデータを格納し、Excelシートに貼り付ける機能を持っています。
- 新しいサブルーチン「PasteArrayToRange」を定義しています。
- Dim myArray(2, 3) As Long
- 3行4列の要素を持つ2次元配列「myArray」をLong型で宣言しています。
この配列は整数データを格納します。
- 3行4列の要素を持つ2次元配列「myArray」をLong型で宣言しています。
- myArray(0, 0) = 1 ~ myArray(2, 3) = 12
- 配列「myArray」の各要素にデータを格納します。
ここでは、myArray(0, 0)に「1」、myArray(2, 3)に「12」と、各要素に値を設定しています。
- 配列「myArray」の各要素にデータを格納します。
- Sheets(“Sheet1”).Range(“A1”).Value = myArray
- 配列「myArray」に格納されたデータを、Excelのシート「Sheet1」の範囲「A1」に一括で貼り付けます。
この操作により、配列内のデータがシートに反映されます。
- 配列「myArray」に格納されたデータを、Excelのシート「Sheet1」の範囲「A1」に一括で貼り付けます。
- 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
- STEP12次元配列の宣言
Dim arr As Variant により、2次元配列 arr を宣言します。
この配列は、シート上のデータを格納するために使用されます。 - STEP2CurrentRegionを使用して範囲全体を配列に格納
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) は列数を表しています。
処理結果
このコードで使用している機能
- With (オブジェクトを繰り返し使用)
- CurrentRegion (セル範囲を自動選択)
- LBound、UBound (配列のサイズを知る)
1行ずつ解説
- Sub ArrayAndPaste()
- VBAで新しいサブルーチン(プロシージャ)ArrayAndPasteを定義します。
このサブルーチンは、シート上のデータを配列に格納し、別のシートに貼り付ける一連の処理を実行します。
- VBAで新しいサブルーチン(プロシージャ)ArrayAndPasteを定義します。
- Dim arr As Variant
- 2次元配列「arr」を宣言します。
この配列はVariant型として宣言されており、他のさまざまなデータ型を格納できます。
この配列は後にシートから取得したデータを保持します。
- 2次元配列「arr」を宣言します。
- arr = Range(“A1”).CurrentRegion.Value
- Range(“A1”)から始まるCurrentRegion、つまり連続したデータの範囲を取得し、その範囲の値を2次元配列「arr」に格納します。
「CurrentRegion」は、空白行や空白列に囲まれた範囲を選択します。
これにより、データの範囲全体が2次元配列「arr」に保存されます。
- Range(“A1”)から始まるCurrentRegion、つまり連続したデータの範囲を取得し、その範囲の値を2次元配列「arr」に格納します。
- With Sheets(“Sheet2”)
- Withステートメントを使って、今後の操作対象を「Sheet2」に限定します。
このステートメント内で指定するSheets(“Sheet2”)がデフォルトで使われるため、コードが簡潔になります。
- Withステートメントを使って、今後の操作対象を「Sheet2」に限定します。
- .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」の内容が貼り付けられます。
- 「Sheet2」のセル範囲を指定し、その範囲に2次元配列「arr」のデータを貼り付けます。
- End With
- Withステートメントを終了します。
これにより、Sheets(“Sheet2”)に対する一連の操作が完了します。
- Withステートメントを終了します。
- End Sub
- ArrayAndPasteサブルーチンを終了します。
この行でサブルーチン全体が終了し、VBAの実行が次のプロシージャまたは命令に移ります。
- ArrayAndPasteサブルーチンを終了します。
このサブルーチンは、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の行数に合わせて貼り付け範囲を動的に調整します。
処理結果
このコードで使用している機能
- Dim (変数)
- For (繰り返し)
- CurrentRegion (セル範囲を自動選択)
- Resize (セル範囲を変更)
- LBound、UBound (配列のサイズを知る)
1行ずつ解説
- Sub FilterAndPasteData()
- 新しいサブルーチン「FilterAndPasteData」を定義します。
このサブルーチンは、シートからデータを取得し、条件に合致するデータを別のシートに貼り付ける一連の処理を実行します。
- 新しいサブルーチン「FilterAndPasteData」を定義します。
- Dim arr As Variant
- Variant型の2次元配列「arr」を宣言します。
この変数は、「CurrentRegion」から取得したデータを格納する2次元配列となります。
- Variant型の2次元配列「arr」を宣言します。
- Dim filteredArray() As Variant
- もう一つのVariant型の2次元配列「filteredArray」を宣言します。
これは、条件に合致したデータを格納するための配列です。
サイズは後でReDimで動的に指定します。
- もう一つのVariant型の2次元配列「filteredArray」を宣言します。
- Dim i As Long, j As Long
- ループカウンタ用のLong型変数「i」と「j」を宣言します。
「i」は行のカウンタとして、「j」は列のカウンタとして使用します。
- ループカウンタ用のLong型変数「i」と「j」を宣言します。
- Dim rowCount As Long
- 条件に合致する行数をカウントするためのLong型変数「rowCount」を宣言します。
この変数は、配列「filteredArray」へのデータ格納時に使用されます。
- 条件に合致する行数をカウントするためのLong型変数「rowCount」を宣言します。
- arr = Sheets(“Sheet1”).Range(“A1”).CurrentRegion.Value
- 「Sheet1」の「CurrentRegion」、つまり「A1」セルを起点とした連続するデータ範囲を取得し、その値を配列「arr」に格納します。
これにより、シート上のデータを2次元配列として扱えるようになります。
- 「Sheet1」の「CurrentRegion」、つまり「A1」セルを起点とした連続するデータ範囲を取得し、その値を配列「arr」に格納します。
- ReDim filteredArray(UBound(arr, 1) – 1, UBound(arr, 2) – 1)
- 配列「filteredArray」のサイズを、元の配列「arr」と同じサイズで初期化します。
ただし、ここでは下限を「0」から開始するために、UBound(arr, 1) – 1とUBound(arr, 2) – 1でサイズを調整しています。
これにより、配列「filteredArray」は「0」ベースのインデックスを持つ配列として設定されます。
- 配列「filteredArray」のサイズを、元の配列「arr」と同じサイズで初期化します。
- rowCount = 0
- 変数「rowCount」を「0」に初期化します。
これは、配列「filteredArray」にデータを格納する際に使用される行位置のカウンタです。
- 変数「rowCount」を「0」に初期化します。
- For i = 1 To UBound(arr, 1)
- 配列「arr」の行数だけループを回します。
「i」は現在処理している行を示します。
- 配列「arr」の行数だけループを回します。
- If arr(i, 5) >= 1200 Then
- 条件分岐を行います。
ここでは、配列「arr」の5列目の値が1200以上かどうかをチェックします。
この条件が「True」の場合、次のステップでその行のデータが配列「filteredArray」に格納されます。
- 条件分岐を行います。
- For j = 1 To UBound(arr, 2)
- 内側のループを使用して、現在の行のすべての列を処理します。
「j」は列を示し、1列目から最後の列までループします。
- 内側のループを使用して、現在の行のすべての列を処理します。
- filteredArray(rowCount, j – 1) = arr(i, j)
- 条件に合致したデータを配列「filteredArray」に格納します。
配列「filteredArray」は「0」ベースのインデックスを持つため、「j – 1」を使用して列のインデックスを調整しています。
- 条件に合致したデータを配列「filteredArray」に格納します。
- Next j
- 内側のループを終了し、次の列の処理に移ります。
- rowCount = rowCount + 1
- データを格納した後、変数「rowCount」を「1」増やします。
次に条件に合致する行が見つかった場合に備えて、次の行位置を準備します。
- データを格納した後、変数「rowCount」を「1」増やします。
- End If
- If文を終了します。
この時点で、条件に合致したデータが配列「filteredArray」に格納されています。
- If文を終了します。
- Next i
- 外側のループを終了し、次の行の処理に移ります。
- Sheets(“Sheet2”).Range(“A1”).Resize(rowCount, UBound(filteredArray, 2) + 1).Value = filteredArray
- 最後に、配列「filteredArray」の内容を「Sheet2」の「A1」セルから開始する範囲に貼り付けます。
Resizeメソッドを使用して、フィルタリングされたデータの行数に合わせて貼り付け範囲を動的に設定します。
- 最後に、配列「filteredArray」の内容を「Sheet2」の「A1」セルから開始する範囲に貼り付けます。
- End Sub
- サブルーチン「FilterAndPasteData」を終了します。
これにより、指定した条件に基づいたデータが「Sheet2」に貼り付けられます。
- サブルーチン「FilterAndPasteData」を終了します。
このコードでは、CurrentRegionを使用してシート上のデータを2次元配列に格納し、その中から特定の条件(ここでは5列目の値が1200以上)に合致するデータをフィルタリングして、別のシートに貼り付けます。
特定の条件に基づいてデータを効率的に抽出し、別シートに移動することができるため、データの整理や分析に役立ちます。
まとめ
2次元配列は、VBAプログラミングにおいて複雑なデータ構造を整理し、効率的に管理するための強力なツールです。
データをExcelシートのように扱う場面では特に有用で、柔軟で効率的なプログラム作成に貢献します。
この記事では、2次元配列の基本的な概念からデータの格納方法、さらにExcelシートへのデータの貼り付け方法まで詳しく解説しました。
これらの知識を活用することで、データ管理がよりシンプルになり、プログラムの可読性も向上します。
ポイントのおさらい
さらに学ぶために
動的配列の基本を理解したら、次は配列を使った高度なデータ操作や、他の配列関連の技術に挑戦してみましょう。
データ管理のスキルが向上し、より複雑なシナリオにも対応できるようになります。