特定の列の値だけ連結させたいけど、2次元配列だと上手くできない!
特定の列に入っている値を取り出し、それらの値を連結させて表示したいことがありました。
例えば、B列の値(B1〜B5)を取得し、「B1 B2 B3 B4 B5」という値に連結させるといった場合です。
そのため
- CurrentRegionで範囲を指定。
- 指定した範囲の値を2次元配列に格納。
- 配列のデータを連結(Join関数)し、値を変数へ格納。
といった手順を取ろうと思ったのですが、上手くいきませんでした。
理由は、Join関数が2次元配列を扱えないためです。
そのため2次元配列を1次元配列に変換し、変換した配列データをJoin関数で連結するようにしました。
忘れそうなので、備忘録的に残しておきます。
特定の列の値のみ連結する(配列処理)
具体的な、VBAコードは下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub CurrentRegionで取得した2次元配列データの特定の列を1次元配列へ変換し、データを連結() Dim ary1D() As Variant Dim ary2D() As Variant Dim ary1DJoin As String Dim columnsNo As Long 'CurrentRegionで指定した範囲の値を取得し、2次元配列に格納。 ary2D = Range("A1").CurrentRegion '1次元配列に2次元配列の指定した列のデータを格納。 'CurrentRegionの範囲の中で取得したい列を指定(この場合B列) columnsNo = 2 'Transposeで配列の行と列を入れ替え。 ary1D = WorksheetFunction.Index(WorksheetFunction.Transpose(ary2D), columnsNo) 'Joinで連結したデータを変数へ格納。 '配列の最大数がCurrentRegionの行数になるため、RTrimで不要なスペースを削除。 ary1DJoin = RTrim(Join(ary1D)) 'イミディエイトウィンドウに結果を出力。 Debug.Print ary1DJoin End Sub |
実行してみると…
イミディエイトウィンドウに結果が出力できていることがわかります。
特定の列の値のみ連結する(ループ処理)
ちなみに、配列を使わず for next や do loop でループさせても同じことができます。
for nextでの処理も記載してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub for_nextで最終行までの値を取得し、データを連結() Dim lastRow As Long Dim columnsNo As Long Dim ary1DJoin As String Dim i As Long columnsNo = 2 'columnsNo列の最終行を取得。 lastRow = Cells(Rows.Count, columnsNo).End(xlUp).Row '1行目から最終行まで順番に見ていき、値を連結してary1DJoinに格納。 For i = 1 To lastRow ary1DJoin = arXy1DJoin & Cells(i, columnsNo).value & " " Next i '不要なスペースを削除。 ary1DJoin = RTrim(ary1DJoin) 'イミディエイトウィンドウに結果を出力。 Debug.Print ary1DJoin End Sub |
実行してみると…
結果は同じですね。
なこあ
for nextでのループ処理だと行数の増加に伴い処理が遅くなるイメージがありますが、それはセルに貼り付ける場合です。
変数や配列に値を格納する場合においては、大きな差はないかと思います。
コメント