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