1次元配列は1行の配列でしたが、複数行を一度に用意するのが2次元配列です。何千行、何万行とあるCSVデータでも一気に配列格納出来る優れものとなります!
1次元配列の使い方はこちらになります。
2次元配列
- 範囲の値を一度に格納出来る
- LBoundとUBoundを覚える
- Offsetを覚えると更に便利
イメージ
1行だった配列を複数行で使える様にしたのが2次元配列です。
サンプルプログラム
今回は下図の範囲(B2:F4)を配列に入れて、コピーする物を作ってみましょう。
2次元配列を使用すると行・列の2種類を使用する事となるので、必然的に多重ループを使用することになります。まずは全体図はこの様になります。
シートを用意して数値を入れてコピペで動きを見るのも良いと思います。
Sub 二次元配列()
'変数宣言
Dim ir As Long, ic As Long
Dim MyAry As Variant
'配列設定
MyAry = Range("B2:F4")
'1次元目の要素処理
For ir = LBound(MyAry, 1) To UBound(MyAry, 1)
'2次元目の要素処理
For ic = LBound(MyAry, 2) To UBound(MyAry, 2)
'値を出力
Range("B7").Offset(ir - 1, ic - 1) = MyAry(ir, ic)
Next
Next
End Sub
配列の設置
'配列設定
MyAry = Range("B2:F4")
まずは8行目の配列設置ですね、範囲を選択し配列にします。このやり方だと配列は(0,0)ではなく(1,1)から始まります。Excelだとシートの扱いとほぼ同じイメージになります!
配列:MyAry(1,1) = 1 ~MyAry(3,5) = 15まで格納したので、これを元に処理を進めます。
行列の処理
'1次元目の要素処理
For ir = LBound(MyAry, 1) To UBound(MyAry, 1)
'2次元目の要素処理
For ic = LBound(MyAry, 2) To UBound(MyAry, 2)
・・・
Next
Next
(MyAry,1)と(MyAry,2)と多重ループなっていますが、1は行方向、2は列方向でそれぞれの処理を行う様になっていて、ループの処理は以下の様になります。
配列 | 変数 ir (1次元) | 変数 ic (2次元) | 格納値 |
---|---|---|---|
MyAry(1, ) | 1 | 0 | |
MyAry(1,1) | 1 | 1 | 1 |
MyAry(1,2) | 1 | 2 | 2 |
・・・ | |||
MyAry(1,5) | 1 | 5 | 5 |
MyAry(2, ) | 2 | 0 | |
MyAry(2,1) | 2 | 1 | 6 |
・・・ | |||
MyAry(2,5) | 2 | 5 | 10 |
MyAry(3, ) | 3 | 0 | |
MyAry(3,1) | 3 | 1 | 11 |
・・・ | |||
MyAry(3,5) | 3 | 5 | 15 |
1次元配列でも少し出てきましたが、配列を扱うにあたって重要な関数がLBoundとUBoundとなります。これを使い配列のループを行うことで、任意の処理をすることが可能となってきます。
Offsetプロパティ
最後は格納値を別のセルに書き込む作業で、ここで重要になってくるのがOffsetプロパティです。指定位置からの移動距離を指定する機能で、慣れてくると使用頻度が上がるプロパティなので徐々に覚えていったほうが良い物です。
使用しなくても同じ結果にするコードを書くことは可能ですが、行列方向に何セル動くかを数えなくてはなりませんので、Offsetプロパティを使用した方がスムーズに考える事が出来ると思います。
基本構文
範囲.Offset(RowOffset,ColumnOffset)
今回使用したOffset
Range("B7").Offset(ir - 1, ic - 1) = MyAry(ir, ic)
B7を起点とする同じ結果になるコード
Cells(ir + 6, ic + 1) = MyAry(ir, ic)
プロパティ名 | 動作 |
---|---|
RowOffset | 行方向に移動:1以上なら下へ 0はそのまま ‐1以下は上へ |
columnOffset | 列方向に移動:1以上なら右へ 0はそのまま ‐1以下は左へ |
B7のセルを基準に書き込みを行いたいのですが、最初の配列はMyAry(1,1)となっているため、そのままの変数の値で使用してしまうと「行方向に1」、「列方向に1」ずつずれが生るため、両方向に「‐1」を加えて相殺する事で開始位置を設定しています。
Range("B7").Offset(ir,ic) = MyAry(ir,ic)
↓
Range("B7").Offset(1,1) = MyAry(1,1)
↓
Range("B7").Offset(1-1,1-1) = MyAry(1,1)
↓
Range("B7").Offset(0,0) = MyAry(1,1)
そのままだとグレーの位置になるため、白の選択範囲になる様に調整してます!
状況にもよりますが、計算して開始位置を求める必要が出てきます。
まとめ
- 配列のループはセルと同じ考えで処理する
- Offsetは開始位置を計算して使う
お読みいただきありがとうございました。