Split関数が返す配列

文字列関数

はじめに

 文字列を区切り文字で分割してくれる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 などは無意味なので注意してください。

コメント

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