
2次元配列の形状変更と再配置の方法。二次元配列を入れ替える、縮小するマクロ 91回
二次元配列を取得したあとで、並べ替えたり縮小したりというようなことが必要になってくる場合があります。 また表からどの列でも自在に配列にするでは、このセル範囲から最初から一次元配列を取得してしまおうということでコードを考えてみました。
今回は、セル範囲の取得についてショートカットキーとの対抗でイメージしやすくなったと思いますので、全体を取得して移動したり、縮小したりという操作をマスターしてみましょう。
この記事では、以下の内容について解説しています。
(練習ファイルがダウンロードできます。 練習ファイルの配布)マクロコードは記述されていません。
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関数を使って、.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

Excelシート上では「Ctrl」+「Shift」+「*」のショートカットで選択現在の範囲を取得します。
それと同じ範囲をCurrentRegionは取得します。
行数や列数が変わる表全体のセル範囲をVBAで取得する場合によく使います。
Resize関数は、ExcelのVBAで使用されるメソッドです。
特定の範囲をリサイズするのに役立ちます。この関数は、元の範囲を基準にして、新しい範囲の行数と列数を指定してサイズを変更することができます。
Resize関数は、主にセル範囲のサイズを変更する場合や、範囲内のデータを操作する際に使用されます。
Resize関数の構文は以下のようになります。
RangeObject.Resize(RowSize, ColumnSize)
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