Join関数
Join 関数は、配列の要素を指定した区切り文字で結合して、1 つの文字列を作成する VBA の関数です。Split 関数の逆操作として機能し、データの出力や整形に非常に便利です。
プレイグラウンドで試す
配列要素 (改行区切りで入力) と区切り文字を変更すると、Join 関数が生成する文字列がリアルタイムに更新されます。Split 関数とあわせて、両者が逆操作になっていることを確認してみましょう。
Join 関数を試す
配列要素と区切り文字を変えて、結合結果を確認できます。
Join(sourceArray, delimiter)配列の各要素を区切り文字で連結して文字列を作ります。
💡 4 個の要素を連結しました。
生成された VBA コード
Dim arr As Variant
arr = Array("apple", "banana", "cherry", "date")
Debug.Print Join(arr, ", ")基本構文
Join(配列, [区切り文字])
引数
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
| 配列 | 配列(Variant) | ○ | 結合する 1 次元配列(String 型・Variant 型) |
| 区切り文字 | String | × | 区切り文字(省略時はスペース、"" で区切りなし) |
戻り値
結合された文字列(String 型)
基本的な使い方
シンプルな結合
Sub JoinBasicExample()
Dim fruits() As Variant
Dim result As String
' 配列を定義
fruits = Array("りんご", "バナナ", "オレンジ")
' カンマで結合
result = Join(fruits, ",")
Debug.Print result ' りんご,バナナ,オレンジ
' スペースで結合
result = Join(fruits, " ")
Debug.Print result ' りんご バナナ オレンジ
' 改行で結合
result = Join(fruits, vbCrLf)
Debug.Print result
' 出力:
' りんご
' バナナ
' オレンジ
End Sub
区切り文字の省略
Sub JoinDefaultDelimiter()
Dim words() As Variant
Dim sentence As String
words = Array("Hello", "World", "from", "VBA")
' 区切り文字を省略(スペースで結合)
sentence = Join(words)
Debug.Print sentence ' Hello World from VBA
End Sub
区切り文字を省略すると、スペース(”
“)で結合されます。区切り文字に空文字列("")を明示的に渡すと、区切りなしで要素がそのまま連結されます。
Split と Join の組み合わせ
データの加工と再結合
Sub SplitJoinCombo()
Dim text As String
Dim parts() As String
Dim result As String
' CSVデータを読み込んで加工
text = "りんご,バナナ,オレンジ"
' 分割
parts = Split(text, ",")
' 各要素を加工(例:前に番号を付ける)
Dim i As Long
For i = LBound(parts) To UBound(parts)
parts(i) = (i + 1) & ". " & parts(i)
Next i
' 再結合
result = Join(parts, vbCrLf)
Debug.Print result
' 出力:
' 1. りんご
' 2. バナナ
' 3. オレンジ
End Sub
CSV データの生成
Sub CreateCSVLine()
Dim data() As Variant
Dim csvLine As String
' データ配列を作成
data = Array("山田太郎", "営業部", "東京都", "yamada@example.com")
' CSV形式に変換
csvLine = Join(data, ",")
Debug.Print csvLine
' 出力: 山田太郎,営業部,東京都,yamada@example.com
' ファイルに書き込む場合
Dim fileNum As Integer
fileNum = FreeFile
Open "C:\output.csv" For Append As #fileNum
Print #fileNum, csvLine
Close #fileNum
End Sub
実践的な活用例
SQL の IN 句を生成
Sub GenerateSQLIN()
Dim ids() As Variant
Dim sqlCondition As String
ids = Array(1, 5, 10, 15, 20)
' IN句用の文字列を生成
sqlCondition = "id IN (" & Join(ids, ", ") & ")"
Debug.Print sqlCondition
' 出力: id IN (1, 5, 10, 15, 20)
' 実際のSQL文
Dim sql As String
sql = "SELECT * FROM users WHERE " & sqlCondition
Debug.Print sql
End Sub
文字列の ID を IN 句に使う場合は、各要素をシングルクォートで囲む必要があります。また、ユーザー入力をそのまま SQL に連結すると SQL インジェクションの原因になるため、実運用ではパラメータ化クエリを使用してください。
パンくずリストの生成
Sub GenerateBreadcrumb()
Dim path() As Variant
Dim breadcrumb As String
path = Array("ホーム", "製品", "カテゴリ", "商品詳細")
' パンくずリストを生成
breadcrumb = Join(path, " > ")
Debug.Print breadcrumb
' 出力: ホーム > 製品 > カテゴリ > 商品詳細
' HTMLバージョン
breadcrumb = Join(path, " > ")
Debug.Print breadcrumb
End Sub
タグのリスト表示
Sub DisplayTags()
Dim tags() As Variant
Dim tagList As String
tags = Array("VBA", "Excel", "自動化", "プログラミング")
' ハッシュタグ形式
Dim i As Long
For i = LBound(tags) To UBound(tags)
tags(i) = "#" & tags(i)
Next i
tagList = Join(tags, " ")
Debug.Print tagList
' 出力: #VBA #Excel #自動化 #プログラミング
End Sub
ファイルパスの構築
Sub BuildFilePath()
Dim pathParts() As Variant
Dim filePath As String
pathParts = Array("C:", "Users", "Username", "Documents", "report.xlsx")
' バックスラッシュで結合
filePath = Join(pathParts, "\")
Debug.Print filePath
' 出力: C:\Users\Username\Documents\report.xlsx
End Sub
複数列のデータを結合
Sub JoinMultiColumnData()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim rowData() As Variant
Dim combined As String
Set ws = ActiveSheet
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
' 各行のA〜C列を結合
For i = 2 To lastRow
ReDim rowData(2)
rowData(0) = ws.Cells(i, 1).Value
rowData(1) = ws.Cells(i, 2).Value
rowData(2) = ws.Cells(i, 3).Value
' スペースで結合してD列に出力
combined = Join(rowData, " ")
ws.Cells(i, 4).Value = combined
Next i
End Sub
パフォーマンス最適化
文字列連結との比較
Sub ComparePerformance()
Dim items() As String
Dim i As Long
Dim result As String
Dim startTime As Double
' 10000個の要素を持つ配列を作成
ReDim items(9999)
For i = 0 To 9999
items(i) = "item" & i
Next i
' 方法1: &演算子でループ連結(遅い)
startTime = Timer
result = ""
For i = 0 To 9999
result = result & items(i) & ","
Next i
Debug.Print "&演算子: " & Format(Timer - startTime, "0.000") & "秒"
' 方法2: Join関数(速い)
startTime = Timer
result = Join(items, ",")
Debug.Print "Join関数: " & Format(Timer - startTime, "0.000") & "秒"
End Sub
大量の文字列を結合する場合、ループ内で&演算子を使うよりも、配列に格納してからJoin関数で結合する方が圧倒的に高速です。
注意点と Tips
空文字列の処理
Sub JoinWithEmptyStrings()
Dim data() As Variant
Dim result As String
' 空文字列を含む配列
data = Array("a", "", "b", "", "", "c")
' 空文字列も結合される
result = Join(data, ",")
Debug.Print result ' a,,b,,,c
' 空文字列を除外する場合
Dim filtered() As String
Dim count As Long
Dim i As Long, j As Long
' 空でない要素をカウント
For i = LBound(data) To UBound(data)
If data(i) <> "" Then count = count + 1
Next i
' フィルタリング
If count > 0 Then
ReDim filtered(count - 1)
j = 0
For i = LBound(data) To UBound(data)
If data(i) <> "" Then
filtered(j) = data(i)
j = j + 1
End If
Next i
result = Join(filtered, ",")
Debug.Print result ' a,b,c
End If
End Sub
数値配列の結合
Sub JoinNumbers()
Dim numbers() As Variant
Dim result As String
' 数値の配列
numbers = Array(1, 2, 3, 4, 5)
' Join関数は数値も文字列として結合
result = Join(numbers, ", ")
Debug.Print result ' 1, 2, 3, 4, 5
' 計算式の生成
result = Join(numbers, " + ")
Debug.Print result & " = " & Evaluate(result)
' 出力: 1 + 2 + 3 + 4 + 5 = 15
End Sub
使えない配列に注意
Join 関数に渡せるのは 1 次元配列 のみです。次の場合はエラーになります。
- 2 次元配列(
Range("A1:C3").Valueで得られる配列など)を渡す → 実行時エラー 5「プロシージャの呼び出し、または引数が不正です」 Long型やInteger型など、String/Variant以外の型の配列を渡す → 実行時エラー 13「型が一致しません」- 要素に
Nullが含まれる → 実行時エラー 94「Null の使い方が不正です」
Sub JoinRangeRow()
' 1行(2次元配列)をそのまま渡すとエラーになるため、
' 1次元配列に詰め替えてから結合する
Dim v As Variant
Dim arr() As Variant
Dim c As Long
v = Range("A1:C1").Value
ReDim arr(0 To UBound(v, 2) - 1)
For c = 1 To UBound(v, 2)
arr(c - 1) = v(1, c)
Next c
Debug.Print Join(arr, ",")
End Sub
Excel 2019 以降や Microsoft 365 では、ワークシート関数の TEXTJOIN
でセル範囲を直接結合できます。VBA からは Application.WorksheetFunction.TextJoin(",", True, Range("A1:C1")) で呼び出せます。
まとめ
Join 関数は、配列を文字列に結合する際の標準的な方法です。
重要なポイント:
- 1 次元配列の要素を指定した区切り文字で結合
- 区切り文字を省略するとスペースで結合
- Split 関数の逆操作
&演算子のループより高速- CSV 生成や SQL 文の構築に最適
関連関数:
Join 関数を活用することで、効率的な文字列生成と、読みやすいコードを実現できます。