Split関数って使っていますか?指定の文字を区切り文字として、文字列を分割する場合に使用します。この記事では、Split関数についてSplit関数の使い方という基本的な内容から、
- UBound関数で分割後の要素数を調べる
- 複数の文字で文字列を分割する方法
- 正規表現で文字列を分割する方法
など応用的な内容についても解説していきます。今回はSplit関数について、使い方をわかりやすく解説します!
Split関数の使い方
Split関数は、指定の文字で文字列を分割し、分割したそれぞれの文字列を一次元配列に格納します。格納する配列は動的配列で宣言する必要があります。Split関数は以下のように記述します。
Split(分割元の文字列名, 区切り文字)
区切り文字は省略することができ、省略する場合は半角スペース(“ ”)が区切り文字に指定されます。ちなみに文字列を分割するSplit関数の逆で、文字列を結合する場合にはJoin関数を使います。
スペースで分割して配列に格納する
それでは実際にSplit関数を使って文字列を分割するサンプルコードをみていきましょう。
Sub macro1() Dim arr() As String, i As Integer, msg As String arr = Split("東京 大阪 名古屋") For i = 0 To 2 msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
このサンプルコードでは、Split関数を使って文字列を分割しています。Split関数の区切り文字の指定を省略しているので半角スペース(” ”)が区切り文字になります。
半角スペースで分割されたそれぞれの文字列は動的配列arrの要素として格納され、それぞれの要素を出力表示しています。
カンマで分割
カンマはCSVファイルの区切り文字として使われます。カンマを区切り文字で指定する場合について、サンプルコードで確認しましょう。
Sub macro3() Dim arr() As String, i As Integer, msg As String arr = Split("東京,大阪,名古屋", ",") For i = LBound(arr) To UBound(arr) msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
タブで分割
タブはTSVファイルで区切り文字として使われます。タブを区切り文字で指定する場合について、サンプルコードで確認しましょう。
Sub macro5() Dim arr() As String, i As Integer, msg As String arr = Split("東京 大阪 名古屋", " ") For i = LBound(arr) To UBound(arr) msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
改行文字で分割
改行文字も区切り文字として指定することができます。サンプルコードで確認しましょう。
Sub macro6() Dim arr() As String, i As Integer, msg As String msg = "東京" & vbCrLf & "大阪" & vbCrLf & "名古屋" & vbCrLf arr = Split(msg, vbCrLf) For i = LBound(arr) To UBound(arr) msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
UBound関数で分割後の要素数を調べる
Split関数で返される動的配列の要素数を調べるには、UBound関数とLBound関数を使用します。UBound関数は引数に指定した配列で使用できる最も大きいインデックス番号を返します。LBound関数は引数に指定した配列で使用できる最も小さいインデックス番号を返します。
配列の要素数は以下の式で求めることができます。
要素数 = UBound関数の戻り値 - LBound関数の戻り値 + 1
サンプルコードで確認しましょう。
Sub macro2() Dim arr() As String arr = Split("東京 大阪 名古屋") MsgBox "要素数: " & UBound(arr) - LBound(arr) + 1 End Sub
UBound関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
複数の文字で文字列を分割する方法
「( )」(カッコ)のようにペアで使われる場合、「(」、「)」のどちらでも文字列を分割したいこともあります。
しかし、Split関数は区切り文字を複数指定することはできません。複数の文字で文字列を分割したい場合は、Replace関数を使って複数の区切り文字を1つに統一します。Replace関数は第1引数に変更する文字列を含む文字列を指定します。
第2引数には変更する文字列を、第3引数には変更後の文字列を指定します。統一した区切り文字をSplit関数の区切り文字に指定して分割します。サンプルコードで確認しましょう。
Sub macro7() Dim arr() As String, i As Integer, msg As String Dim str1 As String, str2 As String str1 = "東京(Tokyo)大阪(Osaka)名古屋(Nagoya)" str2 = Replace(str1, ")", "(") arr = Split(str2, "(") msg = str2 & vbCrLf For i = LBound(arr) To UBound(arr) msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
このサンプルコードではReplace関数を使って文字列str1中の「)」を「(」に変更しています。変更後の文字列str2では区切り文字が「(」に統一されています。統一された区切り文字「(」を指定してSplit関数で文字列を分割しています。
Replace関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
正規表現で文字列を分割する方法
先ほどは2つの区切り文字で分割する方法についてご紹介しましたが、もっとたくさんの文字で分割したい場合は面倒ですよね。そんな場合は正規表現を使うと便利です。
でも、Split関数は正規表現を使って分割することはできません。正規表現を別の区切り文字に変換してから、変換後の区切り文字を使って分割します。正規表現を別の区切り文字に変換するにはRegExpオブジェクトのReplace関数を使います。
サンプルコードで確認していきましょう。
Sub macro8() Dim arr() As String, i As Integer, msg As String 'RegExpオブジェクトの作成 Dim reg As Object Set reg = CreateObject("VBScript.RegExp") '正規表現の指定 With reg .Pattern = "[〒 都道府県市区町村]" 'パターンを設定します .IgnoreCase = False '大文字と小文字を区別するか(False)、しないか(True) .Global = True '文字列全体を検索するか(True)、しないか(False) End With Dim str1 As String, str2 As String str1 = "〒100-0005 東京都千代田区丸の内1丁目" str2 = reg.Replace(str1, ",") '指定した正規表現を第2引数の区切り文字に変換 arr = Split(str2, ",") msg = str2 & vbCrLf For i = LBound(arr) To UBound(arr) msg = msg & arr(i) & ", " Next i MsgBox msg End Sub
このサンプルコードでは、まず「〒 都道府県市区町村」これらの文字を正規表現として指定しています。RegExpオブジェクトのPatternプロパティを使って正規表現を指定します。そのあとでRegExpオブジェクトのReplace関数を使って正規表現を「,」に変換しています。
変換された区切り文字「,」を指定してSplit関数で文字列を分割しています。
まとめ
ここでは、Split関数の使い方について説明しました。Split関数は複数の区切り文字を指定することも、正規表現を区切り文字として指定することもできません。
しかし1つの区切り文字に変換し、その区切り文字を指定することで分割できるようになります。使いこなすことができるように、この記事を何度も参考にして下さいね!