【EXCEL:VBA】フォルダに存在するCSVファイルを全て取り込みたい

フォルダに存在するCSVファイルを全て取り込みたい

この記事では、指定されたフォルダに存在するCSVファイルを全て取り込みする方法について説明しています。

 

VBAを利用すれば、フォルダに存在するCSVファイルを全て取得でき、1つ1つCSVファイルを手で開く必要はありません。

 

しかも、全てのCSVデータを間違いなく取得し、簡単に一覧化することができます。

 

また、ヘッダー行があるCSVファイルでは、ヘッダー行を除いて取り込みできます。

 

他にも、値のくくりを除いて取り込みます。

 

例えば、ダブルコーテーションでくくられている場合、値のみ取り込みします。

 

 

それでは、指定したフォルダ配下の全てのCSVファイルを対象に、取り込みする機能を作成していきましょう。

 

困っている女性

大量に作成されているCSVファイルを取り込みするのが地味に大変なの・・・、わかる!?

困っている女性

仕事で大量のCSVファイルを1つ1つ取り込みすることはできるけど、すごく時間がかかるの。

困っている女性

ダブルコーテーションでくくられている値もあって、大変なの。
それなら、VBAを使えばボタン1つ押すだけで、大量のCSVファイルを一気に1つのシートに取り込みすることができるよ。

解決する男性

CSVファイルが存在するフォルダパスを指定すれば、そのフォルダに存在するCSVファイルの必要なデータのみ取り込めるよ。

解決する男性

困っている女性

それそれ、早く教えてよ。

 

◆似たような作業で、単純に1つのCSVファイルを取り込みする方法については、以下の記事を参照してください。

CSVファイルを取込したい 【EXCEL:VBA】CSVファイルを取り込みたい

 

◆他には、EXCELシートに入力したデータをCSV形式でファイル出力する方法については、以下の記事を参照してください。

入力したデータをCSVファイル形式で出力したい 【EXCEL:VBA】入力したデータをCSVファイル形式で出力したい

 

複数CSVファイルを一気に取り込みする機能を、1つ1つ順番に説明していきます。

フォルダ指定欄、ヘッダー行の有無・文字くくり形式を指定する欄を準備する

まず、フォルダを指定する欄と細かい設定する欄を作成します。

「メイン」シートを作成する

メインシートを作成する

メインシートを作成する

  1. 「メイン」という名前のシートを作成します。
  2. 1行目に「フォルダパス」のタイトル行を作成します。
  3. 2行目に「フォルダパス」を入力する欄を作成します。
  4. 3行目に「ヘッダー行の有無」、「文字くくりの形式」のタイトル行を作成します。
  5. 4行目に「ヘッダー行の有無」、「文字くくりの形式」の設定例の行を作成します。
  6. 5行目に「ヘッダー行の有無」、「文字くくりの形式」を入力する欄を作成します。

 

取り込んだCSVデータを出力するシートを準備する

全てのCSVデータを出力するシートを作成します。

「データ」シートを作成する

データシートを作成する

データシートを作成する

「データ」という名前のシートを追加します。

あとは、特になにもしなくてよいです。

 

VBAでシート名を取得する機能を記入する

開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。

Microsoft Visual Basic for Applicationsを起動する

Microsoft Visual Basic for Applicationsを起動する

 

「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。

VBAプログラムを入力する(その1)

VBAプログラムを入力する(その1)

 

VBAプログラムを入力する(その2)

VBAプログラムを入力する(その2)

 

標準モジュールを追加して、以下のソースを書きます。

 

最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。

 

指定したフォルダに存在するCSVファイルを取り込みする機能の使い方

それでは、CSVファイルを取り込みする方法を説明します。

 

まず、A2セルにCSVファイルが存在するフォルダパスを入力します。

フォルダパスを指定する

フォルダパスを指定する

 

次に、取り込みするCSVファイルの設定をします。

「ヘッダー行の有無」には、「あり」・「なし」のどちらかを指定します。

ヘッダー行(1行目)がある場合は、「あり」を指定します。

ヘッダー行がない場合は、「なし」を指定します。

 

「文字くくりの形式」には、「なし」または実際のくくり文字を指定します。

例えば、ダブルコーテーション(”)でくくられている場合、「”」を指定します。

取り込み設定を指定する

取り込み設定を指定する

 

次に、「開発」タブの「マクロ」をクリックします。

VBAプログラムを実行する

VBAプログラムを実行する

 

先程作成した自作関数「Main_Proc」が一覧に表示されていますので、選択します。

次に、「実行」ボタンをクリックしてフォルダを作成します。

実行ボタンをクリックする

実行ボタンをクリックする

 

しばらく待つと、指定したフォルダ配下に存在する全CSVファイルが取り込まれ、データシートに出力されます。

全てのCSVファイルを取り込みした結果

全てのCSVファイルを取り込みした結果

 

ちなみに、実際のフォルダは以下のようになっています。

実際のフォルダの様子

実際のフォルダの様子

 

ちなみに、実際のCSVファイルの中身は以下のようになっています。

実際のCSVファイルの中身

実際のCSVファイルの中身

 

1行目にはヘッダー行があり、各データはダブルコーテーションでくくられています。

 

複数のCSVファイルを取り込みするVBAプログラム(Main_Proc)の説明

それでは、VBAプログラム(Main_Proc)を説明します。

①メインシートを変数に格納する

ここでは、このあとの処理で何度も使う「メイン」シートを変数に格納しています。

そうすることにより、入力するプログラムを短くすることができるからです。

何度も「ThisWorkbook.Sheets(“メイン”)」と入力するより、「shtMain」と入力するほうがコードが少なくてよいからです。

 

②データシートを変数に格納する

ここでは、このあとの処理で何度も使う「データ」シートを変数に格納しています。

取り込んだCSVデータを出力するときに、何度も使います。

 

③データシートをクリアする

ここでは、CSVファイルを取り込みする前にデータシートの中身をクリアしています。

なぜなら、何度も繰り返し実行する場合、前に取り込んでいたCSVデータが残っていると、不都合が起きるからです。

手で毎回消すのも面倒なので、VBAプログラムで自動的に消しておきます。

 

④FileSystemObjectを変数に格納する

ここでは、「FileSystemObject」を変数に格納しています。

「FileSystemObject」は、フォルダに存在するファイルを調べることに利用します。

 

⑤指定されているフォルダに存在するファイル数分処理を繰り返す

ここでは、A2セルに入力されたフォルダに存在するファイル数分、以降の処理を繰り返します。

 

⑥拡張子がcsvのファイルのみ対象とする

ここでは、フォルダに存在するファイルの拡張子が「csv」か確認しています。

拡張子が「csv」のファイルのみを対象に、以降の処理を行います。

例えば、拡張子が「txt」や「xlsx」など、対象外となります。

 

⑦CSVファイルを開く

ここでは、フォルダに存在するCSVファイルを開いています。

 

⑧CSVファイルの最終行まで繰り返す

ここでは、先程開いたCSVファイルの最終行まで、以降の処理を繰り返します。

 

⑨1行分をbuf変数に取り込みする

ここでは、開いているCSVファイルの1行分を変数「buf」に取り込みしています。

 

⑩ファイルの1行目かつヘッダー行がありの場合は、取り込みをスキップする

ここでは、CSVファイルの1行目かつ「ヘッダー行の有無」に「あり」を指定している場合のときの、処理になります。

具体的には、ヘッダー行は取り込まないので、なにもしません。

 

⑪カンマ毎に区切って、値を配列に格納する

ここでは、取り込みした1行分をカンマ毎に区切って、配列に格納しています。

 

⑫配列の最終列まで繰り返す

ここでは、先程の1行分のデータを格納した配列を1つ目から最後まで繰り返します。

 

⑬文字くくりの形式が”なし”ならそのままセルにセットする

ここでは、「文字くくりの形式」で「なし」を指定されている場合、取り込んだデータをそのままセルに出力しています。

「文字くくりの形式」で「なし」以外を指定されている場合、指定された値を取り除いて、セルに出力しています。

 

⑭現在開いているCSVファイルを閉じる

ここでは、開いているCSVファイルを閉じています。

 

⑮FileSystemObjectをクリアする

ここでは、使い終わったFileSystemObjectをクリアしています。

 

結果として、指定されたフォルダに存在するCSVファイル全てを、データシートに取り込みできるようになりました。

 

それでは、複数のCSVファイルを一気に取り込みするツールを作って、作業を効率化しましょう。

 

以上です。

 

 

最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

 

3 COMMENTS

watanabe

お世話になっております。
大変参考にさせていただいております。

ヘッダー行がありの場合は1行飛ばして読み込む設定があるようですが、
2行飛ばして読み込む方法をご教示いただけないでしょうか。

返信する
くうねる

ヘッダー行が2行ある場合、以下のコードを追加します。

Line Input #1, buf

具体的には、以下の場所にコードを追加します。

'⑩ファイルの1行目かつヘッダー行がありの場合は、取り込みをスキップする
If blnHeader = True And shtMain.Range("A5") = "あり" Then
'取り込みをスキップする
Line Input #1, buf '←追加した行
Else

ヘッダー行が3行ある場合、以下のコードを追加します。

'⑩ファイルの1行目かつヘッダー行がありの場合は、取り込みをスキップする
If blnHeader = True And shtMain.Range("A5") = "あり" Then
'取り込みをスキップする
Line Input #1, buf '←追加した行
Line Input #1, buf '←追加した行
Else

以上です。

返信する
watanabe

>ヘッダー行が2行ある場合

ありがとうございました!できました。
(こんなに早く返信いただけるとは思っておらず、サイトの確認が遅れました)

返信する

watanabe へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です