VBAで
・複数のCSVファイルを
・シートへ読み込む方法
を紹介します!
複数のCSVファイルを
・1つのシート上へ読み込んで
・1つの表にする方法
です!
各CSVファイルに見出し行があっても、
上手いことシートへ読み込みます!
またこの方法は
・1ファイルずつ1度にまるっと読み込む方法であるため
・高速にCSVファイルを読み込む
ことができます!
※繰り返し処理により1行ずつ読み込むのではないため、高速に読み込めます。
VBAコード
ここでは例として、
・デスクトップ配下のフォルダ「test」配下にある
・全てのCSVファイルを
・シートへ読み込む方法
を紹介します。
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
実行結果
複数のCSVファイルをシートへ読み込めました。
CSVファイルを読み込んだシート上の表をテーブル化できました。
参考①
上記のVBAコードは以下の記事を参考にして作成しました。
●CSVファイルをシートへ読み込む
●シート上の表をテーブル化する
参考②
複数のCSVファイルを1つのファイルに纏めることもできます。
詳細は以下の記事をご確認ください。
参考③
PowerShellで複数のCSVファイルを1つのExcelファイルにすることもできます。
詳細は以下の記事をご確認ください。