前回の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)