Split関数で文字列を配列に分割する方法
今回の目標
「テキストデータを分割して変数にしたい!」と思ったあなたへ。
この記事では、Split関数の使い方を丁寧に解説します!
各関数の変換前と変換後の使用サンプルつきです。
目標リスト
- Split関数について、理解する
- Split関数で、要素のデータを直接取得できるようになる
説明
Split関数とは
Split関数は、指定した区切り文字に基づいて文字列を分割し、Variant型の配列として返します。
配列の各要素には、分割された文字列(String型)が格納されます。
区切りのサンプルです。
変換前 | 区切り文字 | 配列要素(0) | 配列要素(1) | 配列要素(2) |
---|---|---|---|---|
A,B,CD | , | A | B | CD |
1-23-4 | - | 1 | 23 | 4 |
ABCBD | B | A | C | D |
Split関数の構文と引数一覧
Split関数の構文
Split(expression, delimiter, limit, compare)
Split関数の引数一覧
名前 | 省略 | 規定値 | 説明 |
---|---|---|---|
string | 不可 | - | 分割する対象の文字列。 |
delimiter | 可能 | " " | 区切り文字。省略時は半角スペース。空文字("")を指定すると、区切られず配列に1要素だけ格納される。 |
limit | 可能 | -1 | 最大インデックスを指定。規定値の場合、制限なし。 |
compare | 可能 | vbBinaryCompare | 既定値の場合、大文字と小文字を区別して分割する。vbTextCompare を指定すると、大文字と小文字を区別せずに、分割する。 |
使用サンプル
1.文字列のデータを配列に分割する
1-1.カンマ区切りのデータを分割する
Split関数の第二引数に「,」を指定すると、文字列をカンマで区切って配列に分割できます。
サンプルコード
'カンマ区切りのデータを分割する
Sub SampleSplit1_1()
Dim arr As Variant
Dim str As String
Dim i As Long
'分割するデータ
str = "ab,c,d,ef"
'"," で区切る
arr = Split(str, ",")
For i = LBound(arr) To UBound(arr)
Debug.Print "arr(" & i & ") = " & arr(i)
Next i
End Sub
arr(0) = ab
arr(1) = c
arr(2) = d
arr(3) = ef
1-2.電話番号を分割する
Split関数の第二引数に「-」を指定すると、文字列をハイフンで区切って配列に分割できます。
サンプルコード
'電話番号を分割する
Sub SampleSplit1_2()
Dim arr As Variant
Dim str As String
Dim i As Long
'分割するデータ(電話番号)
str = "090-1234-5678"
'"-" で区切る
arr = Split(str, "-")
For i = LBound(arr) To UBound(arr)
Debug.Print "arr(" & i & ") = " & arr(i)
Next i
End Sub
arr(0) = 090
arr(1) = 1234
arr(2) = 5678
【補足】
サンプルプログラムは電話番号でしたが、同様の手順で郵便番号を分割することが出来ます。
2.電話番号の市内局番のみ取得する
Split関数の戻り値は配列ですが、配列の後ろにインデックス番号を指定することで、その要素を直接取得できます。
たとえば、「Split("A-B-C-D", "-")(2)」なら、分割結果の3番目の要素「C」を返します。
サンプルコード
'電話番号の市内局番のみ取得する
Sub SampleSplit2_1()
Dim buf As Variant
Dim str As String
Dim sepNum As Long
Dim IndexNum As Long
'分割するデータ(電話番号)
str = "03-1234-5678"
'取得したい要素のインデックス番号(0始まり)
IndexNum = 1
'Split関数で、配列の要素を直接、変数に代入する
buf = Split(str, "-")(IndexNum)
Debug.Print buf
End Sub
1234
インデックス番号が範囲外の場合
インデックス番号が配列の範囲外になるとエラーが発生します。
サンプルコード
'エラーが発生します!
Sub SampleSplit2_1_Error()
'取得したいインデックス番号が最大インデックスを超えているため、エラー
Debug.Print Split("03-1234-5678", "-")(10)
End Sub
実行時エラー'9'
インデックスが有効範囲にありません。
取得したいインデックス番号が最大インデックスに収まっているか、確認します。
区切り文字の個数が最大インデックスです。
Replace関数 と Len関数 を使用することで、区切り文字をカウントできます。
詳細は下記リンクを参考にしてください。
★リンク:特定の文字が何文字あるか識別する
エラーチェックを追加したプログラムは以下の通りです。
サンプルコード
Sub SampleSplit2_2()
Dim buf As Variant
Dim str As String
Dim sepNum As Long
Dim searchNum As Long
'分割するデータ(電話番号)
str = "03-1234-5678"
'取得したい要素のインデックス番号(0始まり)
searchNum = 1
'区切り文字(最大インデックス)をカウントする
sepNum = Len(str) - Len(Replace(str, "-", ""))
'インデックス番号が最大インデックスに収まっているか、確認する
If searchNum <= sepNum Then
buf = Split(str, "-")(searchNum)
Else
buf = "区切り文字が、" & searchNum & "個ありません"
End If
Debug.Print buf
End Sub
1234
3.分割数(配列)の上限を設定する
Split関数の第三引数を指定すると、配列の要素数の上限を指定できます。
要素数の上限を「4」を指定すると、インデックス番号は「0~3」になります。
例えば、「a,b,c,d,e」を「,」で区切り、要素数の上限数を「2」を指定すると、『a』と『b,c,d,e』の配列になります。
サンプルコード
'分割数(配列)の上限を設定する
Sub SampleSplit3()
Dim arr As Variant
Dim str As String
Dim i As Long
str = "ab,c,d,ef"
'配列の要素数の上限を指定する
arr = Split(str, ",", 3)
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
ab
c
d,ef
4.大文字と小文字を区別せず、分割する
Split関数の第四引数に「vbTextCompare」を指定すると、大文字小文字を区別しません(環境によっては全角半角も区別しない場合があります)
第四引数を省略した場合は、大文字と小文字を区別して処理されます。
サンプルコード
'大文字と小文字を区別せず、分割する
Sub SampleSplit4()
Dim arr As Variant
Dim str As String
Dim i As Long
'分割するデータ
str = "abcdef"
'区切り文字を、全角大文字の「C」とする
arr = Split(str, "C", , vbTextCompare)
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
ab
def
分割できない場合について
【原因1】区切り文字が文字列にない
区切り文字(第二引数)が、対象の文字列(第一引数)に含まれていない場合、文字列は分割されず、そのまま配列の要素1つとして返されます。
サンプルコード
'区切り文字が文字列にない
Sub SampleSplitEx1()
Dim arr As Variant
Dim str As String
Dim i As Long
'分割するデータ
str = "ab,c,d,ef"
'区切り文字が分割するデータに無い「-」にしてしまった
arr = Split(str, "-")
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
arr(0) = ab,c,d,ef
【原因2】区切り文字が空文字("")になっている
区切り文字(第二引数)が、空文字("")の場合、文字列は分割されず、そのまま配列の要素1つとして返されます。
サンプルコード
'区切り文字が、空文字("")
Sub SampleSplitEx2()
Dim arr As Variant
Dim str As String
Dim i As Long
'分割するデータ
str = "ab,c,d,ef"
'区切り文字が空文字("")
arr = Split(str, "")
For i = LBound(arr) To UBound(arr)
Debug.Print "arr(" & i & ") = " & arr(i)
Next i
End Sub
arr(0) = ab,c,d,ef