PeaceJet

@PeaceJets 2018年、証券会社から転職して人材会社のシステムエンジニアになりました。マーケティングやデータ分析・UI/UX改善などもやっています! #Docker #Ruby #Rails #lambda #GoogleAppsScript #VBA #GitHub http://github.com/peacejet

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



 

 

peacejet.hatenablog.com

 

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

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

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

  A B C D
1 土居忠三 1960/01/19 55 和歌山県
2 藤森通夫 1962/11/29 52 佐賀県
3 滝涼子 1964/09/28 50 沖縄県
4 奈良有沙 1975/09/19 39 岐阜県
5 本山康子 1987/06/23 27 埼玉県

ポイント

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

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

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

Array(1,1)="名前"

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

Array(1,3)="年齢"

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

上記のような風にです。

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

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

「列行」のイメージ

  (空白) A B C D E
1 (名前) 土居忠三 藤森通夫 滝涼子 奈良有沙 本山康子
2 (生年月日) 1960/01/19 1962/11/29 1964/09/28 1975/09/19 1987/06/23
3 (年齢) 55 52 50 39 27
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) 多次元配列を再定義します。