【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 writeRow As Long
    Dim writeColumn As Long
    Dim i 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
    '書き出し列
    writeColumn = csvSheet.Range(startRange).Column
    '書き出し行
    writeRow = csvSheet.Range(startRange).Row
    
    '読み込むファイルの形式を【文字列】と指定するための配列を作成
    Dim arrDataType(255) As Long
    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(writeRow, writeColumn))
                '区切り文字に「カンマ区切り」を指定
                .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
            '次の書き出し行を取得
            writeRow = csvSheet.Cells(Rows.Count, writeColumn).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行目)。

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

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

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

PR

実行結果

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

実行結果
実行結果
PR

参考①

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

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


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

PR

参考②

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

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

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