ExcelVBAで配列を扱っていると、次のようなことはありませんか?
- 配列に入っているデータを、カンマ区切りの1つの文字列にまとめたい
- 複数のセルの値を、改行区切りでメール本文に埋め込みたい
- For文でループしながら文字列を連結するコードを、もっとシンプルに書きたい
このような場合は、Join関数を使うことで解決できます。1次元配列の要素を、指定した区切り文字でつなげて1つの文字列にまとめられる関数です。
この記事では、Join関数の基本構文から、Split関数との関係、実務でよく使うCSV作成・メール本文作成の例、そして配列が空のときの注意点までを分かりやすく解説します。
Join関数とは
Join関数は、1次元配列に入っている複数の値を、指定した区切り文字(デリミタ)でつなぎ合わせて、1つの文字列として返す関数です。
すでにigapblogで紹介したSplit関数(文字列を区切り文字で分割して配列にする関数)とは、ちょうど逆の働きをする関数だとイメージすると覚えやすいです。
基本構文
Join(配列, 区切り文字)
- 配列:結合したい値が入っている1次元配列(必須)
- 区切り文字:各要素の間に挿入する文字列(省略可、省略時は半角スペース)
基本的な使い方
まずはシンプルな例で動きを確認しましょう。
Sub JoinBasic()
Dim arr(2) As String
arr(0) = "りんご"
arr(1) = "みかん"
arr(2) = "ぶどう"
Dim result As String
result = Join(arr, ", ")
MsgBox result ' → "りんご, みかん, ぶどう"
End Sub
配列arrの3つの要素が、区切り文字「, 」でつながれて1つの文字列になります。For文でDim result As Stringに1つずつ足していくよりも、圧倒的にシンプルに書けます。
区切り文字を省略した場合
区切り文字を省略すると、半角スペースで結合されます。
Sub JoinDefault()
Dim arr(1) As String
arr(0) = "Excel"
arr(1) = "VBA"
MsgBox Join(arr) ' → "Excel VBA"
End Sub
実務でよく使うパターン①:セルの値からCSV文字列を作る
指定した範囲のセルの値を、カンマ区切りのCSV形式の文字列にまとめたいときにJoin関数が役立ちます。
Sub CreateCsvString()
Dim i As Long
Dim arr() As String
ReDim arr(1 To 5)
For i = 1 To 5
arr(i) = Cells(i, "A").Value
Next i
Dim csvText As String
csvText = Join(arr, ",")
Debug.Print csvText ' → "値1,値2,値3,値4,値5"
End Sub
ループの中では配列に値を溜めるだけにして、最後にJoin関数で一気に結合することで、文字列連結(&演算子)を繰り返すよりも読みやすいコードになります。
実務でよく使うパターン②:メール本文を改行区切りで作成する
Outlookへのメール送信マクロなどで、複数行のメール本文を組み立てる際にもJoin関数が便利です。
Sub CreateMailBody()
Dim lines() As String
ReDim lines(3)
lines(0) = "いつもお世話になっております。"
lines(1) = ""
lines(2) = "本日の売上報告をお送りいたします。"
lines(3) = "ご確認のほどよろしくお願いいたします。"
Dim mailBody As String
mailBody = Join(lines, vbCrLf)
MsgBox mailBody
End Sub
区切り文字にvbCrLf(改行)を指定することで、配列の各要素を1行ずつ改行で区切った本文を簡単に作成できます。
Split関数と組み合わせて使う
Join関数はSplit関数とセットで使われることも多い関数です。たとえば、カンマ区切りの文字列を一度配列に分解し、加工してから再び結合する、といった処理が可能です。
Sub SplitAndJoin()
Dim source As String
source = "田中,佐藤,鈴木"
' 文字列を配列に分割
Dim arr() As String
arr = Split(source, ",")
' 配列の中身を加工(敬称を追加)
Dim i As Long
For i = LBound(arr) To UBound(arr)
arr(i) = arr(i) & "様"
Next i
' 再び1つの文字列に結合
Dim result As String
result = Join(arr, "、")
MsgBox result ' → "田中様、佐藤様、鈴木様"
End Sub
【重要】Join関数を使うときの注意点
1. 対象は1次元配列のみ
Join関数に渡せるのは1次元配列だけです。2次元配列(Cells(1,1).Resize(5,2).Valueのような、セル範囲を丸ごと配列化したもの)をそのまま渡すと、実行時エラー「型が一致しません」が発生します。2次元配列の場合は、1列分・1行分をあらかじめ1次元配列に詰め直してからJoin関数を使う必要があります。
2. 未初期化の配列(空の配列)を渡すとエラーになる
一度も要素数を確保していない動的配列(Dim arr() As StringだけでReDimしていない状態)をJoin関数に渡すと、実行時エラーが発生します。
Sub JoinEmptyArrayError()
Dim arr() As String
' ReDimしていない未初期化の配列
Dim result As String
result = Join(arr, ",") ' 実行時エラー「添字が有効範囲にありません」
End Sub
Split関数の戻り値のように、配列が空になる可能性がある場合は、事前に要素数をチェックしてからJoin関数を使うようにしましょう。
Dim arr() As String
arr = Split("", ",") ' 空文字列をSplitすると要素数1の配列になる(エラーにはならない)
If (Not Not arr) <> 0 Then ' 配列が初期化済みかどうかの簡易チェック
Debug.Print Join(arr, ",")
End If
3. 区切り文字を省略すると半角スペースになる点に注意
区切り文字を指定し忘れると、意図せず半角スペース区切りの文字列になってしまいます。CSVやログ出力など、区切り文字が結果を左右する用途では、必ず第2引数を明示的に指定する習慣をつけましょう。
Join関数とSplit関数の対応関係
| 関数 | 変換の方向 | 用途の例 |
|---|---|---|
| Split関数 | 文字列 → 配列 | CSVの1行を項目ごとに分解する |
| Join関数 | 配列 → 文字列 | 複数の値を1つの文字列にまとめて出力する |
まとめ
Join関数を使いこなせるようになると、配列に溜めたデータを、CSV文字列やメール本文など、用途に応じた区切り文字で簡単にまとめられるようになります。For文で文字列連結を繰り返すよりもシンプルで読みやすいコードになるため、配列を扱うマクロではぜひ活用してみてください。
ただし、1次元配列にしか使えない点と、未初期化の配列を渡すとエラーになる点は必ず押さえておき、Split関数とセットで使い方を覚えておくと、文字列と配列の変換がスムーズにできるようになります。


コメント