毎日、取引先から送られてくるCSVファイルを手作業で開いて、Excelシートにコピーして、列幅を整えて…という作業に時間を取られていませんか?
「CSVを開く → データをコピー → 体裁を整える」
この繰り返し作業、実はVBAで自動化できます。
今回紹介するコードを使えば、ボタン1つでCSVファイルを読み込んで、きれいな表に整形できます。
こんな人におすすめ
- 毎日CSVファイルをExcelで開いて加工している人
- システムから出力されたデータを手作業で整形している人
- 複数のCSVファイルを1つにまとめたい人
- データの読み込みと同時に書式も自動で整えたい人
このコードを覚えれば、CSV処理の時間が10分の1になります。
コードの動作イメージ
- 指定したフォルダにあるCSVファイルを選択
- 自動でExcelシートに読み込む
- 見出し行に色を付けて、列幅を自動調整
- 罫線を引いて表らしく整形
これらの作業をボタン1つで完了します。
CSVファイルを自動インポートするVBAコード
Sub ImportCSVFile()
Dim ws As Worksheet
Dim filePath As String
Dim lastRow As Long
Dim lastCol As Long
' 1. CSVファイルを選択
filePath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , "CSVファイルを選択")
' キャンセルされた場合は終了
If filePath = "False" Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
' 2. 新しいシートを作成
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "インポートデータ_" & Format(Now, "mmddhhnn")
' 3. CSVファイルを開いてデータを読み込む
With ws.QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=ws.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileColumnDataTypes = Array(xlTextFormat) ' すべて文字列として読み込む
.Refresh BackgroundQuery:=False
End With
' 4. データ範囲を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
' 5. 見出し行を装飾
With ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol))
.Font.Bold = True
.Interior.Color = RGB(68, 114, 196)
.Font.Color = RGB(255, 255, 255)
.HorizontalAlignment = xlCenter
End With
' 6. 罫線を引く
With ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
.Borders.LineStyle = xlContinuous
.Borders.Color = RGB(0, 0, 0)
End With
' 7. 列幅を自動調整
ws.Columns.AutoFit
MsgBox "CSVファイルを読み込みました。" & vbCrLf & _
"行数:" & lastRow & vbCrLf & _
"列数:" & lastCol, vbInformation
End Sub
コードのポイント解説
① Application.GetOpenFilename でファイルを選択
filePath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , "CSVファイルを選択")
この行で、ファイル選択ダイアログが表示されます。
ユーザーが選んだファイルのパスが filePath に入ります。
② QueryTables.Add でCSVを読み込む
With ws.QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=ws.Range("A1"))
.TextFileCommaDelimiter = True
.Refresh BackgroundQuery:=False
End With
QueryTables を使うと、文字コードの問題や区切り文字の違いに対応しやすいです。Workbooks.Open でCSVを開く方法もありますが、QueryTablesの方が安全です。
③ 見出し行に色を付ける
With ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol))
.Font.Bold = True
.Interior.Color = RGB(68, 114, 196)
.Font.Color = RGB(255, 255, 255)
End With
1行目を青背景・白文字・太字にして、見出しらしく装飾しています。
④ 列幅を自動調整
ws.Columns.AutoFit
データの長さに合わせて列幅が自動調整されます。
応用編:フォルダ内の複数CSVを一括処理
「フォルダ内にある10個のCSVを全部読み込みたい」という場合は、次のコードが使えます。
Sub ImportAllCSVFromFolder()
Dim folderPath As String
Dim fileName As String
Dim ws As Worksheet
Dim targetRow As Long
' 1. フォルダを選択
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "CSVファイルが入っているフォルダを選択"
If .Show = -1 Then
folderPath = .SelectedItems(1)
Else
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
End With
' 2. 集計用シートを作成
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "CSV一括読込_" & Format(Now, "mmddhhnn")
targetRow = 1
' 3. フォルダ内のCSVファイルを順に処理
fileName = Dir(folderPath & "\*.csv")
Do While fileName <> ""
' CSVファイルを開いてデータをコピー
Dim wbCSV As Workbook
Set wbCSV = Workbooks.Open(folderPath & "\" & fileName, Local:=True)
Dim lastRow As Long
Dim lastCol As Long
lastRow = wbCSV.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
lastCol = wbCSV.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
' データをコピー
wbCSV.Sheets(1).Range(wbCSV.Sheets(1).Cells(1, 1), wbCSV.Sheets(1).Cells(lastRow, lastCol)).Copy _
Destination:=ws.Cells(targetRow, 1)
targetRow = targetRow + lastRow
wbCSV.Close SaveChanges:=False
' 次のファイルへ
fileName = Dir()
Loop
' 列幅を整える
ws.Columns.AutoFit
MsgBox "フォルダ内の全CSVファイルを読み込みました。", vbInformation
End Sub
このコードを使えば、数十個のCSVファイルを一気にまとめることができます。
よくあるエラーと対処法
エラー①:文字化けする
原因: CSVの文字コードが Shift_JIS または UTF-8 でない場合に起こります。
対処法:
- CSVを一度メモ帳で開いて、「UTF-8で保存」してから読み込む
- または、
QueryTablesのTextFileTextCodepageプロパティで文字コードを指定する
エラー②:数値が日付に変換される
原因: Excelが自動で「0001」→「1月1日」のように解釈してしまいます。
対処法:
コード内で次の設定を追加します。
.TextFileColumnDataTypes = Array(xlTextFormat)
これで全列が「文字列」として読み込まれます。
エラー③:QueryTableが残ってしまう
原因: QueryTables.Add で読み込んだ後、クエリテーブルがシートに残ります。
対処法:
読み込み後に次の行を追加して削除します。
ws.QueryTables(1).Delete
まとめ:CSV処理はVBAで自動化しよう
- Application.GetOpenFilename でファイル選択ダイアログを表示
- QueryTables.Add でCSVを安全に読み込める
- 見出し行の装飾や列幅調整も自動化できる
- 複数ファイルの一括処理も Dir関数 で実現可能
毎日のCSV処理にかかる時間を大幅に削減できるので、ぜひ試してみてください。
関連記事:


コメント