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

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

二次元配列を入れ替える、縮小するマクロ 91回

二次元配列の列を入れ替える

二次元配列を取得したあとで、並べ替えたり縮小したりというようなことが必要になってくる場合があります。 また表からどの列でも自在に配列にするでは、このセル範囲から最初から一次元配列を取得してしまおうということでコードを考えてみました。
今回は、セル範囲の取得についてショートカットキーとの対抗でイメージしやすくなったと思いますので、全体を取得して移動したり、縮小したりという操作をマスターしてみましょう。

(サンプルファイルは、こちらから マクロ講義サンプルデータ

配列3列から2列に縮小

1. 図では支店名、店長名、コードの順に並んでいます。この列の並びを替えたり、不要な部分を削除して縮小していきます。


二次元配列を入れ替える、縮小する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

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

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

二次元配列を入れ替える、縮小する3
スポンサーリンク
スポンサーリンク

配列の中身を入れ替える様子をローカルウィンドゥとウォッチウィンドゥで確認

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

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

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


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

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


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

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


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

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


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

シート上の表から、配列を取得し、さらにその配列を用途に応じて縮小するというコードでした。

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