StrDivide()
文字列を、指定したデリミタを目印に分割して配列に格納して返します。
CSV から読み出したカンマ区切りの文字列や、API
関数から帰ってきたヌル文字区切りの評価、あるいは UNIX
の LF
コード改行のファイルを行単位に分けるなどの処理に使えると思います。
また、デリミタ間がスペースのみ、あるいはデリミタが連続している場合などの処理も細かく指定できます。
たとえば、"生麦 // //生米////生卵"
を "//"(スラッシュ2本)をデリミタとして分割する場合
| スペース、空文字を許可しない(通常設定) | "生麦" "生米" "生卵" |
| 単語の前後のスペースは省略され、空文字となった単語は戻し値に含まれません。 | |
| スペースを許可し、空文字は許可しない | "生麦 " " " "生米" "生卵" |
| スペースはそのまま残されますが、空文字の単語は戻し値に含まれません。 | |
| スペースは許可せず、空文字は許可する | "生麦" "" "生米" "" "生卵" |
| 単語の前後のスペースは省略されますが、空文字の単語は戻し値に含まれます。 | |
| スペース、空文字を許可する | "生麦 " " " "生米" "" "生卵" |
| スペースはそのまま残り、空文字の単語は戻し値に含まれます。 | |
…という具合に戻し値の内容を規定できます。
Option Explicit
Public Function StrDivide(ByVal strWords As String, strDivWrd As String, _
Optional blnAllowSpace As Boolean = False, _
Optional blnAllowNullString As Boolean = False) As Variant
'文字列を、指定されたデリミタを区切りに分割し、ゼロベースの配列形式にして返す
'処理に失敗した場合は NULL を返すので、呼び出し側で IsArray() や IsNull() を使って判別すること
'<引数>
' strWords : 分割対象となる文字列
' strDivWrd : 分割記号
' blnAllowSpace : 単語の前後のスペースを許可するかどうか(既定値:偽)
' blnAllowNullString : 単語が空文字だった場合、戻し値の配列要素に含めるかどうか(既定値:偽)
'<戻し値>
' 処理が成功すれば、区切られた文字列の配列が戻ります。
' 処理が失敗すれば、NULL が戻ります。
' 呼び出し側で、戻り値を IsNull() 関数でチェックして成否を判別してください。
Dim i As Integer 'ループカウンタ
Dim lngStrLen As Long '全体の文字列長
Dim lngDivLen As Long 'デリミタの文字列長
Dim strRet() As String '戻し値
Dim s As String '評価中の文字
lngDivLen = Len(strDivWrd)
If LenB(strWords) > 0 Then
lngStrLen = InStr(strWords, strDivWrd)
Do While lngStrLen > 0&
'次の分割記号までの文字列を取得
s = Left$(strWords, lngStrLen - 1&)
'空白が許可されていなければ除去
If Not blnAllowSpace Then s = Trim$(s)
'空文字でないか、空文字が許可されていれば取り出す
If LenB(s) > 0 Or blnAllowNullString Then
ReDim Preserve strRet(i) As String
strRet(i) = s
i = i + 1
End If
'文字列の処理済み部分を削除し、次の分割記号を検索
strWords = Right$(strWords, Len(strWords) - (lngStrLen - 1 + lngDivLen))
lngStrLen = InStr(strWords, strDivWrd)
Loop
'最後の分割記号より後ろの文字列処理
If LenB(strWords) > 0 Or blnAllowNullString Then
If Not blnAllowSpace Then strWords = Trim$(strWords)
ReDim Preserve strRet(i) As String
strRet(i) = strWords
i = i + 1
End If
End If
'配列成分がゼロならば、エラーと見做し NULL を返す
If i > 0 Then StrDivide = strRet _
Else StrDivide = Null
End Function
以下は、動作確認用のプロシージャです。
Public Sub DoTest(strWords As String, strDivWrd As String, _
blnAllowSpace As Boolean, blnAllowNullString As Boolean)
Dim varWords, varWord
varWords = StrDivide(strWords, strDivWrd, blnAllowSpace, blnAllowNullString)
'戻り値に対し、IsNull()関数でチェック。NULLだったら処理失敗
If IsNull(varWords) Then
Debug.Print "処理失敗!"
Else
For Each varWord In varWords
'配列内の全要素をイミディエイトウィンドウに表示
Debug.Print """" & CStr(varWord) & """"
Next
End If
End Sub
実行例:
イミディエイトウィンドウでの実行例です。
Call DoTest("生麦 // //生米////生卵","//",True,True)
"生麦 "
" "
"生米"
""
"生卵"
Call DoTest("生麦 // //生米////生卵","//",False,False)
"生麦"
"生米"
"生卵"