PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやプランナーなども

ExcelVBAで多次元配列(2次元・3次元)を作成してみよう!【ExcelVBA・エクセルマクロ】

前回の記事では、2次元や3次元など多次元配列
では最後の次元しか変更できないという話をしました。

今回は、多次元で動的配列を用いる場合について考えてみたいと思います。

例えば、以下のようなリストを多次元配列に入れた場合、
取り出す時に楽をできそうな気がします。

 ABCD
1土居忠三1960/01/1955和歌山県
2藤森通夫1962/11/2952佐賀県
3滝涼子1964/09/2850沖縄県
4奈良有沙1975/09/1939岐阜県
5本山康子1987/06/2327埼玉県

ポイント

  1. 頭の中で「列行」をイメージする。

上記のリストを配列にする場合――
(そもそも、Excelのシートそのものが2次元配列のように見えなくもない)

人の脳みそは、恐らく「行列」で考えようとすると思います。

Array(1,1)="名前"

Array(1,2)="生年月日"

Array(1,3)="年齢"

Array(1,4)="都道府県"

上記のような風にです。

しかしながら、ExcelVBAにこの考え方を持ち込むとエラーになります。

なぜなら、最終次元を変更できないからです。

「列行」のイメージ

 (空白)ABCDE
1(名前)土居忠三藤森通夫滝涼子奈良有沙本山康子
2(生年月日)1960/01/191962/11/291964/09/281975/09/191987/06/23
3(年齢)5552503927
4都道府県)和歌山県佐賀県沖縄県岐阜県埼玉県

よって、上記のように行と列を逆転したのち、動的配列に持ち込みます。

多次元での動的配列

Sub MultiDimensionalArray4()

    ReDim MyArray(3, 0) As Variant    '--(1)
    
    For i = 0 To Range("A65535").End(xlUp).Row - 1
    
        n = UBound(MyArray(), 2)    '--(2)
        
        ReDim Preserve MyArray(3, n + 1)    '--(3)
            
                MyArray(0, i) = Cells(i + 1, 1)
                MyArray(1, i) = Cells(i + 1, 2)
                MyArray(2, i) = Cells(i + 1, 3)
                MyArray(3, i) = Cells(i + 1, 4)
                
        Debug.Print MyArray(0, i) & MyArray(1, i) & _
                            MyArray(2, i) & MyArray(3, i)
    
    Next i

End Sub

チェック

上記、プロシージャ内の番号を追って見ていきましょう。

  • (1) 次元を定義します。
    添え字は'3'ですが4つの要素を入れることが出来ます。
  • (2) 多次元配列の最大要素を求めます。
    以前の記事でも紹介しましたが、Ubound関数は引数によって
    多次元配列の要素数を取得することが出来ます。
  • (3) 多次元配列を再定義します。