区切り文字で分割
「セルの中に A,B,C のように区切り文字で並んでいる値を分割したい」——CSVやログ処理でよく出てくるニーズです。初心者でも安心して使える、最短コードから応用テンプレまでまとめました。
基本:Split関数で文字列を分割
Sub SplitBasic()
Dim s As String
s = "A,B,C,D"
Dim arr() As String
arr = Split(s, ",") 'カンマで分割 → {"A","B","C","D"}
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
VB- ポイント
Split(文字列, 区切り文字)で配列に分割。- 配列は 0から始まるので
LBoundとUBoundで範囲を取る。 - 区切り文字は
" "(スペース)、";"(セミコロン)など自由。
応用1:セルの値を分割して横に展開
Sub SplitCellToColumns()
Dim s As String, arr() As String, i As Long
s = Range("A2").Value '例:セルA2に "100|200|300"
arr = Split(s, "|") '区切り文字は「|」
For i = LBound(arr) To UBound(arr)
Cells(2, i + 2).Value = arr(i) 'B2, C2, D2…に展開
Next
End Sub
VB- ポイント
Cells(行, 列)で展開先を指定。i+2はB列から開始するため。- 区切り数が可変でも配列長に合わせて展開できる。
応用2:セルの値を分割して縦に展開
Sub SplitCellToRows()
Dim s As String, arr() As String, i As Long
s = Range("A2").Value '例:セルA2に "東京,大阪,名古屋"
arr = Split(s, ",")
For i = LBound(arr) To UBound(arr)
Cells(i + 2, "B").Value = arr(i) 'B2, B3, B4…に展開
Next
End Sub
VB- ポイント
- 縦方向に展開したいときは「行番号」を
i+2で増やす。
- 縦方向に展開したいときは「行番号」を
応用3:複数セルを一括処理(配列+ループ)
Sub SplitRangeAll()
Dim rng As Range, c As Range
Set rng = Range("A2:A10") '対象範囲
Dim arr() As String, i As Long
For Each c In rng
If Len(c.Value) > 0 Then
arr = Split(c.Value, ";") 'セミコロン区切り
For i = LBound(arr) To UBound(arr)
c.Offset(0, i + 1).Value = arr(i) '右に展開
Next
End If
Next
End Sub
VB- ポイント
Offset(0, i+1)で元セルの右隣に展開。- 空セルはスキップするように
If Len(c.Value) > 0を入れる。
応用4:区切り文字が複数種類ある場合(正規表現)
Sub SplitByRegex()
Dim re As Object: Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[,;|]" 'カンマ・セミコロン・縦棒を区切りとする
re.Global = True
Dim s As String: s = "A,B;C|D"
Dim arr() As String: arr = Split(re.Replace(s, ","), ",") '一旦カンマに統一してSplit
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
VB- ポイント
- 正規表現で複数区切り文字を一括置換→Splitで処理。
- 区切りが混在するログやCSVに便利。
応用5:分割後にTrimして前後の空白を除去
Sub SplitTrimmed()
Dim s As String: s = " A , B , C "
Dim arr() As String: arr = Split(s, ",")
Dim i As Long
For i = LBound(arr) To UBound(arr)
arr(i) = Trim(arr(i)) '前後の空白を削除
Debug.Print arr(i)
Next
End Sub
VB- ポイント
- 区切り後に余計なスペースが残る場合は
Trimで整形。
- 区切り後に余計なスペースが残る場合は
例題で練習
例題1:A列に「名前,年齢,住所」が入っている → B~D列へ展開
Sub Example_NameAgeAddress()
Dim last As Long: last = Cells(Rows.Count, "A").End(xlUp).Row
Dim r As Long, arr() As String
For r = 2 To last
arr = Split(Cells(r, "A").Value, ",")
If UBound(arr) >= 2 Then
Cells(r, "B").Value = Trim(arr(0))
Cells(r, "C").Value = Trim(arr(1))
Cells(r, "D").Value = Trim(arr(2))
End If
Next
End Sub
VB例題2:ログ列「ERROR|WARN|INFO」を分割して縦に抽出シートへ
Sub Example_LogSplit()
Dim last As Long: last = Cells(Rows.Count, "A").End(xlUp).Row
Dim r As Long, arr() As String, i As Long, outRow As Long: outRow = 2
For r = 2 To last
arr = Split(Cells(r, "A").Value, "|")
For i = LBound(arr) To UBound(arr)
Worksheets("抽出").Cells(outRow, 1).Value = arr(i)
Worksheets("抽出").Cells(outRow, 2).Value = r '元行番号
outRow = outRow + 1
Next
Next
End Sub
VBよくある落とし穴と対策
- 区切り文字が存在しないセル → Splitは配列1要素になる。必須要素数をチェックしてから展開。
- 空白や改行が混じる → TrimやReplaceで正規化してからSplit。
- 可変長のデータ → UBoundで配列長を確認し、存在する要素だけ展開。
- 複数区切り文字 → 正規表現やReplaceで統一してからSplit。
