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

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



その場合は、VBAの「2次元配列」を
使用すると解決します!
この記事では、「VBAの2次元配列」を使ってデータを効率的に管理する方法を詳しく解説します。
静的・動的な宣言方法やExcelシートへの貼り付け方法も含めて、分かりやすく解説しています。
2次元配列を使うことで、複雑なデータ構造をシンプルに扱い、プログラムの効率性を大幅に向上させることができます。 さらに、Excelシートのようなデータ操作がコード内で完結し、手作業を自動化して作業時間を大幅に短縮することができます。
使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。
そもそも配列とは?という方は、そちらを解説した記事もありますので是非ご覧ください。


【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事で「できるようになる」こと
この記事を読むことで、以下のことができるようになります。
- 2次元配列の基本を理解する
- 2次元配列でよく使われる宣言方法を確認する
- 2次元配列を使用する上での注意ポイントを理解する
- 2次元配列の使用例を確認する
VBAの2次元配列で何ができる? どんな場面で使われるの?
VBAの「2次元配列」は、データを行と列で整理して管理できる便利な仕組みです。
特に、大量のデータを効率的に処理したり、Excelシートのようにデータを視覚的に操作したりしたい場合に活躍します。
なぜ2次元配列が役立つのか?
2次元配列を使用することで、以下のようなメリットがあります。
- 作業時間と処理スピードを大幅に短縮
- 2次元配列は、Excelのセル操作と比較して圧倒的に高速です。
データがメモリ上に格納されるため、大量のデータでも瞬時に処理が可能になります。- コードの処理時間を短縮でき、複雑な計算や条件分岐も素早く実行。
- 作業時間が短縮され、日々の業務を効率化できます。
- 2次元配列は、Excelのセル操作と比較して圧倒的に高速です。
- 視覚的にデータを整理
- 2次元配列を使えば、Excelの表と同じように行と列でデータを整理できます。
これにより、プログラム内でデータ構造を直感的に理解しやすくなります。
- 2次元配列を使えば、Excelの表と同じように行と列でデータを整理できます。
- コードが簡潔に
- 複数のデータを一括で操作できるため、コードが短くなり、可読性が向上します。
後でコードを見直す際もスムーズに内容を把握できます。
- 複数のデータを一括で操作できるため、コードが短くなり、可読性が向上します。
2次元配列が良く使用される場面
VBAを使ったデータ処理において、以下のような場面で特に活用されています。
- 条件分岐で柔軟なデータ処理を行いたい場合
- 例えば、試験の成績データを2次元配列で管理し、「合格か不合格か」を判定するプログラムを作成することができます。
配列に格納したデータに条件を設定し、一括で処理することで、手作業を大幅に減らせます。- 例1: 各生徒の成績を配列に保存し、80点以上を合格と判定。
- 例2: 結果をExcelシートに自動で出力。
- 例えば、試験の成績データを2次元配列で管理し、「合格か不合格か」を判定するプログラムを作成することができます。
- データを一括でExcelシートに表示したい場合
- Excelのセルに1つずつデータを入力するのではなく、2次元配列にまとめたデータを一括でシートに反映させることができます。
これにより、手動操作を省略し、効率的に作業が進められます。- 例1: 数百行のデータをExcelに貼り付ける業務を、数秒で完了させる。
- 例2: データベースから取得した情報をExcelの表形式で表示。
- Excelのセルに1つずつデータを入力するのではなく、2次元配列にまとめたデータを一括でシートに反映させることができます。
- 複数のデータを同時に処理したい場合
- 複数のデータを行列形式で管理することで、同じ操作をまとめて実行できます。
例えば、各列に異なる科目のテスト点数を格納して、平均点を一括で計算することが可能です。- 例1: 数学、英語、理科の成績を行ごとに配列で管理し、全生徒の平均点を算出。
- 例2: 異なる商品の売上データを配列に格納し、総売上を計算。
- 複数のデータを行列形式で管理することで、同じ操作をまとめて実行できます。
VBAの「2次元配列」の基本 | 行と列でデータを効率管理
2次元配列とは、行と列の両方にインデックスを持つ配列のことです。
Excelのシートのように、行と列でデータを整理するのに適しており、複数のデータセットを効率的に管理できます。
2次元配列をエクセルのセルを使用して解説
VBAの2次元配列では、データが行と列で構成されており、それぞれにインデックス番号が割り振られています。
以下のようなExcelシートと同じようにイメージするとわかりやすいでしょう。


この場合、myArray(1, 1)
は「1」に対応し、myArray(2, 2)
は「4」に対応します。
インデックスを使うことで、特定のデータにアクセスすることができます。
※この説明では、エクセルの表と合わせるため、要素の下限を「1」としていますが、通常「0」から始まります。
VBA 2次元配列の宣言方法|静的・動的の違いをわかりやすく解説
VBAで「2次元配列」を使用する際、まずDimステートメントを使用して配列を宣言する必要があります。
配列の宣言方法には、以下の2種類があります。
- 静的配列
- 配列のサイズをあらかじめ決める方法
- 動的配列
- 実行時にサイズを変更可能な方法
「静的配列」を使用し「2次元配列」を宣言する場合


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


- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
- この配列がどのような種類のデータを格納するのかを指定する部分です。
- ReDim (必須)
- 動的配列のサイズを設定・変更する際に使用します。
ReDimを使うことで、後から配列のサイズを自由に変更できます。
- 動的配列のサイズを設定・変更する際に使用します。
- 行数と列数 (必須)
- 配列の行数と列数を指定します。
例えば、Dim myArray(3, 4)では、3行4列の2次元配列を作成しています。
行と列の数を指定することで、配列のサイズが決まります。
ここでは、インデックスがデフォルトで「0」から始まるため、myArray(0,0)からmyArray(3,4)までの範囲を持ちます。
- 配列の行数と列数を指定します。
具体的なコードの宣言例
'// 動的配列を宣言(初期サイズは未指定)
Dim myArray() As Long
'// 配列サイズを設定(3行4列)
ReDim myArray(2, 3)
静的配列と動的配列の違いを比較
項目 | 静的配列 | 動的配列 |
---|---|---|
サイズ変更 | 不可 | 後から変更可能 |
メモリ効率 | 高 | サイズ変更時にメモリ再確保が発生 |
宣言方法 | Dim myArray(2, 3) | Dim myArray() + ReDim |
用途 | 固定サイズのデータ | サイズが変動するデータ |
VBAで2次元配列にデータを格納する方法|CurrentRegionの使い方も解説
VBAの2次元配列は、行と列のインデックスを使用してデータを効率的に管理できます。
このセクションでは、以下の2つの方法を解説します。
方法 | 使用頻度 | 特徴 | 適用場面 |
---|---|---|---|
CurrentRegionを使用 | 連続したセル範囲を自動で配列に取り込む | Excel範囲をまとめて処理する場合 | |
手動でデータを格納 | データをコード内で一つ一つ設定する | 配列の内容が固定されている場合 | |
指定範囲(Range)を使用 | 指定範囲を柔軟に取り込む | 任意の範囲で細かく制御したい場合 |
CurrentRegionを使用して範囲を配列に格納 | 使用頻度 :
CurrentRegionを使用すると、指定したセルを起点に連続した範囲を自動で選択し、配列として格納できます。
これを使うと、指定した範囲のデータを一括で配列に格納できます。
コード例
Sub GetArrayFromRange()
Dim arr As Variant
'// 範囲全体を配列に格納
arr = Range("A1").CurrentRegion.Value
MsgBox "配列の下限要素: " & LBound(arr, 1) & ", " & LBound(arr, 2)
End Sub
処理結果


このコードでは、セル「A1」を起点とした範囲全体をCurrentRegionを使って取得し、配列「arr」に格納しています。
- CurrentRegionを使って取得した配列は、通常のVBA配列と異なり、下限要素が「1」から始まります。
これは、Excelのシートの行・列のインデックスが「1」から始まることと一致しています。 - CurrentRegionは、空白行や空白列で区切られた範囲までしか取得できません。
空白がある場合、意図した範囲全体が取得されない可能性があるため注意してください。


手動でデータを格納する方法 | 使用頻度 :
手動でデータを格納する方法は、配列の内容があらかじめ決まっている場合や、小規模なデータ処理に適しています。
コード例
Sub StoreDataIn2DArray()
'// 3行4列の配列を宣言
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」を格納することを示します。
このコードは、配列内容をコード内で明確に定義できるため、テスト用データや小規模データを準備する際に便利です。
指定範囲(Range)を使用する方法 | 使用頻度 :
特定の範囲を配列に取り込むには、Range.Value
を使用します。
この方法は、任意の範囲を柔軟に操作できるのが特徴です。
コード例
Sub GetArrayFromRangeDirect()
Dim arr As Variant
'// A1:D3範囲を配列に格納
arr = Range("A1:D3").Value
End Sub
処理結果


このコードでは、指定したセル範囲「A1」から「D3」までのデータを取得し、配列「arr」に格納しています。
Rangeを使用して範囲を明示的に指定するため、CurrentRegionでは取得できない不連続なデータにも対応可能となります。
Rangeを使用して配列を取得した場合、配列の下限要素は「1」から始まります。
※CurrentRegionと同様です。
これは、Excelのシートの行・列のインデックスが「1」から始まることと一致しています。
VBAの2次元配列を使用する際の注意ポイント
2次元配列を使用する際には、以下のポイントに注意する必要があります。
注意ポイント1: CurrentRegionで配列を取得する際のインデックスの違い
CurrentRegion
を使用してExcelのデータ範囲を配列に格納すると、配列のインデックスが通常の配列とは異なります。
最下位の要素が「0」ではなく「1」から始まります。
この特性を理解しておかないと、配列操作で思わぬエラーが発生する可能性があります。
コード例: CurrentRegionで配列を取得する場合
Sub CurrentRegionExample()
Dim arr As Variant
Dim i As Long, j As Long
'// CurrentRegionを使用して範囲を配列に格納
arr = Range("A1").CurrentRegion.Value
'// 配列のインデックスが1から始まる点に注意
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
Debug.Print "行 " & i & " 列 " & j & ": " & arr(i, j)
Next j
Next i
End Sub
処理結果


ポイント
- 下限インデックス
- VBA標準では配列のインデックスが「0」から始まることが多いですが、
CurrentRegion
で取得した配列は「1」から始まります。
コードを書く際に意識しましょう。
- VBA標準では配列のインデックスが「0」から始まることが多いですが、
注意ポイント2: 配列データをセルに貼り付ける際のサイズ一致の重要性
2次元配列をExcelシートに貼り付ける際は、配列のサイズとセル範囲が一致している必要があります。
範囲が一致していない場合、エラーや意図しない動作が発生します。
コード例: 配列データをセルに貼り付ける
Sub PasteArrayToSheet()
Dim myArray(0 To 2, 0 To 3) As Long
Dim i As Long, j As Long
'// 配列にデータを格納
For i = 0 To 2
For j = 0 To 3
myArray(i, j) = (i + 1) * (j + 1)
Next j
Next i
'// 配列をシートに貼り付け(範囲サイズを正確に指定)
Sheets("Sheet1").Range("A1").Resize(UBound(myArray, 1) + 1, UBound(myArray, 2) + 1).Value = myArray
End Sub
ポイント
- 範囲一致
Resize
メソッドを使用して、配列の行数と列数に一致するセル範囲を指定しましょう。
- エラー回避
- 範囲が一致しない場合、「アプリケーション定義のエラー」が発生します。
注意ポイント3: Transpose関数の制限と手動転置の活用法
Transpose
関数を使用すると、2次元配列の行と列を入れ替えることができます。
ただし、配列が大きい場合やデータ型が適さない場合、エラーが発生することがあります。
コード例: Transposeを使用して転置する
Sub TransposeArrayExample()
Dim myArray(0 To 2, 0 To 3) As Long
Dim transposedArray As Variant
Dim i As Long, j As Long
'// 配列にデータを格納
For i = 0 To 2
For j = 0 To 3
myArray(i, j) = (i + 1) * (j + 1)
Next j
Next i
'// 配列を転置(Transpose関数を使用)
transposedArray = Application.Transpose(myArray)
'// 転置後の配列をシートに貼り付け
Sheets("Sheet1").Range("A1").Resize(UBound(transposedArray, 1), UBound(transposedArray, 2)).Value = transposedArray
End Sub
ポイント
- エラーの可能性
- 配列の行数が「65536以上」になると、
Transpose
関数でエラーが発生します。
※データ数の上限は、エクセルのバージョンによります。
- 配列の行数が「65536以上」になると、
- 手動転置
- 大量のデータを扱う場合、ループを使用して手動で転置する方法を検討してください。
注意ポイント4: 2次元配列は最終次元しか変更できない
VBAでは、2次元配列のサイズを変更する場合、ReDim Preserve
を使用すると最終次元(通常は列数)しか変更できません。
これはVBAの仕様による制限で、行数を変更するには配列全体を再宣言する必要があります。
コード例: 最終次元(列数)を変更する ⇒ エラーは出ません
Sub ResizeLastDimension()
Dim myArray() As Long
'// 動的配列を宣言
ReDim myArray(2,3) '// 初期サイズ: 3行4列
'// 列数を変更(可能)
ReDim Preserve myArray(2,5) '// サイズ変更後: 3行6列
End Sub
コード例: 行数 (最終次元以外) を変更しようとするとエラーになる
Sub ResizeFirstDimensionError()
Dim myArray() As Long
'// 動的配列を宣言
ReDim myArray(2,3) '// 初期サイズ: 3行4列
'// 行数を変更しようとする(エラーが発生)
ReDim Preserve myArray(4,3) '// エラー: Preserveでは最終次元しか変更できません
End Sub


ポイント
- 最終次元(列数)は変更可能
ReDim Preserve
を使用して列数を自由に変更できます。
- 行数は変更不可
- 行数を変更する場合は、新しい配列を作成し、既存のデータを手動でコピーする必要があります。
VBA「2次元配列」の使用例をご紹介
ここでは、2次元配列を活用した具体的な使用例を紹介します。
以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。
VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。


\ 自分のペースで学べるVBA講座はこちら /
使用例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
処理結果


コードの動作概要
Dim myArray(2, 3) As Longで2次元配列「myArray」を宣言します。
この配列は、3行4列の要素を持つ配列です。
配列の各要素にデータを格納します。
myArray(0, 0) = 1からmyArray(2, 3) = 12まで、12個のデータが配列に格納されます。
配列に格納されたデータを、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
処理結果


コードの動作概要
Dim arr As Variant により、2次元配列 arr を宣言します。
この配列は、シート上のデータを格納するために使用されます。
arr = Range(“A1”).CurrentRegion.Value によって、A1セルを含む範囲全体(CurrentRegion)を2次元配列「arr」に格納します。
「CurrentRegion」は、連続したセル範囲を自動的に選択します。
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) は列数を表しています。
このコードで使用している機能
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
処理結果


コードの動作概要
Sheets(“Sheet1”).Range(“A1”).CurrentRegion.Valueを使用して、Sheet1のA1セルを起点とした連続するデータ範囲を取得し、その値をarrという2次元配列に格納します。
この配列には、Sheet1のデータ範囲全体が含まれます。
ReDimステートメントを使用して、フィルタリングされたデータを格納する配列filteredArrayのサイズを、元の配列arrと同じサイズで初期化します。
rowCount変数は、条件に合致するデータの行数をカウントするために使用します。
Forループを使用して、元の配列arrの各行をチェックします。
5列目の値が1200以上の場合、その行全体をfilteredArrayに格納します。
格納後にrowCountを1増やし、次の条件に合致する行のためのインデックスを準備します。
最後に、filteredArrayに格納されたデータをSheet2のA1セルから開始する範囲に貼り付けます。
Resizeメソッドを使用して、filteredArrayの行数に合わせて貼り付け範囲を動的に調整します。
このコードで使用している機能
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シートへのデータの貼り付け方法まで詳しく解説しました。
これらの知識を活用することで、データ管理がよりシンプルになり、プログラムの可読性も向上します。
ポイントのおさらい
- VBAの2次元配列でどんなことができるのか?説明しました。
- 2次元配列の概要とそのメリット、活用される場面について解説しています。
⇒ 「VBAの2次元配列で何ができる? どんな場面で使われるの?」もう一度見る。
- 2次元配列の概要とそのメリット、活用される場面について解説しています。
- 2次元配列の基本を理解する
- 2次元配列は、行と列を持つ配列で、Excelシートのようにデータを整理するのに役立ちます。
⇒ 「VBAの「2次元配列」の基本 | 行と列でデータを効率管理」もう一度見る。
- 2次元配列は、行と列を持つ配列で、Excelシートのようにデータを整理するのに役立ちます。
- 2次元配列にデータを格納する方法を学ぶ
- 行と列のインデックスを使って、2次元配列にデータを格納することができます。
⇒ 「「静的配列」を使用し「2次元配列」を宣言する場合」もう一度見る。
⇒ 「「動的配列」を使用し「2次元配列」を宣言する場合」もう一度見る。
- 行と列のインデックスを使って、2次元配列にデータを格納することができます。
- VBAで2次元配列にデータを格納する方法をご紹介
- 手動でのデータ格納やCurrentRegionを使った効率的なデータ操作を紹介しました。
⇒ 「VBAで2次元配列にデータを格納する方法|CurrentRegionの使い方も解説」もう一度見る。
- 手動でのデータ格納やCurrentRegionを使った効率的なデータ操作を紹介しました。
- 2次元配列を使用する際の注意ポイントを理解する
- CurrentRegionを使用して配列を取得する際や、2次元配列のサイズ変更、データの貼り付け時には注意が必要です。
⇒ 「VBAの2次元配列を使用する際の注意ポイント」もう一度見る。
- CurrentRegionを使用して配列を取得する際や、2次元配列のサイズ変更、データの貼り付け時には注意が必要です。
- 2次元配列の使用例をご紹介
- 2次元配列を使用した具体的な使用例を学び、実際にVBAコードを試してみましょう。
⇒ 「VBA「2次元配列」の使用例をご紹介」もう一度見る。
- 2次元配列を使用した具体的な使用例を学び、実際にVBAコードを試してみましょう。
さらに学ぶために
動的配列の基本を理解したら、次は配列を使った高度なデータ操作や、他の配列関連の技術に挑戦してみましょう。
データ管理のスキルが向上し、より複雑なシナリオにも対応できるようになります。

