前回のCSV分割は、最後の文字が配列に入らないバグがあったり、ループごとにRedimは遅いから1回にまとめたかったりしたので完全版作ったよ。
配列数を最初に決めているのがミソ。
' 【機 能】 CSVデータを分割する
'
' 【形 式】 CsvDismantle
'
' 【入出力】 sData : (I) CSVデータ
' sKugiri : (I) 区切り文字
'
' 【戻り値】 CSVデータ分解後配列
Public Function CsvDismantle(ByVal sData As String, ByVal sKugiri As String) As String()
Dim vRetData() As String '区切り文字毎の配列
'-------------------------------------------------------------------------
'配列数の計算
'-------------------------------------------------------------------------
Dim lKugiriCnt As Long '区切り文字の数格納用
'(文字長 - 区切り文字を無くした文字長 = 区切り文字数)
lKugiriCnt = LenB(StrConv(sData, vbFromUnicode)) - LenB(StrConv(Replace(sData, sKugiri, ""), vbFromUnicode))
'区切り文字数+1が配列の個数
ReDim vRetData(lKugiriCnt + 1)
'-------------------------------------------------------------------------
'実行部
'-------------------------------------------------------------------------
Dim lPos As Long 'csvデータ探索用添字ワーク
Dim lPosNext As Long 'csv分解データ格納用添字ワーク
Dim ii As Long 'ループカウンタ
Dim iMidLen As Integer
lPos = 1
For ii = LBound(vRetData) To UBound(vRetData) - 1
lPosNext = InStr(lPos, sData, sKugiri, vbBinaryCompare)
If lPosNext <> 0 Then
vRetData(ii) = Mid(sData, lPos, lPosNext - lPos)
Else
vRetData(ii) = Mid(sData, lPos)
End If
Debug.Print "vRetData(" & ii & "):[" & vRetData(ii) & "]"
lPos = lPosNext + 1
Next ii
CsvDismantle = vRetData
End Function
配列の数は 呼び出し元に返す必要もなくって、呼び出し元ではUBoundで確認できるよ。
こんなかんじ。
Dim str As String
Dim arr() As String
str = "あいう,bbb,cd"
arr = CsvDismantle(str, ",")
Debug.Print UBound(arr)











