多次元配列

広告

今までは配列は1次元の配列だけを扱いましたが、今度は2次元以上の配列について見ていきます。

まず1次元の配列とはどんなものかを再度考えてみます。

名前
佐藤 一郎
山田 花子
加藤 健一
中村 吾郎

1次元の配列とは上記のような項目が1つしかないものです。これに対して2次元の配列とは次のようなものです。

名前住所
佐藤 一郎東京都
山田 花子札幌市
加藤 健一名古屋市
中村 吾郎東京都

このように名前が「佐藤」さんの住所は「東京都」で名前が「山田」さんの住所は「札幌市」です。このように1つの行に対して2つの項目があるものが2次元の配列となります。

このデータを配列に保存する場合には次のように2つの配列を用意する必要があります。

Dim clientName(3) As String
Dim clientAddress(3) As String

clientName(0) = "佐藤 一郎"
clientAddress(0) = "東京都"

clientName(1) = "山田 花子"
clientAddress(1) = "札幌市"

clientName(2) = "加藤 健一"
clientAddress(2) = "名古屋市"

clientName(3) = "中村 吾郎"
clientAddress(3) = "東京都"

この配列からある人のデータを取り出すには、どちらの配列もインデックス番号が同じになっていますので、次のように取り出すことができます。

Dim i As Integer

For i = 0 To 3
    Dim str As String
    str = clientName(i) + clientAddress(i)
Next i

これはこれで構いませんが、2次元配列を使うことでよりすっきりと記述することができます。構文は次のようになります。

Dim 変数名(行数 - 1, 項目数 - 1) As データ型

先ほどの例で言うと、1つの行には名前と住所と言う2つの項目があり、そして行数としては4行ですので次のようになります。

Dim client(3, 1) As String

そしてデータの格納するには次のようになります。

Dim client(3, 1) As String

client(0, 0) = "佐藤 一郎"
client(0, 1) = "東京都"

client(1, 0) = "山田 花子"
client(1, 0) = "札幌市"

client(2, 0) = "加藤 健一"
client(2, 0) = "名古屋市"

client(3, 0) = "中村 吾郎"
client(3, 0) = "東京都"

分かりやすく書くと次のようになります。

client(1行目, 名前の項目) = "佐藤 一郎"
client(1行目, 住所の項目) = "東京都"

記述しなければならないプログラムの量はあまり変わりありませんが、1つの変数でまとめて管理することで、これらの全てのデータが関連するデータであることが明確となります。出来る限りプログラムは後で読んで分かりやすいように記述することが望ましいので、表のようなデータを管理する場合には2次元配列は有効であると思います。

サンプルプログラム

では簡単なサンプルで試してみます。

国語数学英語
784552
988784
524587
719290

上記のような4人の生徒の国語/数学/英語の3教化のテストの得点表があった場合に、全生徒の全教科の平均を取得してみます。

array4.bas

Sub テスト()
    Dim tensuu(3, 2) As Integer

    tensuu(0, 0) = 78
    tensuu(0, 1) = 45
    tensuu(0, 2) = 52

    tensuu(1, 0) = 98
    tensuu(1, 1) = 87
    tensuu(1, 2) = 84

    tensuu(2, 0) = 52
    tensuu(2, 1) = 45
    tensuu(2, 2) = 87

    tensuu(3, 0) = 71
    tensuu(3, 1) = 92
    tensuu(3, 2) = 90

    Dim sum As Integer
    Dim heikin As Integer
    Dim i As Integer
    Dim j As Integer
    
    sum = 0
    
    For i = 0 To 3
        For j = 0 To 2
            sum = sum + tensuu(i, j)
        Next j
    Next i

    heikin = sum / 12
    Range("A1").Value = "全生徒の全教科の平均は" & heikin

End Sub

上記のマクロを実行すると次のようになります。

二次元配列

今回のように数値型の二次元配列の処理をする際に、For文を多重に使って処理するケースは良くあります。

For i = 0 To 3
    For j = 0 To 2
        sum = sum + tensuu(i, j)
    Next j
Next i

このようにFor文を多重に記述した場合は、次のように記述した場合と同じです。

sum = sum + tensuu(0, 0)
sum = sum + tensuu(0, 1)
sum = sum + tensuu(0, 2)
sum = sum + tensuu(1, 0)
sum = sum + tensuu(1, 1)
sum = sum + tensuu(1, 2)
sum = sum + tensuu(2, 0)
sum = sum + tensuu(2, 1)
sum = sum + tensuu(2, 2)
sum = sum + tensuu(3, 0)
sum = sum + tensuu(3, 1)
sum = sum + tensuu(3, 2)

まず変数「i」に0が入り、変数「j」にも0が入ります。ここでまず内側のループが行われて変数「j」の値が0から2まで繰り返されます。そこで一度内側の繰り返しは終わり、次に変数「i」に1が入って改めて内側のループが行われます。そして外側のループが全て終われば終了となります。このような使い方はよくありますので覚えておいて下さい。

また今回は2次元配列でしたが、次元は60まで可能なようです。3次元以上となると表にするのが難しいのですが、例えば次のようなものです。

+- 東京都 -+- 食品 -+- 売上
|          |        |
|          |        +- 利益
|          |
|          +- 電化 -+- 売上
|                   |
|                   +- 利益
+- 大阪府 -+- 食品 -+- 売上
           |        |
           |        +- 利益
           |
           +- 電化 -+- 売上
                    |
                    +- 利益

県別の製品カテゴリー別の売上と利益があるようなデータを扱う場合などです。3次元の場合の構文は次のようになります。

Dim 変数名(行数 - 1, 1次項目数 - 1, 2次項目数 - 1) As データ型

Excel VBA入門の他の記事を見てみる

( Written by Tatsuo Ikura )