【ExcelVBA入門】二次元配列とは?実践的な使い方についても徹底解説

こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。

皆さんは、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入門】UBound、LBound関数で配列の要素数を取得
更新日 : 2019年4月24日
【VBA For Next】ループ処理の基本を5つのステップで完全理解
更新日 : 2019年4月20日

まとめ

今回は、VBAで二次元配列を使う方法について解説しました。

配列が上手く使いこなせるようになると、大量のデータも扱いやすくなるのでおすすめです!

使い方も簡単なので、ぜひ使ってみてくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。
Webアプリ、業務アプリ開発において、要件定義、設計、インフラ、製造、テスト、運用保守など、様々な経験あり。
また、侍ブログ編集部として、これまでに200記事以上の記事を執筆。
現在はフリーランスエンジニア兼テックライターとして活動中。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説