Excel VBA 逆引き集 | 区切り文字で分割

Excel VBA
スポンサーリンク

区切り文字で分割

「セルの中に 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から始まるので LBoundUBound で範囲を取る。
    • 区切り文字は " "(スペース)、";"(セミコロン)など自由。

応用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。
タイトルとURLをコピーしました