こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、VBAで二次元配列を使ったことがありますか?
データをリストにして同じ変数名で管理できる配列なので使ったことがある方はいるかもしれませんが、2次元配列を使ったことがない方も多いのでは?
そこで今回は、
- 配列とは
- 二次元配列の基礎的な使い方
- 途中で要素数を増やす方法
- 要素数の数分ループ処理する方法
といった基本的な方法から応用的な方法まで、徹底的に解説します!
配列とは
まず、配列について簡単に解説します。
配列とは、データをひとまとまりで使うための変数です。連続したデータを使って処理を組み込みたいときに使います。
たとえば、次のようにセルのデータを配列でまとめて扱うことができます。
セルのデータ:
このサンプルを配列データで格納する方法は次のとおりです。
配列使ったサンプルコード:
Sub Test() '配列の宣言し要素数を指定 Dim strName() As String ReDim strName(4) '配列に値を入れる strName(0) = Worksheets("Sheet1").Cells(2, 1).Value strName(1) = Worksheets("Sheet1").Cells(3, 1).Value strName(2) = Worksheets("Sheet1").Cells(4, 1).Value strName(3) = Worksheets("Sheet1").Cells(5, 1).Value strName(4) = Worksheets("Sheet1").Cells(6, 1).Value '配列の値を出力して確認 Debug.Print "strName(0):" & strName(0) & vbCrLf & _ "strName(1):" & strName(1) & vbCrLf & _ "strName(2):" & strName(2) & vbCrLf & _ "strName(3):" & strName(3) & vbCrLf & _ "strName(4):" & strName(4) End Sub
実行結果:
strName(0):侍エンジニア1 strName(1):侍エンジニア2 strName(2):侍エンジニア3 strName(3):侍エンジニア4 strName(4):侍エンジニア5
はじめに、要素が5つある配列を以下で宣言しています。
Dim strName() As String ReDim strName(4)
次に、「strName(要素) = Worksheets(“Sheet1”).Range(セル名).Value」で0番目の要素からセルの値を配列に入れています。
このように、配列では1つの配列名で複数のデータを扱うことができます。
2次元配列とは
ただ、Excelではさきほどのように1列のみのデータを扱うことは少ないですよね。
二次元配列を使えば、複数行・複数列のデータを配列で扱うことができるのでおすすめです!
先ほどのサンプルにNo、部署を追加して、部署と名前を配列で格納するサンプルを用意しました。
セルのデータ:
二次元配列使ったサンプルコード:
Sub Test2() '配列の宣言し要素数を指定 Dim strName() As String ReDim strName(1, 4) '配列に値を入れる strName(0, 0) = Worksheets("Sheet2").Cells(2, 2).Value strName(1, 0) = Worksheets("Sheet2").Cells(2, 3).Value strName(0, 1) = Worksheets("Sheet2").Cells(3, 2).Value strName(1, 1) = Worksheets("Sheet2").Cells(3, 3).Value strName(0, 2) = Worksheets("Sheet2").Cells(4, 2).Value strName(1, 2) = Worksheets("Sheet2").Cells(4, 3).Value strName(0, 3) = Worksheets("Sheet2").Cells(5, 2).Value strName(1, 3) = Worksheets("Sheet2").Cells(5, 3).Value strName(0, 4) = Worksheets("Sheet2").Cells(6, 2).Value strName(1, 4) = Worksheets("Sheet2").Cells(6, 3).Value '配列の値を出力して確認 Debug.Print "データ位置:部署:名前" & vbCrLf & _ "----------------------" & vbCrLf & _ "1つ目のデータ:" & strName(0, 0) & ":" & strName(1, 0); vbCrLf & _ "2つ目のデータ:" & strName(0, 1) & ":" & strName(1, 1); vbCrLf & _ "3つ目のデータ:" & strName(0, 2) & ":" & strName(1, 2); vbCrLf & _ "4つ目のデータ:" & strName(0, 3) & ":" & strName(1, 3); vbCrLf & _ "5つ目のデータ:" & strName(0, 4) & ":" & strName(1, 4) End Sub
実行結果:
データ位置:部署:名前 ---------------------- 1つ目のデータ:マーケティング部:侍エンジニア1 2つ目のデータ:マーケティング部:侍エンジニア2 3つ目のデータ:開発部:侍エンジニア3 4つ目のデータ:開発部:侍エンジニア4 5つ目のデータ:開発部:侍エンジニア5
一次元配列では変数宣言時に配列名(要素数)で変数宣言してましたが、二次元配列では配列名(要素数A、要素数B)のようにカッコ()の中の要素数の数が増えます。
今回は「Redim strName(1, 4)」で要素数Aが2つ、要素数Bが4つを指定しています。
要素数Aで列数、要素数Bで行数を指定するイメージですね。
このようにすることで、複数行・複数列のデータを簡単に二次元配列で扱うことができます。
二次元配列の実践的な使い方
ここからは、二次元配列の実践的な使い方について解説します。
途中で要素を追加する方法
Excelのデータは、途中で増えるときもありますよね。
そのため、要素数を後から増やす方法を覚えておくのがおすすめです!
例えば、さきほどのデータが6行に増えた場合などですね。
この場合、元の値を残しつつ1行分のデータのみ追加したいですよね。
元の値を残しつつ要素数を増やしたいときは、Redimの後にPreserveをつけて次のように宣言します。
Redim Preserve 配列名(新しい要素数A , 新しい要素数B)
5行分のデータを配列に設定したあと、6行目のデータを追加するサンプルを用意しました。
サンプルコード:
Sub Test3() '配列の宣言し要素数を指定 Dim strName() As String ReDim strName(1, 4) '配列に値を入れる strName(0, 0) = Worksheets("Sheet2").Cells(2, 2).Value strName(1, 0) = Worksheets("Sheet2").Cells(2, 3).Value strName(0, 1) = Worksheets("Sheet2").Cells(3, 2).Value strName(1, 1) = Worksheets("Sheet2").Cells(3, 3).Value strName(0, 2) = Worksheets("Sheet2").Cells(4, 2).Value strName(1, 2) = Worksheets("Sheet2").Cells(4, 3).Value strName(0, 3) = Worksheets("Sheet2").Cells(5, 2).Value strName(1, 3) = Worksheets("Sheet2").Cells(5, 3).Value strName(0, 4) = Worksheets("Sheet2").Cells(6, 2).Value strName(1, 4) = Worksheets("Sheet2").Cells(6, 3).Value '要素数の変更 ReDim Preserve strName(1, 5) 'データの追加 strName(0, 5) = Worksheets("Sheet2").Cells(7, 2).Value strName(1, 5) = Worksheets("Sheet2").Cells(7, 3).Value '配列の値を出力して確認 Debug.Print "データ位置:部署:名前" & vbCrLf & _ "----------------------" & vbCrLf & _ "1つ目のデータ:" & strName(0, 0) & ":" & strName(1, 0) & vbCrLf & _ "2つ目のデータ:" & strName(0, 1) & ":" & strName(1, 1) & vbCrLf & _ "3つ目のデータ:" & strName(0, 2) & ":" & strName(1, 2) & vbCrLf & _ "4つ目のデータ:" & strName(0, 3) & ":" & strName(1, 3) & vbCrLf & _ "5つ目のデータ:" & strName(0, 4) & ":" & strName(1, 4) & vbCrLf & _ "6つ目のデータ:" & strName(0, 5) & ":" & strName(1, 5) End Sub
実行結果:
データ位置:部署:名前 ---------------------- 1つ目のデータ:マーケティング部:侍エンジニア1 2つ目のデータ:マーケティング部:侍エンジニア2 3つ目のデータ:開発部:侍エンジニア3 4つ目のデータ:開発部:侍エンジニア4 5つ目のデータ:開発部:侍エンジニア5 6つ目のデータ:開発部:侍エンジニア6
元の値を残しつつ、要素数を追加することができましたよね。
このように、要素数を簡単に変更することができます。
ちなみに、二次元配列で要素数を変更する場合は、要素Aの数は変更できないため注意してください。
今回のケースでいうと、「部署 + 名前」だけでなく「部署 + 名前 + No」を配列にしたい場合「strName(1,4)」から「strName(2,4)」にしても、エラーになってしまいます。
要素数Aを変更してエラーが出るサンプルコード:
Sub Test4() '配列の宣言し要素数を指定 Dim strName() As String ReDim strName(1, 4) '配列に値を入れる strName(0, 0) = Worksheets("Sheet2").Cells(2, 2).Value strName(1, 0) = Worksheets("Sheet2").Cells(2, 3).Value strName(0, 1) = Worksheets("Sheet2").Cells(3, 2).Value strName(1, 1) = Worksheets("Sheet2").Cells(3, 3).Value strName(0, 2) = Worksheets("Sheet2").Cells(4, 2).Value strName(1, 2) = Worksheets("Sheet2").Cells(4, 3).Value strName(0, 3) = Worksheets("Sheet2").Cells(5, 2).Value strName(1, 3) = Worksheets("Sheet2").Cells(5, 3).Value strName(0, 4) = Worksheets("Sheet2").Cells(6, 2).Value strName(1, 4) = Worksheets("Sheet2").Cells(6, 3).Value '要素数の変更 ReDim Preserve strName(2, 4) 'データの追加 strName(2, 0) = Worksheets("Sheet2").Cells(2, 1).Value strName(2, 1) = Worksheets("Sheet2").Cells(3, 1).Value strName(2, 2) = Worksheets("Sheet2").Cells(4, 1).Value strName(2, 3) = Worksheets("Sheet2").Cells(5, 1).Value strName(2, 4) = Worksheets("Sheet2").Cells(6, 1).Value '配列の値を出力して確認 Debug.Print "データ位置:部署:名前:No" & vbCrLf & _ "----------------------" & vbCrLf & _ "1つ目のデータ:" & strName(0, 0) & ":" & strName(1, 0) & ":" & strName(2, 0) & vbCrLf & _ "2つ目のデータ:" & strName(0, 1) & ":" & strName(1, 1) & ":" & strName(2, 1) & vbCrLf & _ "3つ目のデータ:" & strName(0, 2) & ":" & strName(1, 2) & ":" & strName(2, 2) & vbCrLf & _ "4つ目のデータ:" & strName(0, 3) & ":" & strName(1, 3) & ":" & strName(2, 3) & vbCrLf & _ "5つ目のデータ:" & strName(0, 4) & ":" & strName(1, 4) & ":" & strName(2, 4) End Sub
実行結果:
二次元配列では要素数Aは変更できないので、どうしても変えたい場合は、最初にRedimで要素数を指定するときの処理を書き換えるのがおすすめです。
要素数の数分処理をループする方法
次に、要素数の数分処理をループする方法について解説します。
先ほどのサンプルでは、配列にデータを入れるとき次のように書いていました。
strName(0, 0) = Worksheets("Sheet2").Cells(2, 2).Value strName(1, 0) = Worksheets("Sheet2").Cells(2, 3).Value strName(0, 1) = Worksheets("Sheet2").Cells(3, 2).Value strName(1, 1) = Worksheets("Sheet2").Cells(3, 3).Value strName(0, 2) = Worksheets("Sheet2").Cells(4, 2).Value strName(1, 2) = Worksheets("Sheet2").Cells(4, 3).Value strName(0, 3) = Worksheets("Sheet2").Cells(5, 2).Value strName(1, 3) = Worksheets("Sheet2").Cells(5, 3).Value strName(0, 4) = Worksheets("Sheet2").Cells(6, 2).Value strName(1, 4) = Worksheets("Sheet2").Cells(6, 3).Value
これでは、要素数が増えるたびに行数が増えてしまうため少し見づらいですよね。
配列の要素数を取得するUBound関数と、For文を使えば簡単に配列の数分処理をループすることができます。
サンプルコード:
Sub Test5() '配列の宣言し要素数を指定 Dim strName() As String ReDim strName(1, 4) '配列に値を入れる Dim i As Long Dim j As Long For i = 0 To UBound(strName, 1) For j = 0 To UBound(strName, 2) strName(i, j) = Worksheets("Sheet2").Cells(j + 2, i + 2).Value Next j Next i '配列の値を出力して確認 Debug.Print "データ位置:部署:名前" & vbCrLf & _ "----------------------" & vbCrLf & _ "1つ目のデータ:" & strName(0, 0) & ":" & strName(1, 0); vbCrLf & _ "2つ目のデータ:" & strName(0, 1) & ":" & strName(1, 1); vbCrLf & _ "3つ目のデータ:" & strName(0, 2) & ":" & strName(1, 2); vbCrLf & _ "4つ目のデータ:" & strName(0, 3) & ":" & strName(1, 3); vbCrLf & _ "5つ目のデータ:" & strName(0, 4) & ":" & strName(1, 4) End Sub
「UBound(strName, 次元数)」で指定した次元の要素数を取得することができます。
そのため、「For i = 0 To UBound(strName, 1)」で要素Aの数分ループ処理を行い、「For j = 0 To UBound(strName, 2)」で要素Bの数分ループ処理をしています。
このように、Ubound関数 + For文を使えば、二次元配列をつかいやすくなるので覚えておくのがおすすめです!
Ubound関数の使い方、For文でループ処理する方法については以下で詳しく解説しているので、気になる方は見てみてくださいね!
まとめ
今回は、VBAで二次元配列を使う方法について解説しました。
配列が上手く使いこなせるようになると、大量のデータも扱いやすくなるのでおすすめです!
使い方も簡単なので、ぜひ使ってみてくださいね!