【ExcelVBA・マクロ】Join関数の使い方|配列を1つの文字列に結合する方法【コピペOK】

Join関数の使い方 ExcelVBA

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関数とセットで使い方を覚えておくと、文字列と配列の変換がスムーズにできるようになります。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました