【ExcelVBA・マクロ】CSVファイルを自動でインポートして表に整える方法|フォルダから一括読込【初心者向け】

CSVファイルを自動でインポートして表に整える方法 ExcelVBA

毎日、取引先から送られてくるCSVファイルを手作業で開いて、Excelシートにコピーして、列幅を整えて…という作業に時間を取られていませんか?

「CSVを開く → データをコピー → 体裁を整える」

この繰り返し作業、実はVBAで自動化できます。

今回紹介するコードを使えば、ボタン1つでCSVファイルを読み込んで、きれいな表に整形できます。


スポンサーリンク
スポンサーリンク

こんな人におすすめ

  • 毎日CSVファイルをExcelで開いて加工している人
  • システムから出力されたデータを手作業で整形している人
  • 複数のCSVファイルを1つにまとめたい人
  • データの読み込みと同時に書式も自動で整えたい人

このコードを覚えれば、CSV処理の時間が10分の1になります。


コードの動作イメージ

  1. 指定したフォルダにあるCSVファイルを選択
  2. 自動でExcelシートに読み込む
  3. 見出し行に色を付けて、列幅を自動調整
  4. 罫線を引いて表らしく整形

これらの作業をボタン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で保存」してから読み込む
  • または、QueryTablesTextFileTextCodepage プロパティで文字コードを指定する

エラー②:数値が日付に変換される

原因: Excelが自動で「0001」→「1月1日」のように解釈してしまいます。

対処法:
コード内で次の設定を追加します。

.TextFileColumnDataTypes = Array(xlTextFormat)

これで全列が「文字列」として読み込まれます。


エラー③:QueryTableが残ってしまう

原因: QueryTables.Add で読み込んだ後、クエリテーブルがシートに残ります。

対処法:
読み込み後に次の行を追加して削除します。

ws.QueryTables(1).Delete

まとめ:CSV処理はVBAで自動化しよう

  • Application.GetOpenFilename でファイル選択ダイアログを表示
  • QueryTables.Add でCSVを安全に読み込める
  • 見出し行の装飾や列幅調整も自動化できる
  • 複数ファイルの一括処理も Dir関数 で実現可能

毎日のCSV処理にかかる時間を大幅に削減できるので、ぜひ試してみてください。


関連記事:

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました