.png)
今回は、フォルダに格納されている複数のCSVファイルをExcelのシートに取り込む処理をご紹介します。なお、各CSVファイルのフォーマット自体は揃っているという前提です(タイトル名や項目列の並びなど)。
動作としては、参照ボタンを押してフォルダを選択した後、読み込み開始ボタンを押すことで新しいシートにCSVデータを書き出す処理を行います。1つのファイルに対して「読み込み→書き出し」を行い、ファイルの件数分を繰り返すというものです。
CSVファイルの取り込みについては、以前ご紹介した『UTF-8のCSVをExcelのシートに取り込む』の応用編になります。今回はフォルダに格納されたファイルを1つずつ取り出すという繰り返し処理があるため、過去記事のソースコードを一部変更しています。
特定の1ファイルのみ取り込みたい場合は過去記事をご参照ください。
▼過去記事:UTF-8のCSVをExcelのシートに取り込む

【ExcelVBA】UTF-8のCSVをExcelのシートに取り込む | ともゆきの独り言(雑記ブログ)
UTF-8のCSVをExcelのシートに取り込む処理の備忘録です。動作としては、参照ボタンを押してCSVファイルを選択した後、読み込み開始ボタンを押すことで新しいシートにCSVデータを書き出す処理を行います。
▼過去記事:Shift-JISのCSVをExcelのシートに取り込む
.png)
【ExcelVBA】Shift-JISのCSVをExcelのシートに取り込む | ともゆきの独り言(雑記ブログ)
今回は、Shift-JISのCSVをExcelのシートに取り込むコードをご紹介します。単純にLineInputでの読み込みなので、難しい処理ではありません。動作としては、参照ボタンを押してファイルを選択した後、読み込み開始ボタンを押すことで新しいシートにCSVデータを書き出す処理を行います。
画面設計

- シート名:設定情報
- 名前付け:セルD4「CSVフォルダ」
- 参照ボタン:「フォルダ選択」マクロを指定
- 読み込み開始ボタン:「MainProcess」マクロを指定
入力データ
フォルダ構成

フォルダ名:2025年
マクロファイルと同じ階層に年フォルダが用意されているものとします。年フォルダの中に、月別のCSVファイルが格納されています。なお、CSVファイルはutf-8のBOM付きです。
入力データ


ファイル名:4月.csv、5月.csv、6月.csv
サンプルデータは取り敢えず3件ほど用意しました。
処理実行結果

指定したフォルダにあるCSVファイルの内容が、マクロファイル内に新しいシートとしてそれぞれ用意されます。
フォルダに格納されている複数CSVファイルを取り込む - ソースコード(ExcelVBA)
Option Explicit Private ObjADO As ADODB.Stream 'Microsoft ActiveX Data Objects X.X Library Private ObjFSO As FileSystemObject 'Microsoft Scripting Runtime ────────────────────────────────────────────────────────────────────────────── Sub MainProcess() '初期処理 Set ObjADO = New ADODB.Stream Set ObjFSO = New FileSystemObject '設定情報の読み込み Dim WS As Worksheet Dim FolderPath As String Set WS = ThisWorkbook.Worksheets("設定情報") FolderPath = WS.Range("CSVフォルダ") '指定フォルダの存在チェック If ObjFSO.FolderExists(FolderPath) = False Then MsgBox "フォルダが存在しません。" End End If 'フォルダに格納してあるCSVファイルの読み込み Dim YearFolder As Folder Dim FilesCollection As Files Dim CurrentFile As File Dim FileName As String Set YearFolder = ObjFSO.GetFolder(FolderPath) Set FilesCollection = YearFolder.Files For Each CurrentFile In FilesCollection FileName = ObjFSO.GetBaseName(CurrentFile) Call CSVImport(CurrentFile, FileName) Next '後処理 Set ObjFSO = Nothing Set ObjADO = Nothing End Sub ────────────────────────────────────────────────────────────────────────────── Sub CSVImport(ByRef filePath As Variant, ByRef sheetName As String) 'レコード数取得 Dim csvRow As Long With ObjFSO.OpenTextFile(filePath, 8) csvRow = .Line .Close End With '新規シート作成 Dim newWS As Worksheet Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = sheetName Set newWS = ActiveSheet 'CSV取り込み Dim readString As String Dim tmp As Variant Dim i As Long Dim j As Long ReDim Arry(0 To csvRow, 100) ObjADO.Type = 2 'テキストのデータ型を指定(1:adTypeBinary…バイナリデータ/2:adTypeText…テキストデータ) ObjADO.Charset = "utf-8" '文字コードを指定(UTF-8/Shift_JIS/euc-jp/ISO-2022-JP/Unicode など) ObjADO.LineSeparator = -1 '改行コードを指定(13:adCR/-1:adCRLF/10:adLF) ObjADO.Open 'Streamのオープン ObjADO.LoadFromFile (filePath) 'ファイル読み込み Do While Not ObjADO.EOS readString = ObjADO.readText(-2) 'テキストを1行読み込む readString = replaceColon(readString) '受け取った文字列のカンマをコロンに置き換える(ダブルクォーテーションで囲まれているカンマは置き換えない) tmp = Split(Replace(replaceColon(readString), """", ""), ":") 'strLineをコロンで区切り配列に格納 For j = 0 To UBound(tmp) Arry(i, j) = tmp(j) Next j i = i + 1 Loop ObjADO.Close 'Streamのクローズ '配列の転記 Range("A1:CR" & csvRow + 1) = Arry End Sub ────────────────────────────────────────────────────────────────────────────── Function replaceColon(ByVal str As String) As String Dim strTemp As String Dim quotCount As Long Dim l As Long For l = 1 To Len(str) 'strの長さだけ繰り返す strTemp = Mid(str, l, 1) 'strから現在の1文字を切り出す If strTemp = """" Then 'strTempがダブルクォーテーションなら quotCount = quotCount + 1 'ダブルクォーテーションのカウントを1増やす ElseIf strTemp = "," Then 'strTempがカンマなら If quotCount Mod 2 = 0 Then 'quotCountが2の倍数なら str = Left(str, l - 1) & ":" & Right(str, Len(str) - l) '現在の1文字をコロンに置き換える End If End If Next l replaceColon = str End Function
ポイント
- ソースコード内で使用するライブラリについては「事前バインディング」のため、メニューの「ツール」から参照設定でそれぞれチェックを入れてください。
Private ObjWSH As WshShell ➡ Windows Script Host Object Model
Private ObjADO As ADODB.Stream ➡ Microsoft ActiveX Data Objects X.X Library
Private ObjFSO As FileSystemObject ➡ Microsoft Scripting Runtime - フォルダ内にある各ファイルの繰り返し処理は、以前ご紹介した「ファイル一覧作成」の処理と同様です。対象フォルダーをフォルダー型変数「YearFolder」に格納し、そこから更に複数ファイルのコレクション型変数「FilesCollection」を作成します。作成したコレクション型変数をFor Each ~ Nextでループさせます。また、フォルダ選択ダイアログのマクロもこちらに掲載しております。
▼過去記事:フォルダ選択ダイアログ、ファイル一覧出力、セルの書式設定、etc.
【ExcelVBA】フォルダ選択ダイアログ、ファイル一覧出力、セルの書式設定、etc. | ともゆきの独り言(雑記ブログ)
GoogleのBloggerで雑記ブログ。楽天経済圏,ExcelVBA,お絵かき,ゲームプレイ記,プロ野球観戦(楽天イーグルス)
- CSVを取り込む際、CSVのファイル名をシート名とさせたいので、FileSystemObjectのGetBaseNameで拡張子を除いたファイル名を取得しています。取得した文字列をCSVImportの引数として渡すことで、その文字列でシート名を作成します。
コメントを投稿
別ページに移動します