【VBA】文字列を区切り文字で分割して取り出す方法(コピペOK)

VBA
スポンサーリンク

記事ID: 064
タイトル: 【VBA】文字列を区切り文字で分割して取り出す方法(コピペOK)
カテゴリ: 文字列操作
一次キーワード: VBA Split 文字列 分割
想定読者: CSVデータや区切り文字付きデータを分割して扱いたい初心者〜初級者
検索意図: VBAのSplit関数で文字列を分割し、必要な部分を取り出す方法を知りたい
読者の悩み(1文): 区切り文字で連結されたデータを分割するコードが複雑すぎて挫折した
読了後にできること(1文): Split関数で文字列を分割し、必要な要素を取り出してセルに展開できる
前提条件:
  - Excel版: Excel 2016以降 / Microsoft 365
  - OS: Windows 10/11
  - 保存形式: .xlsm(マクロ有効ブック)
  - 貼り付け場所: 標準モジュール
  - 実行方法: マクロ実行(F5)またはボタン割り当て
更新日: 2026-03-11
スポンサーリンク

この記事でわかること

VBAのSplit関数で文字列を区切り文字で分割する方法を、コピペで動くコード付きで解説します。

  • 対象:カンマ区切りやスペース区切りのデータを分割したい人
  • 所要時間:コピペ → 実行まで3分

どんな場面で使う?

Split関数は、実務で「まとまったデータをバラバラにしたい」場面で非常によく使います。具体的には以下のようなケースです。

  • CSVデータの前処理 — CSVファイルをテキストとして読み込み、各行をカンマで分割してセルに展開する。手動でのコピペ作業がゼロになる
  • メールアドレスからドメインを抽出 — 顧客リストのメールアドレスを「@」で分割し、会社ドメインごとの件数を集計する。営業リストの整理で頻出するパターン
  • ファイルパスからファイル名だけを取り出すC:\Users\Documents\報告書.xlsx のようなフルパスを「\」で分割し、最後の要素(ファイル名)だけ取得する
  • 氏名の姓と名を分ける — スペース区切りで入力された「田中 太郎」を分割して、姓と名を別々のセルに格納する。年賀状や宛名印刷の準備で使える
  • セル内改行で入力された複数データの展開 — Alt+Enterで改行された住所やメモを1行ずつ分割して、別々の行やセルに書き出す

これらの作業を手作業でやると、InStr関数とMid関数を組み合わせた複雑なコードが必要になります。Split関数を使えば、たった1行で分割が完了します。

完成イメージ

A1〜A3セルにカンマ区切りのデータを入力しておきます。

実行前

A列(カンマ区切りデータ)
東京,大阪,名古屋
札幌,仙台
福岡,広島,神戸,京都

実行後(A列のデータをB列以降に展開):

A列 B列 C列 D列 E列
東京,大阪,名古屋 東京 大阪 名古屋
札幌,仙台 札幌 仙台
福岡,広島,神戸,京都 福岡 広島 神戸 京都

自分もCSVデータや住所データを「都道府県」「市区町村」に分けたいときに、Mid関数やInStr関数を組み合わせて複雑なコードを書いていました。正直めんどくさかったし、区切り位置の計算を間違えてバグを出すこともしょっちゅうでした。

Split関数を知ってからは、カンマ区切りやスペース区切りの分割が1行で書けるようになりました。CSVの処理が劇的にラクになって、「なんで最初からこれを使わなかったんだろう」と思いました。

同じように文字列の分割で苦労している人が、この記事でSplit関数を使いこなせるようになればうれしいです。

基本:Split関数の使い方

Split関数は、文字列を指定した区切り文字で分割して配列として返します。


Sub Split基本()
    Dim arr As Variant

    ' カンマで分割
    arr = Split("東京,大阪,名古屋", ",")

    ' 結果を確認
    MsgBox arr(0) & vbCrLf & arr(1) & vbCrLf & arr(2)
    ' → 東京
    '   大阪
    '   名古屋
End Sub

構文


Split(文字列, 区切り文字)
  • 文字列: 分割したい文字列
  • 区切り文字: どの文字で区切るか(カンマ、スペースなど)
  • 戻り値: 0始まりのVariant型配列

Split関数は内部的に区切り文字の位置を順番に探し、見つかった位置で文字列を切り分けて配列に格納しています。自分でInStr関数を使ってループを回すのと同じ処理を、VBAが裏側で全部やってくれるイメージです。だから1行で済む。

受け取る変数は必ず Dim arr As Variant と宣言します。Dim arr() As String と書くと「型の不一致」エラーになるので注意してください。Split関数の戻り値がVariant型の配列として返されるためです。

重要: 戻り値は0始まりの配列です。最初の要素は arr(0)、2番目は arr(1) です。VBAの多くの機能が1始まりなので、ここを間違えやすいです。

カンマ区切り・スペース区切り・改行区切りで分割する

カンマ区切り

CSVデータやセル内のカンマ区切りデータの分割に使います。


Sub カンマ区切りで分割()
    Dim arr As Variant

    arr = Split("田中,鈴木,佐藤", ",")

    Dim i As Long
    For i = 0 To UBound(arr)
        Debug.Print i & "番目: " & arr(i)
    Next i
    ' → 0番目: 田中
    '   1番目: 鈴木
    '   2番目: 佐藤
End Sub

スペース区切り

氏名の姓と名を分けたり、スペースで区切られたデータの分割に使います。


Sub スペース区切りで分割()
    Dim arr As Variant

    arr = Split("田中 太郎", " ")

    Debug.Print "姓: " & arr(0)  ' → 姓: 田中
    Debug.Print "名: " & arr(1)  ' → 名: 太郎
End Sub

注意: 全角スペースと半角スペースは別の文字です。全角スペースで分割するなら Split(str, " ") と明示的に指定してください。データに全角・半角スペースが混在している場合は、全角半角変換で事前に統一するのがおすすめです。

改行区切り

セル内改行やテキストデータの改行で分割するパターンです。


Sub 改行区切りで分割()
    Dim arr As Variant
    Dim cellValue As String

    ' セル内改行(Alt+Enter)で入力されたデータを想定
    cellValue = Range("A1").Value

    ' セル内改行はvbLf(Chr(10))で分割
    arr = Split(cellValue, vbLf)

    Dim i As Long
    For i = 0 To UBound(arr)
        Debug.Print i & "行目: " & arr(i)
    Next i
End Sub

ポイント: セル内改行(Alt+Enterで入力した改行)は vbLf(Chr(10))です。テキストファイルの改行はWindowsでは vbCrLf(Chr(13)+Chr(10))が一般的です。分割対象に応じて使い分けてください。テキストファイルの読み込みはテキストファイルを読み込む方法で詳しく解説しています。

分割結果から特定の要素を取り出す

最初の要素・最後の要素


Sub 特定の要素を取り出す()
    Dim arr As Variant
    arr = Split("東京,大阪,名古屋,福岡", ",")

    ' 最初の要素(0始まり)
    Debug.Print "最初: " & arr(0)           ' → 東京

    ' 最後の要素
    Debug.Print "最後: " & arr(UBound(arr)) ' → 福岡

    ' 要素数
    Debug.Print "要素数: " & UBound(arr) + 1 ' → 4
End Sub

メールアドレスからドメインを取り出す

自分はこのパターンを毎日使っています。顧客リストのメールアドレスからドメインだけ抽出して、会社ごとの集計に使うことが多いです。「@」で分割すれば、ユーザー名とドメインが一発で取れます。


Sub メールアドレスからドメイン取得()
    Dim arr As Variant
    Dim email As String

    email = "tanaka@example.com"
    arr = Split(email, "@")

    Debug.Print "ユーザー名: " & arr(0)  ' → tanaka
    Debug.Print "ドメイン: " & arr(1)    ' → example.com
End Sub

ファイルパスからファイル名を取り出す


Sub ファイルパスからファイル名取得()
    Dim arr As Variant
    Dim filePath As String

    filePath = "C:\Users\Documents\報告書.xlsx"
    arr = Split(filePath, "\")

    ' 最後の要素がファイル名
    Debug.Print "ファイル名: " & arr(UBound(arr))  ' → 報告書.xlsx
End Sub

Join関数で配列を文字列に戻す

分割した配列を別の区切り文字で結合し直すこともできます。


Sub Join関数で結合()
    Dim arr As Variant
    arr = Split("東京,大阪,名古屋", ",")

    ' カンマ区切り → タブ区切りに変換
    Dim result As String
    result = Join(arr, vbTab)
    Debug.Print result  ' → 東京	大阪	名古屋

    ' カンマ区切り → 改行区切りに変換
    result = Join(arr, vbCrLf)
    Debug.Print result
    ' → 東京
    '   大阪
    '   名古屋
End Sub

分割した結果をセルに書き出す

最小版のコードです。A1セルの値をカンマで分割してMsgBoxで表示します。


Sub セルの値を分割してMsgBox()
    Dim arr As Variant
    Dim cellValue As String

    cellValue = Range("A1").Value

    If Len(cellValue) = 0 Then
        MsgBox "A1セルが空です。", vbExclamation
        Exit Sub
    End If

    arr = Split(cellValue, ",")

    Dim msg As String
    Dim i As Long
    For i = 0 To UBound(arr)
        msg = msg & "(" & i & ") " & Trim(arr(i)) & vbCrLf
    Next i

    MsgBox "分割結果(" & UBound(arr) + 1 & "個):" & vbCrLf & vbCrLf & msg
End Sub

A1セルに「東京,大阪,名古屋」と入力してから実行してください。

実務版:セル内のデータを分割して複数列に展開する

※ B列以降に既存データがある場合は上書きされます。実行前にブックを保存しておくと安心です。

自分はこのマクロをCSVデータの前処理や、カンマ区切りで入力されたデータの整理に使っています。A列のデータを一括でB列以降に展開できるので、手作業でのコピペが不要になりました。


Sub カンマ区切りデータを複数列に展開()
    Dim ws As Worksheet
    Dim arr As Variant
    Dim lastRow As Long
    Dim i As Long
    Dim j As Long
    Dim maxCol As Long

    Set ws = ActiveSheet

    ' --- A列の最終行を取得 ---
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    If lastRow < 1 Then
        MsgBox "A列にデータがありません。", vbExclamation
        Exit Sub
    End If

    ' --- B列以降に展開 ---
    maxCol = 0

    For i = 1 To lastRow
        If Len(ws.Cells(i, 1).Value) > 0 Then
            arr = Split(ws.Cells(i, 1).Value, ",")

            For j = 0 To UBound(arr)
                ws.Cells(i, 2 + j).Value = Trim(arr(j))
            Next j

            ' 最大列数を記録
            If UBound(arr) + 1 > maxCol Then
                maxCol = UBound(arr) + 1
            End If
        End If
    Next i

    ' --- 列幅を自動調整 ---
    If maxCol > 0 Then
        ws.Columns(2).Resize(, maxCol).AutoFit
    End If

    MsgBox lastRow & "行のデータをB列以降に展開しました。", vbInformation
End Sub

このコードのポイント:

  • A列の各セルをカンマで分割し、B列以降に1要素ずつ書き出す
  • Trim(arr(j)) で各要素の前後のスペースを自動除去
  • 空セルはスキップするのでエラーにならない
  • 展開後に列幅を自動調整
  • 最終行を正確に取得する方法で解説しているEnd(xlUp)を使用

コードの流れを詳しく解説:

まず ws.Cells(ws.Rows.Count, 1).End(xlUp).Row でA列のデータが入っている最終行を取得しています。これはシートの一番下から上に向かって最初にデータがあるセルを探す定番の方法です。

次に For i = 1 To lastRow のループで各行を処理します。Len(ws.Cells(i, 1).Value) > 0 のチェックを入れることで、空セルをスキップしています。空文字列をSplitしてもエラーにはなりませんが、意味のない空要素がB列に書き出されてしまうため、この判定は重要です。

ws.Cells(i, 2 + j).Value = Trim(arr(j)) の部分で、分割した各要素をB列(2列目)から順に書き出しています。2 + j なので、j=0ならB列、j=1ならC列という具合にずれていきます。Trim関数をかけているのは、「東京, 大阪, 名古屋」のようにカンマの後にスペースが入っているデータに対応するためです。

最後に maxCol で最大の列数を記録し、展開した列の幅を自動調整しています。データ行ごとに分割数が異なる場合でも、一番多い列数に合わせてAutoFitが効くようになっています。

不要な文字がデータに含まれている場合は、文字列を一括置換する方法でReplace関数を使って事前にクリーニングすると確実です。CSVファイルの読み込み処理と組み合わせる場合は、CSVファイルを読み込む方法も参考にしてください。

落とし穴

自分もSplitを使い始めたころ、戻り値が0始まりの配列だと知らず、Split(str, ",")(1) で最初の要素を取ろうとしたら2番目の要素が返ってきました。VBAはセル番地が1始まり(A1, B2…)なので、「配列も1始まりだろう」と思い込んでいたのが原因です。10分くらい「なんで違う値が出るんだ?」と悩みました。

# 症状 原因 対策
1 Split(str, “,”)(1)で最初の要素を取ろうとしたら2番目が返った Splitの戻り値は0始まりの配列。(1)は2番目の要素 最初の要素は arr(0) で取得する。UBound(arr)が最後のインデックス
2 スペース区切りで分割したのに分割されない 全角スペースと半角スペースは別の文字。半角で分割しているのにデータは全角スペース Replace(str, " ", " ") で全角を半角に統一してからSplitする
3 セル内改行で分割したのに分割されない セル内改行はvbLf(Chr(10))だが、vbCrLfで分割しようとしている セル内改行は Split(str, vbLf) を使う。テキストファイルなら vbCrLf
4 分割結果に余計なスペースが含まれる 「東京, 大阪, 名古屋」のようにカンマ+スペースのデータをカンマだけで分割した 各要素に Trim() を適用する。またはReplace関数で事前にスペースを除去
5 空文字列をSplitしたら想定外の結果になった 空文字列をSplitするとエラーにはならないが、要素数1の配列(arr(0)=””)が返る。UBound(arr)は0になるので、要素数の判定を間違えやすい Splitの前に If Len(str) = 0 Then で空文字チェックする
6 区切り文字が連続していると空要素が生まれる 「東京,,名古屋」をカンマで分割すると、arr(1)が空文字になる 分割後にループで空要素を除外する処理を入れるか、Replace関数で連続カンマを1つに置換してからSplitする
7 分割数が多すぎてシートの列数を超えた 1つのセルに大量のカンマ区切りデータがあり、展開先がExcelの列数上限(16,384列)を超えた 分割前にUBound(arr)で要素数を確認し、上限を超える場合は行方向に展開するなどの対策を入れる

FAQ

Q1. Split関数の戻り値の型は何ですか?

Variant型の配列です。受け取る変数は Dim arr As Variant と宣言してください。


' OK
Dim arr As Variant
arr = Split("A,B,C", ",")

' NG(型の不一致エラー)
Dim arr() As String
arr = Split("A,B,C", ",")

Q2. 分割した配列の要素数を取得するには?

UBound(arr) + 1 で取得できます。


Dim arr As Variant
arr = Split("東京,大阪,名古屋", ",")

Debug.Print "要素数: " & UBound(arr) + 1  ' → 3
Debug.Print "最大インデックス: " & UBound(arr)  ' → 2

UBoundは配列の最大インデックスを返します。0始まりなので、要素数は UBound + 1 です。

Q3. 分割した配列を元の文字列に戻すには?

Join(配列, 区切り文字) を使います。区切り文字を変えれば、区切り文字の変換もできます。


Dim arr As Variant
arr = Split("東京,大阪,名古屋", ",")

' カンマ区切り → スラッシュ区切りに変換
Debug.Print Join(arr, "/")  ' → 東京/大阪/名古屋

Q4. Split関数で分割数を制限するには?

第3引数(limit)を指定します。Split(str, ",", 2) なら最初のカンマだけで分割し、残りはそのまま返ります。


Dim arr As Variant
arr = Split("A,B,C,D", ",", 2)

Debug.Print arr(0)  ' → A
Debug.Print arr(1)  ' → B,C,D (残りはそのまま)

メールアドレスを「@」で分割するときなど、最初の区切りだけで分けたい場合に便利です。

Q5. セル内改行とテキストファイルの改行の区切り文字は?

改行の種類 定数 用途
セル内改行 vbLf Chr(10) Excelセル内のAlt+Enter改行
Windows改行 vbCrLf Chr(13)+Chr(10) テキストファイル(Windows)
Mac改行 vbCr Chr(13) テキストファイル(古いMac)

' セル内改行で分割
arr = Split(Range("A1").Value, vbLf)

' テキストファイルの内容を改行で分割
arr = Split(textContent, vbCrLf)

まとめ

この記事では、VBAのSplit関数で文字列を区切り文字で分割する方法を解説しました。Split関数は覚えてしまえばシンプルだけど、知らないと「InStrで位置を探してMidで切り出して……」という面倒なコードを書くことになる。自分は最初そのやり方でやっていて、バグを何度も出した。Split関数を覚えてからは、文字列の分割処理が圧倒的にラクになった。

特に実務では、CSVの前処理やメールアドレスの分析など、区切り文字で分割する場面は想像以上に多い。Split + Joinの組み合わせを覚えておけば、区切り文字の変換(カンマ→タブなど)も1行で書ける。配列操作に慣れていない人でも、この記事のパターンをそのまま使えば問題なく動く。

  • 基本: Split(文字列, 区切り文字) で1行で分割できる
  • 戻り値: 0始まりのVariant型配列。arr(0) が最初の要素
  • 要素数: UBound(arr) + 1 で取得
  • 改行分割: セル内改行は vbLf、テキストファイルは vbCrLf
  • 結合: Join(配列, 区切り文字) で配列を文字列に戻せる
  • 実務版: A列のカンマ区切りデータをB列以降に一括展開

Split関数を覚えると、InStr + Mid関数で1文字ずつ区切り位置を探していた頃がウソみたいにコードがシンプルになります。CSVデータの前処理、住所の分割、メールアドレスの加工など、文字列を「バラして」「組み立て直す」作業は実務で頻繁に発生するので、Split + Joinのペアは早めに手に馴染ませておくのがおすすめです。

関連記事:

次にやりたくなること

コメント

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