Excel VBA 「CSV展開関数」



・CSV形式のデータをExcelのセルに展開する関数です。
・おそらく効率の良いアルゴリズムではありません。
 しかし、ダブルクォーテーションやカンマが含まれる形式に対応する方法が
 見つからなかったので、自分でつくりました。


・仕様,使い方
 ファイル規則: 1.値はカンマで区切られていること。
         2.ダブルクォーテーション、カンマ、改行が値に含まれる場合は、
           値がダブルクォーテーションで囲まれていること。
         3.ダブルクォーテーションが値に含まれる場合は、「"」を「""」として保存されていること。
         4.列数が全ての行で同じであること。
         
 読み込み規則: 1.レコードの境目はカンマにして読み込んでください

 expandCSV(CSVデータ,データ出力開始行,データ開始出力列,列数)
  例)expandCSV("太郎,20才,東京都在住" & "," & "次郎,16才,大阪府在住",1,2,3)
  ※上の例だと、B1のセルから出力が開始されます


'----------------------------------------------------------------------------------------------------------------------

Sub expandCSV(ByVal FILE_DATA As String, ByVal START_ROW As String, ByVal START_COLUMN, ByVal COLUMN_COUNT As Integer)
    
    Application.ScreenUpdating = False
    
    csv = Split(FILE_DATA, ",")
    
    j = 0
    curRow = START_ROW
    For i = 0 To UBound(csv)
        
        buf = csv(i)
        
        Set reg = CreateObject("VBScript.RegExp")
        With reg
            .Pattern = "^"""
            escStart = .test(csv(i))
        End With
        
        If escStart Then
        
            buf = Mid(buf, 2, Len(buf))
            qcnt = UBound(Split(buf, """"))
            
            If qcnt <= 0 Or qcnt Mod 2 = 0 Then
                i = i + 1
                While (qcnt <= 0 Or qcnt Mod 2 = 0) And i < UBound(csv)
                    buf = buf & "," & csv(i)
                    qcnt = UBound(Split(buf, """"))
                    i = i + 1
                Wend
                i = i - 1
            End If
            
            buf = Left(buf, Len(buf) - 1)
            buf = Replace(buf, """""", """")
        
        End If
        
        Cells(curRow, START_COLUMN + j).Value = buf
        buf = ""
        j = j + 1
        
        If COLUMN_COUNT <= j Then
            curRow = curRow + 1
            j = 0
        End If
        
    Next i
    
    Application.ScreenUpdating = True
    
End Sub

'----------------------------------------------------------------------------------------------------------------------

Copyright © 2008-2017 Nekorald All rights reserved.