EXCEL VBA 配列の要素を結合・特定の列データを結合・セル同士の結合・文字列を結合する方法(Join関数)
EXCEL VBA 配列の要素を結合・特定の列データを結合・セル同士の結合・文字列を結合する方法(Join関数)
今回説明するのは、Join関数の利用方法を説明いたします。Join関数は、配列に格納されている各要素を結合する時に、Join関数を使用します。また、配列をカンマ区切りなどの文字列にする時などに利用します。それでは、サンプルプログラムを交えて順番に説明いたします。
●【Join関数については、下記を参照して下さい】:参考(Microsoft社 様)
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/join-function
● Join関数を利用するには、下記の通りに設定を行います。
【構文】
● Join(文字列配列,区切り文字)
※文字列配列・・・要素を結合する配列を設定します。(1次元配列)
※区切り文字・・・結合する要素(文字列)を区切る文字(記号)を設定します。
(省略可能・・・省略した場合は、半角スペース)
【使用例】
●配列Temp(東京、神奈川、埼玉、千葉)別々の配列をJoinで結合して配列Ansへ代入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' ' Sub Join00A() Dim Temp(3), Ans As String Temp(0) = "東京" Temp(1) = "神奈川" Temp(2) = "埼玉" Temp(3) = "千葉" Ans = join(Temp, ",") MsgBox Ans End Sub ' |
【実行結果】
【注意点】
①2次元以上の配列では、Join関数は利用できない。(1次元配列に分割すればOK)
②直接セル範囲は指定する事はできません。(配列に取り込めばOK)
EXCEL VBA 配列の要素を結合・数値の配列データ251個をひとつに結合する(Join関数)
下記のサンプルプログラムは、Join関数を使って各配列データをひとつに纏めるサンプルプログラムです。配列データとして0~250(251個)用意して、その個々の配列に配列番号と同じ番号を配列に格納します。その格納したデータをJoin関数で、カンマ区切りで一つに纏めます。
【プログラムの流れ】
① 設定した配列0~250(251回)まで繰り返します。
② 各配列に配列番号と同じ番号を格納します。
③ 各配列に格納した0~250の配列データをカンマ区切りでひとつ(Ans)に纏めます。
④ 一つにまとめたデータ(Ans)をメッセージボックスで表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' ' Sub Join01() '数値の配列データ251個を一つに結合する。 Dim Temp(250), Ans As String Dim I As Long For I = 0 To UBound(Temp) '配列 0~250まで繰り返します。 Temp(I) = I '各配列に配列番号と同じ番号を格納します。 Next I Ans = join(Temp, ",") '格納した0~250の配列をカンマ区切りでひとつに纏めます。 MsgBox Ans 'ひとつに纏めたデータをメッセージBoxに表示します。 End Sub ' |
(画面クリックして拡大)
EXCEL VBA セル範囲から2つの配列を作成してその配列を結合します。(Join関数)
下記のサンプルプログラムは、セル範囲(A列~B列)を指定して、そのセル範囲データを配列データとして2次元配列で取り込み、A列・B列ごとに1次元配列に分割して、分割格納したデータをJoin関数で”ー”ハイホン区切りで一つに纏めます。(A列とB列のデータを結合します)2次元配列でも1次元配列に分割する事で、Join関数を利用する事が出来ます。
【プログラムの流れ】
① B列の最終行を取得します。
② ワークシートのセルA1~B10(最終行)の範囲を2次元配列で取り込みます。
③ 2次元配列で取り込んだA列データを配列(Temp01)へ移行します。
④ 2次元配列で取り込んだB列データを配列(Temp02)へ移行します。
⑤ 仮の配列(Ans)を再定義して正確な配列個数を指定します。
⑥ Temp01(A列)配列分を繰り返します。
⑦ Temp01(A列)とTemp02(B列)の配列を結合します。 ⑥へ
⑧ 結合した配列データを”ー”アンダーバー区切りで、一つに纏めます。
⑨ メッセージボックスで結合した結果を表示します。
【プログラム実行条件】
・ワークシートのA列とB列に同じ件数を登録します。
・セル範囲については、A列・B列は固定です。行数の指定はありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' ' Sub Join02() '2つの配列データをJoin関数で結合する。 Dim Temp01(), Temp02(), Array01() As Variant Dim Ans(), Msg As String Dim I,lRow As Long lRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の最終列を取得します。 Array01 = Range("A1:B" & lRow) '表の範囲を2次元配列で取り込む Temp01 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 1) '1次元配列に分割 (A列) Temp02 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 2) '1次元配列に分割 (B列) ReDim Ans(UBound(Temp01)) '配列を再定義する。(A列の配列分) For I = 1 To UBound(Temp01) 'A列分の配列を繰り返す。 Ans(I - 1) = Temp01(I) & Temp02(I) 'A列の配列とB列の配列を結合する。 Next I Msg = join(Ans, "-") '結合した配列を一つに纏めます。 MsgBox Msg '結果を表示します。 End Sub ' |
(画面クリックして拡大)
EXCEL VBA 複数の列データを一つ列に結合して転記します。(列単位の文字列結合・大量データ処理・高速に結合)
※Join関数は使用していません。
下記のサンプルプログラムは、列ごとのデータを行単位で複数の列データを結合して、指定したセルへ転記するサンプルプログラムです。なお、今回のプログラムでは、Join関数は使用していませんが、大量のデータを行単位で複数列を結合する時にとても便利だと思います。セルデータを配列へ取り込み結合処理する事で高速に処理する事が出来ます。
テスト的に2万件作成し、下記のサンプルプログラムをの実行しましたが、一瞬(約1秒)でA列・B列・C列のデータがE列へ結合されました。
【プログラムの流れ】
① C列の最終列を取得します。
② A1~C列の最終行までデータを2次元配列へ登録します。
③ 2次元配列へ取り込んだA列のデータTemp01へ分割(1次元配列)します。
④ 2次元配列へ取り込んだB列のデータTemp02へ分割(1次元配列)します。
⑤ 2次元配列へ取り込んだC列のデータTemp03へ分割(1次元配列)します。
⑥ 結合する配列StrをA列の配列件数分に再定義します。
⑦ A列の配列件数分繰り返します。
⑧ A列配列(Temp01)・B列配列(Temp02)・C列配列(Temp03)のデータを配列(Str)へ結合します。
⑨ 結合したデータ全てをE列に転記します。
【プログラム実行条件】
・A列・B列・C列共に同じ件数のデータを作成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' ' Sub Join03a() '大量データの文字列結合(高速) Dim Temp01(), Temp02(), Temp03(), Array01(), Str() As Variant Dim I, lRow As Long lRow = Cells(Rows.Count, "C").End(xlUp).Row 'C列の最終列を取得します。 Array01 = Range("A1:C" & lRow) 'A1~C列の最終行までデータを2次元配列で登録します。 Temp01 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 1) 'A列のデータをTemp01へ分割します。 Temp02 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 2) 'B列のデータをTemp01へ分割します。 Temp03 = WorksheetFunction.Index(WorksheetFunction.Transpose(Array01), 3) 'C列のデータをTemp01へ分割します。 ReDim Str(UBound(Temp01)) 'Strの配列をA列の配列件数で再定義します。 For I = 1 To UBound(Temp01) 'A列のデータ分繰り返します。 Str(I - 1) = Temp01(I) & "-" & Temp02(I) & "-" & Temp03(I) '分割したA列・B列・C列のデータを結合します。 Next I Range("E1:E" & UBound(Temp01)) = WorksheetFunction.Transpose(Str) 'E列に結合したデータを全て転記します。 End Sub ' |
(画面クリックして拡大)
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。