【2026年7月最新】VBA Split関数で文字列を分割する完全ガイド|複数区切り・配列操作・Claude Code活用
この記事の内容
ExcelのVBAを使っていると、「カンマ区切りの文字列をセルに分けたい」「スラッシュで区切られた日付を年・月・日に分解したい」という場面が頻繁に出てきます。そのために使うのがSplit関数です。
Split関数は1行で文字列を分割して配列に格納できるため、VBAのデータ処理で欠かせない基礎関数の一つです。この記事では、Split関数の基本から、複数区切り文字への対応・CSVデータの解析・よくあるエラーの対策・Claude Codeでの自動コード生成まで、実用コードを交えて解説します。
01 BASIC SYNTAX Split関数の基本構文と引数の意味 Expression・Delimiter・Limit・Compareの4引数を押さえる
Split関数の基本構文は以下の通りです。返り値は文字列型の1次元配列(String())です。
' Split関数の基本構文
Dim result() As String
result = Split(Expression, [Delimiter], [Limit], [Compare])
' 引数の説明
' Expression : 分割する元の文字列(必須)
' Delimiter : 区切り文字(省略時はスペース " ")
' Limit : 最大分割数(省略時は -1 = 無制限)
' Compare : 大文字小文字の区別(省略時は vbBinaryCompare)
' 最もシンプルな使い方(カンマ区切り)
Dim items() As String
items = Split("りんご,みかん,ぶどう", ",")
' items(0) = "りんご"
' items(1) = "みかん"
' items(2) = "ぶどう"
' 区切り文字を省略するとスペースで分割
Dim words() As String
words = Split("Hello World VBA")
' words(0) = "Hello"
' words(1) = "World"
' words(2) = "VBA"
📚 用語解説
Split関数の返り値(1次元配列):Split関数はString型の1次元配列を返す。配列のインデックスは0始まり(0 to n-1)。要素数はUBound(result)+1で取得できる。区切り文字が見つからない場合は元の文字列全体がresult(0)に入り、要素が1つだけの配列になる。Nullを渡すとエラーになる。
| 引数 | 型 | デフォルト | 説明 |
|---|---|---|---|
| Expression | String | なし(必須) | 分割する元の文字列 |
| Delimiter | String | " "(スペース) | 区切り文字(""を指定すると1文字ずつ分割) |
| Limit | Long | -1(無制限) | 最大何個に分割するか。-1=すべて分割 |
| Compare | vbCompareMethod | vbBinaryCompare | vbTextCompare=大文字小文字無視、vbBinaryCompare=区別 |
02 UBOUND 分割した文字列の取り出し方とUBoundの使い方 要素インデックスでのアクセスとForループでの全要素処理
Split関数が返す配列の要素には、変数名(インデックス)でアクセスします。インデックスは0から始まることに注意してください。配列の要素数はUBound(配列名) + 1で取得できます。
📚 用語解説
UBound関数:UBound(arrayname, [dimension]):配列の最大インデックス(上限)を返す関数。1次元配列の場合、UBound(arr)は最後の要素のインデックスを返す。要素数はUBound(arr)+1。LBound関数は最小インデックス(通常0)を返す。Split関数の結果はLBound=0のため、通常はUBoundのみ使えば十分。
' UBoundを使って全要素をループ処理する
Sub SplitLoopExample()
Dim csv As String
Dim items() As String
Dim i As Long
csv = "東京,大阪,名古屋,福岡,札幌"
items = Split(csv, ",")
' 要素数を確認
Debug.Print "要素数: " & UBound(items) + 1 ' → 5
' For Eachでループ(全要素を順に処理)
Dim item As Variant
For Each item In items
Debug.Print item
Next item
' → 東京 / 大阪 / 名古屋 / 福岡 / 札幌
' インデックス指定ループ(インデックスも使いたい場合)
For i = 0 To UBound(items)
Cells(i + 1, 1).Value = items(i) ' A1:A5に書き込む
Next i
End Sub
' 特定の要素だけ取り出す
Sub GetSpecificElement()
Dim path As String
Dim parts() As String
path = "C:\Users\kohei\Documents\report.xlsx"
parts = Split(path, "\")
' ファイル名だけ取得(最後の要素)
Dim filename As String
filename = parts(UBound(parts)) ' → "report.xlsx"
Debug.Print "ファイル名: " & filename
End Sub
items = Split(str, ",")
n = UBound(items)+1
全要素をループ処理
セルへの書込み等
03 LIMIT ARG 区切り回数の制限(Limit引数) 最初のN個だけ分割する活用パターン
Limit引数を指定すると、最大何個に分割するかを制限できます。Limit=2にすると「最初の区切り文字で1回だけ分割して2要素の配列」になります。残りの文字列は最後の要素にそのまま格納されます。
' Limit引数で分割数を制限する
Sub LimitExample()
Dim str As String
Dim parts() As String
str = "2026/07/19"
' Limit=-1(デフォルト): すべて分割
parts = Split(str, "/", -1)
Debug.Print UBound(parts) + 1 ' → 3
' parts(0)="2026" / parts(1)="07" / parts(2)="19"
' Limit=2: 最初の1か所だけ分割(2要素)
parts = Split(str, "/", 2)
Debug.Print UBound(parts) + 1 ' → 2
' parts(0)="2026" / parts(1)="07/19"(残りはそのまま)
' Limit=1: 分割なし(元の文字列が0番目に入る)
parts = Split(str, "/", 1)
Debug.Print UBound(parts) + 1 ' → 1
' parts(0)="2026/07/19"(分割されない)
End Sub
' 活用例: メールアドレスからドメインだけ取得
Sub GetDomain()
Dim email As String
Dim parts() As String
email = "sugasawa.kohei@genai-ai.co.jp"
' "@"で2つに分割してドメイン部分を取得
parts = Split(email, "@", 2)
' parts(0) = "sugasawa.kohei"
' parts(1) = "genai-ai.co.jp"
Debug.Print "ドメイン: " & parts(1) ' → genai-ai.co.jp
End Sub
「最初の区切り文字まで」と「それ以降の残り」に2分割したい場合はLimit=2が便利です。例えばメールアドレスを「@」で分割してユーザー名とドメインに分ける、URLを「://」で分割してスキームとパス部分に分けるなど、「最初の区切りだけ見たい」ケースで活用できます。
04 COMPARE 大文字小文字の区別(Compare引数) vbTextCompare vs vbBinaryCompare の使い分け
📚 用語解説
vbBinaryCompare と vbTextCompare:vbBinaryCompare(=0)はバイナリ比較。「A」と「a」を別の文字として区別する(デフォルト)。vbTextCompare(=1)はテキスト比較。大文字小文字を無視して一致する。例えばSplit("AaA", "a", -1, vbTextCompare)は"A"も区切り文字として扱い3要素に分割されるが、vbBinaryCompareでは"A"は区切りにならない。日本語のひらがな/カタカナの区別はこの引数では制御できない。
' Compare引数で大文字小文字の区別を制御する
Sub CompareExample()
Dim str As String
Dim partsB() As String, partsT() As String
str = "HelloAworldAtest" ' "A"が区切り文字
' vbBinaryCompare(デフォルト): 大文字のAのみが区切り
partsB = Split(str, "a", -1, vbBinaryCompare)
Debug.Print UBound(partsB) + 1 ' → 1(小文字aしかないので分割されない)
' partsB(0) = "HelloAworldAtest"(Aは区切りにならない)
' vbTextCompare: 大文字小文字を無視、A/aどちらも区切り
partsT = Split(str, "a", -1, vbTextCompare)
Debug.Print UBound(partsT) + 1 ' → 3
' partsT(0)="Hello" / partsT(1)="world" / partsT(2)="test"
End Sub
' 実用例: CSVの列名(英語ヘッダー)を大文字小文字無視で処理
Sub ParseHeaderIgnoreCase()
Dim header As String
Dim cols() As String
header = "Name,EMAIL,Phone,Address"
cols = Split(header, ",")
Dim i As Long
For i = 0 To UBound(cols)
cols(i) = LCase(cols(i)) ' 全部小文字に統一してから処理
Next i
' cols(0)="name" / cols(1)="email" / cols(2)="phone" / cols(3)="address"
End Sub
05 MULTI DELIMITERS 複数区切り文字への対応(Replace関数と組み合わせ) カンマ・スペース・タブなど複数の区切りに対応する実用テクニック
Split関数は区切り文字を1つしか指定できません。「カンマでもスペースでも分割したい」という場合は、Replace関数で一方の区切り文字をもう一方に統一してからSplitするのが基本パターンです。
Split(str, ",|; ")のようにパイプで複数指定しても動作しません(","と"; "の固定文字列として扱われます)。正規表現のような複数区切り指定はVBA標準のSplitには存在しません。VBScriptのRegExpオブジェクトを使う方法もありますが、Replaceで統一するほうが高速でシンプルです。
' 複数区切り文字に対応する方法
' 方法1: Replaceで区切り文字を1種類に統一してからSplit
Sub MultiDelimiterExample()
Dim str As String
Dim parts() As String
' カンマとセミコロンの混在データ
str = "東京,大阪;名古屋,福岡;札幌"
' セミコロンをカンマに置換してからSplit
str = Replace(str, ";", ",")
parts = Split(str, ",")
' parts: 東京/大阪/名古屋/福岡/札幌
Debug.Print UBound(parts) + 1 ' → 5
End Sub
' 方法2: 複数区切りを段階的にReplaceで統一
Sub NormalizeDelimiters()
Dim str As String
Dim parts() As String
' タブ・スペース・カンマが混在したCSV的なデータ
str = "Apple" & vbTab & "Banana, Cherry " & Chr(9) & "Date"
' 全ての区切り文字を"|"に統一
str = Replace(str, vbTab, "|") ' タブ→|
str = Replace(str, " ", "|") ' スペース→|
str = Replace(str, ",", "|") ' カンマ→|
' 連続した"|"がある場合は1つに(複数スペース対策)
Do While InStr(str, "||") > 0
str = Replace(str, "||", "|")
Loop
parts = Split(str, "|")
' 結果: Apple / Banana / Cherry / Date
Dim i As Long
For i = 0 To UBound(parts)
If Trim(parts(i)) <> "" Then ' 空要素をスキップ
Debug.Print Trim(parts(i))
End If
Next i
End Sub
' 方法3: RegExpで複数区切りに対応(上級者向け)
Sub SplitWithRegEx()
Dim re As Object
Dim matches As Object
Dim result() As String
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[,;| ]+" ' カンマ・セミコロン・パイプ・空白(1文字以上)
re.Global = True
Dim str As String
str = "Apple,Banana;Cherry Date"
' Replaceで一括統一してSplit
Dim normalized As String
normalized = re.Replace(str, "|")
result = Split(normalized, "|")
' result: Apple / Banana / Cherry / Date
Dim i As Long
For i = 0 To UBound(result)
Debug.Print result(i)
Next i
End Sub
📚 用語解説
Chr(9)とvbTab:vbTabはタブ文字の定数(Chr(9)と同値)。ExcelのセルをコピーしてVBAの文字列として取得するとセル間の区切りがタブ文字(vbTab)になることが多い。Replace(str, vbTab, ",")でCSV形式に変換してからSplitするパターンが実務でよく出る。同様にvbCrLf(改行+CR)、vbLf(改行のみ)もReplaceで処理してから行ごとにSplitするのが基本。
06 CSV PARSE CSVデータの解析・セルへの分散配置 行・列2重Splitで2次元データを処理する実務パターン
Splitの最も実践的な使い方の一つがCSVデータの解析です。まず改行で行に分割し、各行をカンマで列に分割するという「2重Split」のパターンが基本になります。
' CSVデータをセルに展開する
Sub ParseCSVToSheet()
Dim csvText As String
Dim lines() As String
Dim cols() As String
Dim i As Long, j As Long
' CSV文字列(実際はファイルから読み込む)
csvText = "名前,年齢,部署" & vbCrLf & _
"菅澤孝平,24,営業" & vbCrLf & _
"山崎太郎,32,開発" & vbCrLf & _
"田中花子,28,総務"
' Step1: 改行コードで行に分割
lines = Split(csvText, vbCrLf)
' Step2: 各行をカンマで列に分割してセルに書き込む
For i = 0 To UBound(lines)
If lines(i) <> "" Then ' 空行をスキップ
cols = Split(lines(i), ",")
For j = 0 To UBound(cols)
Cells(i + 1, j + 1).Value = cols(j)
Next j
End If
Next i
Debug.Print "完了: " & (UBound(lines) + 1) & "行を展開"
End Sub
' テキストファイルからCSVを読み込んで展開する
Sub ReadCSVFile()
Dim fileNo As Integer
Dim filePath As String
Dim allText As String
Dim lines() As String
Dim cols() As String
Dim i As Long, j As Long
filePath = "C:\Users\kohei\Documents\data.csv"
fileNo = FreeFile
Open filePath For Input As #fileNo
allText = Input(LOF(fileNo), fileNo) ' ファイル全体を読み込み
Close #fileNo
' 改行コードを統一(\r\nと\nの混在を防ぐ)
allText = Replace(allText, vbCr, "") ' \rを除去
lines = Split(allText, vbLf) ' \nで行分割
Sheets("Sheet1").Cells.Clear ' シートをクリア
For i = 0 To UBound(lines)
If Trim(lines(i)) <> "" Then
cols = Split(lines(i), ",")
For j = 0 To UBound(cols)
' クォートを除去してセルに書き込む
Cells(i + 1, j + 1).Value = Replace(cols(j), Chr(34), "")
Next j
End If
Next i
MsgBox UBound(lines) & "行のCSVデータを読み込みました。"
End Sub
Open/Input/Close
Split(text, vbCrLf)
Split(line, ",")
Cells(i, j).Value
07 ERROR HANDLING Split関数の落とし穴とエラー対策 空文字列・Null・インデックス超過の3大エラーを防ぐ
①Null値を渡すとエラー(「型が一致しません」)。IsNull()でガードする。②空文字列("")を渡すと分割されず1要素になる。UBound=0になるので要注意。③配列のインデックスを超えてアクセスするとエラー(「インデックスが有効範囲にありません」)。UBoundで上限を確認してからアクセスする。
' エラー対策パターン集
' 1. Null値チェック
Sub SafeSplitWithNull()
Dim cellValue As Variant
Dim parts() As String
cellValue = Cells(1, 1).Value ' セルがNullの可能性
' IsNullチェックを先に行う
If IsNull(cellValue) Or cellValue = "" Then
Debug.Print "空またはNull: スキップ"
Exit Sub
End If
parts = Split(CStr(cellValue), ",")
Debug.Print "分割結果: " & UBound(parts) + 1 & "要素"
End Sub
' 2. 空文字列の処理(区切り文字が見つからない場合)
Sub HandleEmptyResult()
Dim str As String
Dim parts() As String
str = "区切り文字なしのテキスト"
parts = Split(str, ",") ' カンマがないので分割されない
' 要素数を確認
If UBound(parts) = 0 Then
Debug.Print "区切り文字が見つからなかった: " & parts(0)
Else
Debug.Print "分割数: " & UBound(parts) + 1
End If
End Sub
' 3. インデックス超過を防ぐ安全なアクセス
Sub SafeIndexAccess()
Dim str As String
Dim parts() As String
str = "項目1,項目2" ' 2要素
parts = Split(str, ",")
' UBoundを確認してからアクセス
Dim targetIndex As Long
targetIndex = 3 ' 存在しないインデックス
If targetIndex <= UBound(parts) Then
Debug.Print parts(targetIndex)
Else
Debug.Print "インデックス " & targetIndex & " は存在しない(最大 " & UBound(parts) & ")"
End If
End Sub
' 4. 空の配列要素をフィルタリングする
Sub FilterEmptyElements()
Dim str As String
Dim parts() As String
Dim cleaned As New Collection
str = "A,,B,,,C," ' 空要素あり
parts = Split(str, ",")
Dim i As Long
For i = 0 To UBound(parts)
If Trim(parts(i)) <> "" Then
cleaned.Add Trim(parts(i))
End If
Next i
Debug.Print "有効要素数: " & cleaned.Count ' → 3 (A, B, C)
End Sub
📚 用語解説
IsNull関数とIsEmpty関数の違い:IsNull(value)はVariant型の変数がNullかどうかを判定する。セルの値がNullの場合はIsNullでTrueになる。IsEmpty(value)はVariant型が未初期化かどうかを判定する。セルが空の場合はIsEmptyでTrueになることが多い。空文字列("")との違いに注意: ""はIsNullもIsEmptyもFalseを返す。Split関数に渡す前は IsNull(v) Or IsEmpty(v) Or v = "" の3条件でガードするのが安全。
08 AI ASSIST Claude CodeでVBA Split処理を自動生成する 処理の仕様を伝えるだけでSplit+ループコードが即生成される
Claude Codeを使えば、「どんなデータを」「何で分割して」「どう処理するか」を日本語で説明するだけで、Split関数を含むVBAコードが即座に生成されます。エラー対策コードやUBoundによる安全なループも自動で入ります。
| ユースケース | Claude Codeへの指示例 |
|---|---|
| CSVをシートに展開 | 「A列にCSV文字列があります。カンマで分割して1行ずつB列からI列に展開するVBAマクロを作って。空行はスキップ。」 |
| 複数区切り対応 | 「カンマまたはセミコロンで区切られた文字列を分割してコレクションに格納するVBAコードを書いて。空要素は除外。」 |
| ファイル名の抽出 | 「Windowsのフルパス文字列から\で分割してファイル名だけ取得するVBA関数を書いて。バックスラッシュに注意。」 |
| メールアドレス処理 | 「セル範囲のメールアドレスから@でSplitしてドメイン部分だけ隣の列に書き出すマクロを作って。Null/空セルはスキップ。」 |
' Claude Codeが生成するコード例のパターン
' (指示: 「A列のカンマ区切り文字列をB列以降に展開するマクロ」)
Sub SplitColumnA()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cellVal As String
Dim parts() As String
Dim j As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
' Null・空チェック
If Not IsNull(ws.Cells(i, 1).Value) And ws.Cells(i, 1).Value <> "" Then
cellVal = CStr(ws.Cells(i, 1).Value)
parts = Split(cellVal, ",")
For j = 0 To UBound(parts)
ws.Cells(i, j + 2).Value = Trim(parts(j)) ' B列から書き込み
Next j
End If
Next i
MsgBox lastRow & "行の処理が完了しました。"
End Sub
入力形式・区切り文字を確認
入力/出力/スキップ条件
を日本語で伝える
Alt+F11でVBE起動
モジュールに貼り付け
F5またはマクロ一覧から実行
09 CONCLUSION まとめ:VBA Split関数の重要ポイント 基本から実務パターンまでの確認チェックリスト
VBAのデータ処理をAIで効率化したい方へ
Split関数を使ったCSV解析や文字列処理をはじめ、VBAの繰り返し作業はClaude Codeとの組み合わせで大幅に効率化できます。
AI鬼管理では、ExcelVBA・業務自動化のAI活用設計・実装支援を行っています。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAのSplit関数の基本的な使い方を教えてください。
A. Split(文字列, 区切り文字)で文字列を分割してString型の配列が返ります。例: items = Split("A,B,C", ",") とすると items(0)="A", items(1)="B", items(2)="C" になります。配列の要素数はUBound(items)+1で確認できます。For i = 0 To UBound(items)でループして全要素を処理するのが基本パターンです。
Q. Split関数で複数の区切り文字を使いたい場合はどうすればいいですか?
A. Split関数は区切り文字を1種類しか指定できません。複数の区切り文字に対応するには、Replace関数で全ての区切り文字を1種類に統一してからSplitします。例: str = Replace(str, ";", ",") → parts = Split(str, ",") のように、セミコロンをカンマに置換してからカンマでSplitします。3種類以上の区切りがある場合は複数のReplaceを連続して使います。
Q. Split関数で「インデックスが有効範囲にありません」エラーが出ます。原因は?
A. 配列の範囲外のインデックスにアクセスしているのが原因です。例えばSplitで3要素の配列(インデックス0〜2)に対してitems(3)にアクセスするとこのエラーになります。対策: アクセス前にIf targetIndex <= UBound(items) ThenでインデックスがUBound以下かを確認してください。また、Splitが返す配列の要素数が想定より少ない場合は、区切り文字が見つからなかった可能性があります(その場合はitems(0)に元の文字列全体が入ります)。
Q. VBAでCSVファイルをSplitで読み込む方法を教えてください。
A. Open/Input/Closeでファイル全体をテキストとして読み込んだ後、①改行コードで行に分割(Split(text, vbCrLf))→②各行をカンマで列に分割(Split(line, ","))→③セルに書き込む、という2重Splitのパターンを使います。WindowsのファイルはvbCrLf(\r\n)とvbLf(\n)が混在することがあるため、Replace(text, vbCr, "")でvbCrを除去してからvbLfでSplitするのが安全です。
Q. Split関数でNullが入ったセルを処理すると「型が一致しません」が出ます。
A. Split関数にNull値を渡すと「型が一致しません(エラー13)」が発生します。セルの値を渡す前にIsNull()またはIsEmpty()でNullチェックを行い、NullならSplitをスキップしてください。またセルの値はVariant型で取得されるため、Split関数に渡す前にCStr(cellValue)で文字列型に変換する習慣をつけると安全です。
Q. Claude CodeでVBAのSplitコードを生成してもらうにはどう指示すればいいですか?
A. 「入力データの形式(どの列・どんな区切り文字)」「出力の形式(どの列に展開するか)」「スキップ条件(空行・Nullの扱い)」の3点を日本語で伝えるのが効果的です。例: 「A列にカンマ区切りの文字列があります。Split関数で分割してB列からJ列に展開するVBAマクロを書いて。空セルはスキップ。各要素はTrimで空白除去。」このように具体的に伝えると、UBound・Nullチェック・Trimが入った完成度の高いコードが返ってきます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。


