はじめに
文字列を区切り文字で分割してくれるSplit関数は、簡単に配列を作れるので便利です。
その一方で、区切り文字が無かった場合や、文字列が空白(文字数が0)だった場合も想定してプログラムを組む必要があります。
Split関数がどのような値を返してくるのか見ていきましょう。
区切り文字で分割された場合
Split関数の返り値は、配列の要素数が未定なので、バリアント型で受けるのが基本です。
Sleep関数の引数に区切り文字が含まれている場合は、以下のように参照できます。
Sub testSplit1()
Dim arr
Dim str As String
str = "ab,cd"
arr = Split(str, ",")
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
配列の添え字(インデックス)は、0から始まります。VBAでは配列の最初の要素を示す LBound と、最後の要素を示す LBound を使うと良いでしょう。
区切り文字が無かった場合
Split関数の引数の文字列に区切り文字が含まれていない場合は、配列の最初の要素に値が入っています。
バリアント型で受けますが、文字列にはならないので注意しましょう。
Sub testSplit2()
Dim arr
Dim str As String
str = "abcd" '区切り文字が含まれていない!
arr = Split(str, ",")
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
このプログラムを実行すると、イミディエイトウィンドウに以下のように表示されます。
abcd
文字列が空白だった場合
引数の文字列が空白だった場合、配列を参照するとエラーとなります。ただし、以下のようにLBound と UBoundで For文を回すとエラーとはなりません。
Sub testSplit3()
Dim arr
Dim str As String
str = ""
arr = Split(str, ",")
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
これは、以下のように配列(arr)が、Lbound=1, UBound=-1 となっているので For文 を回さずに終了するためにです。

Split関数の引数文字列が空白になるような場合は、UBound が -1 になる事で判断できます。
以下のように外部関数にして配列を返すような場合は、この事を想定した方が良いでしょう。
外部関数で配列を受ける例
Function getSplitArray(str As String) As Variant
getSplitArray = Split(str, ",")
End Function
Sub test_getSplitCode()
Dim i As Long
Dim arr
Dim s As String
s = Range("A1").Text 'どんな値が来るかわからない
arr = getSplitArray(s)
If UBound(arr) = -1 Then
Debug.Print "要素なし"
Else
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End If
End Sub
上記のプログラムでは、引数文字列が空白の場合を想定してメッセージを出すようにしています。
値を受け取るバリアント型の変数に対して IsEmpty などは使えないので注意しましょう。
まとめ
Split関数が返す配列を受ける場合は、配列要素なしの場合 UBound が -1 になる事を想定した方が良いでしょう。
IsEmpty などは無意味なので注意してください。
コメント