ページ

2012/05/20

[Excel][VBA]CSVファイルを読み込む


改行を含まないが、カンマを含む可能性があるCSVは
ダブルクオートで囲んでカンマ区切りにする。
例.
"foo","bar","baz"
"hoge","fuga","piyo"
上のような形式のCSVファイルをパースする手順
(1)一行で読み込み、先頭と終端の"を除去する
(2)","でSplitして配列にする

Function LoadCSV()
    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim textline, CsvArray() As String
    Dim RowCnt As Long
    Dim ch1 As Long
    
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    
    FileNamePath = Application.GetOpenFilename(FileType, , Prompt)
    
    'キャンセルされた
    If FileNamePath = False Then End Funciton
    
    '空いているファイル番号の取得
    ch1 = FreeFile
    
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1
    
    'エラーが発生したらファイルを閉じます
    On Error GoTo CloseFile
    
    '表の行番号の初期化
    RowCnt = 1
    
    'ファイルの終端まで
    Do Until EOF(ch1)
        '1行読み込む
        Line Input #ch1, textline
        'CSVをパース
        textline = Mid(textline, 2, Len(textline) - 2)
        CsvArray = Split(textline, """,""")
        
        '配列渡しでセルに代入
        Range(Cells(RowCnt, 1), Cells(RowCnt, UBound(CsvArray()) + 1)) = CsvArray()
        
        RowCnt = RowCnt + 1
    Loop
    
CloseFile:
    Close #ch1 'ファイルのクローズ
    
End Function

CSVファイルフォーマットの解説:CodeZine

改行のある場合は1行ずつ読み込む方法じゃ無理だからもっと面倒。
値の中にダブルクオーテーションがある場合のエスケープなんかも考慮してない。
ある程度自由にCSV側の出力をいじれるならパースする方も楽。