Excel VBA 逆引き集 | CSVを読み込む

Excel VBA
スポンサーリンク

CSVを読み込む

CSVは「簡単にExcelへ取り込めるけど文字化け・桁落ち・型崩れが起きやすい」形式。用途別に最短コードと安全テンプレをまとめました。初心者でも使える基本から、UTF-8対応や大量処理まで網羅します。


方針の選び方(用途別の最短ルート)

  • とにかく開いて見たい: Workbooks.Open(最短)
  • 列型や区切りを細かく指定したい: OpenText/QueryTables(データ取り込み)
  • 1行ずつ読み込んで柔軟に整形: Line Input(テキスト読み込み)
  • UTF-8やBOM付きの文字化け対策: ADODB.Stream(文字コード指定)
  • 複数ファイルまとめて処理: FileDialog+ループ

最短で開く(Workbooks.Open)

Sub CsvOpen_Basic()
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Data\data.csv") 'そのままExcelで開く
    MsgBox "開きました: " & wb.Name
    '…必要なら別シートへ値コピーして閉じる…
    wb.Close SaveChanges:=False
End Sub
VB
  • ポイント: 手軽だが、先頭ゼロ落ち・日付変換・文字化けに注意。厳密取り込みが必要なら次の方法へ。

区切り・型指定で読み込む(OpenText)

Sub CsvImport_OpenText()
    'シートに「ブックとして」ではなく、コントロールした取り込み
    Workbooks.OpenText _
        Filename:="C:\Data\data.csv", _
        DataType:=xlDelimited, _
        Comma:=True, _
        TextQualifier:=xlTextQualifierDoubleQuote, _
        Local:=True, _              'ローカル設定(日本語CSVで安定)
        FieldInfo:=Array( _
            Array(1, 2), _         '1列目: テキスト(先頭ゼロ保持)
            Array(2, 1), _         '2列目: 一般
            Array(3, 1))           '3列目: 一般
End Sub
VB
  • ポイント: 区切りや型を指定できるため、桁落ち・勝手な日付変換を防ぎやすい。テキスト扱いが必要な列は「2(文字列)」を指定。

シートへ直接インポート(QueryTables)

Sub CsvImport_QueryTables()
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.QueryTables.Add(Connection:="TEXT;C:\Data\data.csv", Destination:=ws.Range("A1"))
        .TextFileCommaDelimiter = True
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileColumnDataTypes = Array(xlTextFormat, xlGeneralFormat, xlGeneralFormat) '型指定
        .TextFilePlatform = 65001  'UTF-8(必要なら変更)
        .Refresh BackgroundQuery:=False
    End With
End Sub
VB
  • ポイント: 取り込みウィザード相当をVBAで自動化。文字コードや列型を制御しやすく、業務で安定。

1行ずつ読み込み(Line Input)

Sub CsvRead_LineInput()
    Dim fn As Integer, line As String, parts As Variant, r As Long, i As Long
    fn = FreeFile
    Open "C:\Data\data.csv" For Input As #fn
    r = 2
    Do Until EOF(fn)
        Line Input #fn, line                '1行をまるごと取得
        parts = Split(line, ",")            'カンマ区切り
        For i = LBound(parts) To UBound(parts)
            Cells(r, i + 1).Value = parts(i)
        Next i
        r = r + 1
    Loop
    Close #fn
End Sub
VB
  • ポイント: 柔軟だが、ダブルクォート内のカンマや改行などCSV仕様の完全対応は自前実装が必要。簡易CSV・ログ・TSVに向く。

UTF-8/BOM対応(ADODB.Stream)

Sub CsvRead_UTF8_ADO()
    Dim stream As Object, text As String, lines As Variant
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2               'adTypeText
    stream.Charset = "UTF-8"      '文字コード指定
    stream.Open
    stream.LoadFromFile "C:\Data\utf8.csv"
    text = stream.ReadText
    stream.Close

    lines = Split(text, vbCrLf)
    Dim r As Long, parts As Variant, i As Long
    r = 2
    For i = LBound(lines) To UBound(lines)
        If Len(lines(i)) > 0 Then
            parts = Split(lines(i), ",")
            Range("A" & r).Resize(1, UBound(parts) + 1).Value = parts
            r = r + 1
        End If
    Next i
End Sub
VB
  • ポイント: UTF-8やBOM付きでも文字化けしにくい。自前Splitのため、厳密CSVならクォート処理追加を検討。

複数CSVをまとめて選んで取り込む

Sub CsvImport_Multi()
    Dim fd As FileDialog, i As Long
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .AllowMultiSelect = True
        .Title = "CSVファイルを選択"
        .Filters.Clear: .Filters.Add "CSV", "*.csv"
        If .Show <> -1 Then Exit Sub
        Application.ScreenUpdating = False
        For i = 1 To .SelectedItems.Count
            '1つずつQueryTablesで取り込み(A1から順次ずらす例)
            With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & .SelectedItems(i), Destination:=Cells(1, 1))
                .TextFileCommaDelimiter = True
                .TextFileTextQualifier = xlTextQualifierDoubleQuote
                .Refresh BackgroundQuery:=False
            End With
            '…必要なら次の開始セルをずらす・別シートへ出力…
        Next i
        Application.ScreenUpdating = True
    End With
End Sub
VB
  • ポイント: 対話的選択で失敗が少ない。業務バッチに最適。

よくある落とし穴と対策

  • 文字化け(UTF-8/SJIS): 文字コードを指定できる取り込み手段(QueryTablesのPlatform/ADODB.Stream)を使う。
  • 先頭ゼロ・品番の桁落ち: 列型を「テキスト」に指定(OpenTextのFieldInfo、QueryTablesのTextFileColumnDataTypes)。
  • 勝手な日付変換: 文字列型で取り込み、後で必要箇所のみ型変換。
  • クォート内のカンマ・改行: Line Input+Splitは簡易対応。厳密CSVはOpenText/QueryTablesの利用が安全。
  • 大量ファイルの安定: 逐次「開く→取り込む→閉じる」でメモリ安定。FileDialogで複数選択+ループ。
  • 「開いて使う」か「取り込んで使う」か: Workbooks.Openは手軽だが型・エンコード制御が弱い。業務ではOpenText/QueryTablesの採用が安定。

例題で練習

例題1:相対パスのCSVを型指定で取り込む

Sub Example_OpenText_Relative()
    Dim p As String: p = ThisWorkbook.Path & "\input.csv"
    Workbooks.OpenText Filename:=p, DataType:=xlDelimited, Comma:=True, _
        TextQualifier:=xlTextQualifierDoubleQuote, Local:=True, _
        FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1))
End Sub
VB

例題2:UTF-8 CSVをQueryTablesで取り込む

Sub Example_QueryTables_UTF8()
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Data\utf8.csv", Destination:=Range("A1"))
        .TextFileCommaDelimiter = True
        .TextFilePlatform = 65001
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileColumnDataTypes = Array(xlTextFormat, xlGeneralFormat)
        .Refresh BackgroundQuery:=False
    End With
End Sub
VB

例題3:ダイアログで選んだCSVを簡易読込(Line Input)

Sub Example_LineInput_Picker()
    Dim sel As Variant, fn As Integer, line As String, parts As Variant, r As Long, i As Long
    sel = Application.GetOpenFilename("CSVファイル (*.csv),*.csv", , "CSVを選択")
    If sel = False Then Exit Sub
    fn = FreeFile: Open CStr(sel) For Input As #fn
    r = 2
    Do Until EOF(fn)
        Line Input #fn, line
        parts = Split(line, ",")
        For i = LBound(parts) To UBound(parts)
            Cells(r, i + 1).Value = parts(i)
        Next i
        r = r + 1
    Loop
    Close #fn
End Sub
VB
タイトルとURLをコピーしました