【VBA】複数のCSVファイルをシートへ読み込む【高速】

VBAで
 ・複数のCSVファイルを
 ・シートへ読み込む方法
を紹介します!

複数のCSVファイルを
 ・1つのシート上へ読み込んで
 ・1つの表にする方法
です!

複数のCSVファイルをシートへ読み込んだ結果
複数のCSVファイルをシートへ読み込んだ結果

各CSVファイルに見出し行があっても、
上手いことシートへ読み込みます!

またこの方法は
 ・1ファイルずつ1度にまるっと読み込む方法であるため
 ・高速にCSVファイルを読み込む
ことができます!
※繰り返し処理により1行ずつ読み込むのではないため、高速に読み込めます

PR

VBAコード

ここでは例として、
 ・デスクトップ配下のフォルダ「test」配下にある
 ・全てのCSVファイルを
 ・シートへ読み込む方法
を紹介します。

フォルダ「test」配下のCSVファイル(3つ)
フォルダ「test」配下のCSVファイル(3つ)
001.csv
001.csv
002.csv
002.csv
003.csv
003.csv

上記の全てのCSVファイルには「見出し行」があります。

ここでは3つの処理を作成します。

●main関数
・各種設定(対象フォルダ等)をする
・「複数のCSVファイルを対象シートへ読み込む関数」の呼び出し
・「表をテーブル化する関数」の呼び出し

●複数のCSVファイルをシートへ読み込む関数
・対象フォルダ配下の全てのCSVファイルをシートへ読み込む

●表をテーブル化する関数
・CSVファイルを読み込んだシート上の表をテーブル化する

3つの処理の呼び出し関係は以下です。

3つの処理の呼び出し関係
3つの処理の呼び出し関係
Option Explicit

Sub main()

    Dim targetFolder As String
    Dim loadSheetName As String
    Dim startRange As String
    Dim tableName As String
    
    '対象フォルダを指定
    targetFolder = "C:\Users\user\Desktop\test"
    'CSVファイルを読み込むシート名
    loadSheetName = "csv"
    '書き出し開始セル
    startRange = "B2"
    
    '複数のCSVファイルをシートへ読み込む
    Call readMultipleCsvFile(targetFolder, loadSheetName, startRange)
    
    'テーブル名を指定
    tableName = "テストテーブル"
    
    '表をテーブル化する
    Call makeTable(loadSheetName, startRange, tableName)

End Sub


'---------------------------------------------------
'複数のCSVファイルをシートへ読み込む関数
'引数
'   targetFolder  :対象フォルダ
'   loadSheetName :CSVファイルを読み込むシート名
'   startRange    :書き出し開始セル
'---------------------------------------------------
Sub readMultipleCsvFile(ByVal targetFolder As String, ByVal loadSheetName As String, ByVal startRange As String)
    
    Dim sheet As Worksheet
    Dim csvSheet As Worksheet
    Dim fso As Object
    Dim fileCount As Long
    Dim outputRow As Long
    Dim outputColumn As Long
    Dim i As Long
    Dim arrDataType(255) As Long
    Dim file As Object
    Dim n As Variant

    '既に「CSVファイルを読み込むシート」が存在する場合は削除
    For Each sheet In ThisWorkbook.Worksheets
        If sheet.Name = loadSheetName Then
            '確認メッセージを非表示
            Application.DisplayAlerts = False
            'シート削除
            Worksheets(loadSheetName).Delete
            '確認メッセージを表示
            Application.DisplayAlerts = True
        End If
    Next
    
    '「CSVファイルを読み込むシート」を新規作成
    Set csvSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    csvSheet.Name = loadSheetName

    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '処理したファイル数を示すカウンタ変数
    fileCount = 0
    '出力列(書き出し開始セルの列)
    outputColumn = csvSheet.Range(startRange).Column
    '出力行(書き出し開始セルの行)
    outputRow = csvSheet.Range(startRange).Row
    
    '読み込むファイルの形式を【文字列】と指定するための配列を作成
    For i = 0 To 255
        arrDataType(i) = xlTextFormat
    Next
    
    '対象フォルダ配下のファイル数分繰り返し
    For Each file In fso.getFolder(targetFolder).Files
        '拡張子がcsvの場合のみ処理を行う
        If LCase(fso.GetExtensionName(file.Name)) = "csv" Then
            'カウンタ変数をカウントアップ
            fileCount = fileCount + 1
            '「QueryTableオブジェクト(=クエリと接続)」を作成
            With csvSheet.QueryTables.Add(Connection:="TEXT;" + file.Path, Destination:=Cells(outputRow, outputColumn))
                '区切り文字に「カンマ区切り」を指定
                .TextFileCommaDelimiter = True
                '文字コードに「Shift_JIS」を指定
                .TextFilePlatform = 932
                '読み込み開始行を指定
                '┗1ファイル目の場合は、1行目から(見出し行から)。
                '┗2ファイル目以降の場合は、2行目から(見出し行を除く)。
                If fileCount = 1 Then
                    .TextFileStartRow = 1
                Else
                    .TextFileStartRow = 2
                End If
                '読み込むファイルの形式を指定
                .TextFileColumnDataTypes = arrDataType
                '読み込み実行
                .Refresh BackgroundQuery:=False
                '名前を指定(後続処理で削除できるようにするため)
                .Name = "仮テーブル"
                '作成された「QueryTableオブジェクト(=クエリと接続)」を削除
                .Delete
            End With
            '次の出力行を取得
            outputRow = csvSheet.Cells(Rows.Count, outputColumn).End(xlUp).Row + 1
        End If
    Next
    
    '上記で作成されてしまう名前定義(仮テーブル)を削除
    For Each n In ActiveWorkbook.Names
        If n.Name Like loadSheetName & "!" & "仮テーブル*" Then
            n.Delete '
        End If
    Next
    
   '後片付け
    Set fso = Nothing
    
End Sub


'---------------------------------------------------
'表をテーブル化する関数
'引数
'   sheetName  :対象シート
'   startRange :テーブル化する表の開始セル
'   tableName  :テーブル名
'---------------------------------------------------
Sub makeTable(ByVal sheetName As String, ByVal startRange As String, ByVal tableName As String)
    
    With Worksheets(sheetName)
        '対象シートをアクティブにする
        .Activate
        'テーブル化する(名前定義も含む)
        .ListObjects.Add(Source:=Range(startRange).CurrentRegion, XlListObjectHasHeaders:=xlYes).Name = tableName
    End With
    
End Sub

以下を指定します。
※状況に応じて任意の値を指定してください。

・対象フォルダ(11行目)
・CSVファイルを読み込むシート名(13行目)
・書き出し開始セル(15行目)
・テーブル名(21行目)

「読み込むファイルの形式を【文字列】と指定するための配列」を作成します(75~77行目)。

1ファイル目の場合は、1行目から(見出し行から)読み込みます(95行目)。
2ファイル目以降の場合は、2行目から(見出し行を除いて)読み込みます(97行目)。

「次の出力行」を取得します(109行目)。

PR

実行結果

複数のCSVファイルをシートへ読み込めました。
CSVファイルを読み込んだシート上の表をテーブル化できました。

実行結果
実行結果
PR

参考①

上記のVBAコードは以下の記事を参考にして作成しました。

●CSVファイルをシートへ読み込む


●シート上の表をテーブル化する

PR

参考②

複数のCSVファイルを1つのファイルに纏めることもできます。

詳細は以下の記事をご確認ください。

PR

参考③

PowerShellで複数のCSVファイルを1つのExcelファイルにすることもできます。

詳細は以下の記事をご確認ください。

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