概要
「VBAのコードを大量に書くのが面倒…」
「変数宣言を一気に作りたい」
「配列の初期化文をExcelから自動生成したい」
「Select Case の Case 文をリストから作りたい」
こういう “VBAコードの部品をExcelで自動生成したい” ときに最強なのが TEXTJOIN 関数です。
TEXTJOIN は
「区切り文字を指定して、複数セルをまとめて結合する」
という関数で、VBAコードのような「規則的な文字列」を作るのに非常に向いています。
ここでは、初心者でもすぐ使えるように、
VBAコード生成に特化したTEXTJOINの使い方 をテンプレートと例題つきで丁寧に解説します。
TEXTJOIN の基本
基本構文
=TEXTJOIN(区切り文字, 空白セル無視, 結合範囲)
例:
=TEXTJOIN(", ", TRUE, A2:A5)
A2:A5 が
A
B
C
D
なら結果は
A, B, C, D
VBAコード生成では、この「区切り文字」を
vbCrLf(改行)","(カンマ)" & vbCrLf & "(VBAの改行連結)"Case "(Case文の接頭辞)
などに変えることで、コードを量産できます。
パターン1:変数宣言(Dim文)をまとめて生成
例:A2:A5 に変数名が入っているとする
A2:userName
A3:userId
A4:userAge
A5:userMail
これを次のようなVBAコードにしたい:
Dim userName As String
Dim userId As String
Dim userAge As String
Dim userMail As String
まず、B2 に次の式を入れて下へコピーします。
="Dim " & A2 & " As String"
B2:B5 がすべて「Dim ~」の形になります。
次に、どこかのセルで TEXTJOIN を使います。
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
結果:
Dim userName As String
Dim userId As String
Dim userAge As String
Dim userMail As String
これをそのままVBAに貼り付ければOKです。
パターン2:Select Case の Case 文を生成
例:A2:A5 にコード一覧があるとする
A2:A001
A3:A002
A4:A003
A5:A004
これを次のような Case 文にしたい:
Case "A001"
Case "A002"
Case "A003"
Case "A004"
B2 に次の式を入れて下へコピー:
="Case """ & A2 & """"
(""" はダブルクォートを文字として出すため)
B2:B5 が Case 文になります。
あとは TEXTJOIN:
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
これで Case 文が一気に生成できます。
パターン3:配列の初期化文を生成
例:A2:A5 に値が入っているとする
A2:Apple
A3:Orange
A4:Banana
A5:Grape
これを VBA の配列初期化文にしたい:
arr = Array("Apple", "Orange", "Banana", "Grape")
まず、B2 に次の式を入れて下へコピー:
="""" & A2 & """"
(値をダブルクォートで囲む)
B2:B5 が "Apple" のような形になります。
次に TEXTJOIN:
="arr = Array(" & TEXTJOIN(", ", TRUE, B2:B5) & ")"
結果:
arr = Array("Apple", "Orange", "Banana", "Grape")
パターン4:With ~ End With の中身を生成
例:A2:A5 にプロパティ名があるとする
A2:Name
A3:Age
A4:Mail
A5:Address
これを次のようにしたい:
.Name = Name
.Age = Age
.Mail = Mail
.Address = Address
B2 に次の式を入れて下へコピー:
="." & A2 & " = " & A2
B2:B5 がプロパティ設定文になります。
TEXTJOIN:
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
これを With ブロックに貼り付ければ完成です。
パターン5:複数行のコードを「VBA文字列」として生成
VBAでメッセージボックス用の長文を作りたいときなど、
Excelでコードを生成してしまうと便利です。
例:A2:A4 に
A2:処理を開始します
A3:しばらくお待ちください
A4:完了しました
これを VBA の
MsgBox "処理を開始します" & vbCrLf & _
"しばらくお待ちください" & vbCrLf & _
"完了しました"
のようにしたい場合。
B2 に次の式を入れて下へコピー:
="""" & A2 & """ & vbCrLf & _"
最後の行だけは _ を外す必要がありますが、
TEXTJOIN でまとめると次のようにできます。
=TEXTJOIN(CHAR(10), TRUE, B2:B4)
必要に応じて最後の _ を手で削除すればOKです。
VBAコード生成の“型”まとめ
Dim文生成
="Dim " & A2 & " As String"
Case文生成
="Case """ & A2 & """"
配列初期化文
="arr = Array(" & TEXTJOIN(", ", TRUE, B2:B5) & ")"
Withブロック用プロパティ設定
="." & A2 & " = " & A2
複数行のVBA文字列生成
="""" & A2 & """ & vbCrLf & _"
例題
問題1
A2:A5 に変数名が入っています。
これらを「Dim 変数名 As String」の形にし、改行で結合したいです。
TEXTJOIN を使った式を書いてください。
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
(※B2:B5 に "Dim " & A2 & " As String" を作っておく)
問題2
A2:A5 にコード一覧が入っています。
これらを Case "コード" の形にして、改行で結合したいです。
TEXTJOIN を使った式を書いてください。
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
(※B2 に ="Case """ & A2 & """" を作っておく)
問題3
A2:A5 に値が入っています。
これらを "値" の形にしてカンマ区切りで結合し、arr = Array(...) の形にしたいです。
TEXTJOIN を使った式を書いてください。
="arr = Array(" & TEXTJOIN(", ", TRUE, B2:B5) & ")"
問題4
A2:A5 にプロパティ名が入っています。
これらを .Name = Name のような形にして、改行で結合したいです。
TEXTJOIN を使った式を書いてください。
=TEXTJOIN(CHAR(10), TRUE, B2:B5)
問題5
A2:A4 にメッセージ文が入っています。
これらを "文" & vbCrLf & _ の形にして、改行で結合したいです。
TEXTJOIN を使った式を書いてください。
=TEXTJOIN(CHAR(10), TRUE, B2:B4)
TEXTJOIN は、
「ExcelでVBAコードを大量生成するための最強ツール」 と言っても過言ではありません。
規則的なコードはすべて Excel で作れるので、
ぜひ“VBAコード生成の型”として活用してみてください。
