2次元配列の変形と再配置をプロ並みに行う方法をご紹介 マクロ講座

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

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

2次元配列の形状変更と再配置の方法。二次元配列を入れ替える、縮小するマクロ 91回

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

二次元配列を取得したあとで、並べ替えたり縮小したりというようなことが必要になってくる場合があります。 また表からどの列でも自在に配列にするでは、このセル範囲から最初から一次元配列を取得してしまおうということでコードを考えてみました。

今回は、セル範囲の取得についてショートカットキーとの対抗でイメージしやすくなったと思いますので、全体を取得して移動したり、縮小したりという操作をマスターしてみましょう。

この記事では、以下の内容について解説しています。

  • 1. 二次元配列を並べ替える方法
  • 2. 二次元配列を縮小する方法
  • 3. ショートカットキーを使用してセル範囲の取得方法
  • 4. 既存のコードをコピーして再利用するメリット
  • 5. 配列変数の名前を変更する方法
  • 6. Resize関数を使って、配列の列数を変更する方法
  • 7. For文を使用して配列内のデータを入れ替える方法
  • 8. LBoundおよびUBound関数を使用してFor文で配列を操作する際の簡単なコード作成
  • 9. ローカルウィンドウとウォッチウィンドウを使用して、配列内のデータ変更を確認する方法


(練習ファイルがダウンロードできます。 練習ファイルの配布)マクロコードは記述されていません。

2次元配列の変形と再配置二次元配列を並べ替える 配列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関数を使って、.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
CurrentRegionプロパティのショートカット

Excelシート上では「Ctrl」+「Shift」+「*」のショートカットで選択現在の範囲を取得します。
それと同じ範囲をCurrentRegionは取得します。
行数や列数が変わる表全体のセル範囲をVBAで取得する場合によく使います。

Risize関数のおさらい

Resize関数は、ExcelのVBAで使用されるメソッドです。
特定の範囲をリサイズするのに役立ちます。この関数は、元の範囲を基準にして、新しい範囲の行数と列数を指定してサイズを変更することができます。

Resize関数は、主にセル範囲のサイズを変更する場合や、範囲内のデータを操作する際に使用されます。
Resize関数の構文は以下のようになります。
RangeObject.Resize(RowSize, ColumnSize)

配列の中身を入れ替える For文を使って

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

LBoundおよびUBound関数を使用してFor文で配列を操作する

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

動画で学ぶマクロ こちらもおすすめ