Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 配列を徹底的に解説する (全5回) ④多次元配列

VBAで配列を徹底的に解説するシリーズ第4弾は多次元配列です。

これまで見てきた配列では一階建てのアパートのように一列に並んだ部屋に値を格納していくイメージでした。これからは配列をより使いこなすためにアパートを二階建て、三階建てにしていきます。

<これまでの配列の解説>

目次

多次元配列のイメージ

これまでの勉強で静的配列のイメージは掴めました。今まで明言してこなかったことがあります。それは、これまで作ってきた配列は一次元だったと言う事です。

f:id:mutable_yun:20190921192042p:plain
再掲 静的一次元配列のイメージ

横に一列に並んでいるから1次元配列です。
多次元配列でイメージしやすく、もっとも実務でお世話になるのが2次元配列です。
イメージはこのようなモノです。

f:id:mutable_yun:20190922152030p:plain
2次元配列のイメージ

三階建てになりました。注意点は3階建てだから3次元ではない、と言う事です。
縦と横の2次元と言うことです。

○-○と号室が書いてあります。初めの方のインデックスが1次元目、後の方が2次元目です。
この図では1次元目が2までの3つの要素、2次元目が4までの5つの要素を持った配列と言う事になります。

下に行くほど1次元目の数字が大きくなるのは、アパートのイメージと違うかもしれませんが、エクセルのワークシートの行番号をイメージすれば腑に落ちると思います。そっくりですね。

静的2次元配列を作る

それでは実際に2次元配列を作成してみましょう。1次元のこれまでの配列に、カンマ区切りで2次元目の最大インデックスを指定するだけです。

Sub 初めての2次元配列作成()

    Dim 初めての2次元配列(2, 4)
    
End Sub

いつものようにF8で一行ずつステップイン実行していきましょう。

f:id:mutable_yun:20190922194653p:plain
2次元配列の中身。カッコ()の中が将棋や囲碁のようにインデックスが二つ並んでいる。

はい、1次元が2まで、2次元が4までの配列ができました。イミディエイトウィンドウを見ると一見分かりにくいですが、0行目の0列目、1列目、2列目・・・、1行目の0列目、1列目、2列目・・・と言うように見えませんか?

これはもはやワークシートそのものなのでは??(0から始まってるけど。。。)

ファイル⇒一番左下のオプション

f:id:mutable_yun:20190922194959p:plain
エクセルのリボン部分
f:id:mutable_yun:20190922195147p:plain

数式⇒R1C1参照形式を使用する
f:id:mutable_yun:20190922195248p:plain

シートの中のセルの番地をインデックスで指定できるようになりました。今回作成した配列のインデックスにそっくりですね。

f:id:mutable_yun:20190922195704p:plain
R1C1形式で表示されたエクセルブックのシート

LBound関数とUBound関数の第2引数

LBound関数でインデックスの最小値、UBound関数でインデックスの最大値が取得できることは、VBA 配列を徹底的に解説する (全10回) ③静的配列の初期化と実務的なサンプルで学んだ通りです。実はこれらの関数はもう一つ引数をとることができます。

それが、何次元目の最小/最大インデックスを取得するかという、何次元目の何に当たる数値です。

Sub 初めての2次元配列作成の最小_最大インデックスを調べる()

    Dim 初めての2次元配列(2, 4)
    
    Debug.Print LBound(初めての2次元配列, 1)
    Debug.Print UBound(初めての2次元配列, 1)
    Debug.Print LBound(初めての2次元配列, 2)
    Debug.Print UBound(初めての2次元配列, 2)
    
End Sub

実行結果。

 0 
 2 
 0 
 4 

次元数を第2引数にとることによって、明示的に各次元の最小、最大インデックスを取得することができました。

多次元といいながら2次元配列の説明しかしていませんが、現時点ではワークシートのイメージで構いません。

実際、業務効率化で使うVBAの多次元配列は9割が2次元配列だと思います。面のイメージですね。

3次元以上はここで詳しく解説しませんが、実際のデータの入り方と区分けをイメージすることで理解出来ます。

少しだけ、例を挙げると、
日本、中国、韓国、と言った国名を1次元、東京、北京、ソウルなどを2次元にかくのうしていきます。2次元の他の要素には大阪や上海や太田などが入ります。そして3次元には新宿区などが入ります。ちょっと乱暴ですが、階層が格納できるイメージが想像できますでしょうか。これがイメージできれば、4次元は一つずれて、1次元に地球が入ることになります。ワークシートのイメージの延長ではない3次元以上の多次元配列は業務自動化の範囲を超えるので¥ここでは説明を割愛します。

ワークシートをそのまま代入して2次元配列を作る裏技

エクセルのお気遣いを使い倒す裏技です。ワークシートの範囲をそのままVariant型の変数に代入すると、勝手に2次元配列に変換して格納してくれます。(便利すぎる!)

f:id:mutable_yun:20190922202117p:plain
サンプルデータ。商品リスト

このシートがアクティブな状態で下記を実行します。

Sub 裏技的2次元配列()
    
    Dim rw As Long
    Dim clm As Long
    Dim シートの値をそのまま配列にarr As Variant
    
    rw = Cells(Rows.Count, 1).End(xlUp).Row
    clm = Cells(1, Columns.Count).End(xlToLeft).Column
    
    シートの値をそのまま配列にarr = Range(Cells(1, 1), Cells(rw, clm))

End Sub

F8を順に押していくと・・・

f:id:mutable_yun:20190922202628p:plain
もはやシートそのもの!ただし書式などはない。値だけ。

なんじゃこりゃ!便利すぎる! はい、もうシートを参照したりアクティブワークブックを切り替える必要はなくなりました。

取り込んだデータは全て配列に取り込んで、値の操作は全部配列でやってしまえば良いです。エクセルブックとかシートオブジェクトを触るのは背景の色とかセルの書式設定などオブジェクトのプロパティを触りたいときだけでいいのですね。

この感覚が分かれば、中級は卒業です。


次回はさらに自由に使いこなすために、配列の形を変えられる動的配列について学びます。