CSV分割 完全版

  • デル株式会社
  • 前回の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)
    

    関連記事

    ページ上部へ戻る