二次元配列の列を入れ替える、縮小する

二次元配列を入れ替える、縮小するマクロ 91回
二次元配列の列を入れ替える
二次元配列を取得したあとで、並べ替えたり縮小したりというようなことが必要になってくる場合があります。
また表からどの列でも自在に配列にするでは、このセル範囲から最初から一次元配列を取得してしまおうということでコードを考えてみました。
今回は、セル範囲の取得についてショートカットキーとの対抗でイメージしやすくなったと思いますので、全体を取得して移動したり、縮小したりという操作をマスターしてみましょう。
(サンプルファイルは、こちらから
マクロ講義サンプルデータ)
配列3列から2列に縮小
1. 図では支店名、店長名、コードの順に並んでいます。この列の並びを替えたり、不要な部分を削除して縮小していきます。

2. 動画103回のコードでは以下のようになりました。このコードをコピーして使いまわします。
配列の場合は、特に使いまわすメリットがあります。
理由の一つは同じ変数を使うということ、それから変数の型が一緒ということです。
'2次元配列から1次元配列にする 103回のコード Sub getoneDimension_fromTwo_2() Dim two_arr As Variant, one_arr As Variant, r As Long two_arr = shlist.Range("A1").CurrentRegion two_arr = WorksheetFunction.Transpose(two_arr) one_arr = WorksheetFunction.Index(two_arr, 2) For r = LBound(one_arr) To UBound(one_arr) Cells(r + 12, 3).Value = one_arr(r) Next r End Sub

3. 縮小することは変更を加えるということなので、新しい配列を作ると考えましょう。
そこで変数の名前をone_arrからnew_arrに変更します。
配列変数two_arrがセルA1のカレントリージョンであるということは、同じです。カレントリージョンを範囲にとると、列は3列ですからそれを.Resize(,2)2列に縮小します。new_arrは、A列とB列のデータが入ったことになります。
Sub getoneDimension_fromTwo_2() Dim two_arr As Variant, new_arr As Variant, r As Long two_arr = shlist.Range("A1").CurrentRegion new_arr = shlist.Range("A1").CurrentRegion.Resize(,2) End Sub

配列の中身を入れ替える様子をローカルウィンドゥとウォッチウィンドゥで確認
4.次に実際には、B列のデータの代わりにC列のデータを入れたいわけです。
For文を使ってnew_arrのデータを入れ替えます。
For r = LBound(new_arr, 1) To UBound(new_arr, 1) new_arr(r, 2) = two_arr(r, 3) Next r

5. 配列でFor文を使う時には、LBound UBoundを指定できるので、コードを書くのがとても簡単です。エクセルがデータ数を把握してくれるからです。

6. コードがどのように配列を3列から2列にして、中身を変えていくのかを、ローカルウィンドゥとウォッチウィンドゥで確認しています。

7. 最初にnew_arr(1,2)の値"CODE"が入りました。

8. どんどんFor文を繰り返すうちに、店長名からCODO番号に変わっていきます。

シート上の表から、配列を取得し、さらにその配列を用途に応じて縮小するというコードでした。
Sub decleaseIndex_from2Dimension() Dim two_arr As Variant, new_arr As Variant, r As Long two_arr = shlist.Range("A1").CurrentRegion new_arr = shlist.Range("A1").CurrentRegion.Resize(, 2) For r = LBound(new_arr, 1) To UBound(new_arr, 1) new_arr(r, 2) = two_arr(r, 3) Next r End Sub