【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法


files

photo credit: Domiriel Filed Under “Folders” via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法についてシリーズでお伝えしています。

いや~、FileSystemオブジェクト…便利ですね。スマートにファイルやフォルダを操作できます。

前回は以下の記事で、フォルダの存在を判定してなければ作成する方法をお伝えしました。

【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法
エクセルVBAでファイルやフォルダを操作するFileSystemオブジェクトの使い方をお伝えしています。今回は指定のフォルダの存在確認をして、存在しなかった場合にフォルダを作成する方法についてお伝えします。

今回は、ファイル一覧を出力する方法についてお伝えします。

フォルダをゲットして、その中のファイルをコレクションとしてゲットして、For Eachで回して、ファイル名を出力する…こんなダンドリです。

では、エクセルVBAでFileSystemオブジェクトを使ってファイル一覧を出力する方法、行ってみましょう!

スポンサーリンク

フォルダ内のファイル一覧を取得する

では早速ですが、エクセルVBAでFileSystemオブジェクトを使ってファイル一覧を出力するプログラムを紹介します。

こちらです!

Sub フォルダ内のファイル一覧を取得する()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Dim objFolder As Object
Set objFolder = objFso.GetFolder(ThisWorkbook.Path & "\xlsx")

Dim f As Object
For Each f In objFolder.Files
    Debug.Print f.Name
Next f

Set objFso = Nothing

End Sub

流れとしては

  1. FileSystemオブジェクトを生成
  2. 対象とするフォルダを取得
  3. 対象フォルダ内のファイルのコレクションについて繰り返し
    • 各ファイル名を出力
  4. FileSystemオブジェクトを破棄

という流れです。

お題のフォルダと実行結果

お題とするフォルダはマクロを記載するブックと同階層のフォルダ「xlsx」で、以下のような構成になっています。

エクセルVBAでファイル一覧を出力する対象フォルダ

前述のプログラムを実行すると、以下のようにイミディエイトウィンドウに出力がされます。

エクセルVBAでファイル一覧を出力した結果

以下で、プログラムのポイントを解説していきます。

GetFolderメソッドでFolderオブジェクトを取得

まず対象となるフォルダをFolderオブジェクトとして取得します。

書き方は

FileSystemオブジェクト.GetFolder(フォルダパス)

です。フォルダパスの最後の「\」はつけても良いですし、なくても大丈夫です。

前述のプログラムでいうと6行目からの以下の部分ですね。

Dim objFolder As Object
Set objFolder = objFso.GetFolder(ThisWorkbook.Path & "\xlsx")

現在のブックと同階層にある「xlsx」フォルダを指定しています。

Filesプロパティでフォルダ内のファイルをコレクションとして取得

次に、対象となるフォルダ内のファイルをオブジェクトの集合、つまりFilesコレクションとして取得します。

その場合、Folderオブジェクトに対するFilesプロパティを使います。

書き方はこちら。

Folderオブジェクト.Files

ファイルをコレクションとして取得できれば、For Each文でコレクションの全ての要素についての繰り返し処理をすることができますね。

それが、プログラムでいる9行目からの部分です。

Dim f As Object
For Each f In objFolder.Files
    '処理
Next f

ここでFor Each文内の処理は、対象フォルダ内のFilesコレクションの要素数の回数だけ繰り返されます。

毎回の繰り返しで、各要素が順番に繰り返し用のオブジェクト変数fに格納されます。fはこの場合、Fileオブジェクトとなります。

従って、「’処理」の部分で、Fileオブジェクトfに対する操作をすることで、対象フォルダ内のFilesコレクションの全ての要素について、同様の処理を行うことができるというわけです。

コレクションに対するFor Each文については以下記事もご参考ください。

【エクセルVBA入門】For Each~Next文でフォルダ内のブック全てを開く方法
エクセルVBAを使ってバラバラの経費精算書のデータを集約するシリーズです。今回は、For Each~Next文でフォルダ内の複数のワークブックの全てを順番に参照して処理していく方法についてお伝えします。

Nameプロパティでファイル名を取得する

Fileオブジェクトの名前、つまりファイル名を取得するには、Nameプロパティを使います。

書き方はこちら。

Fileオブジェクト.Name

シンプルですね。

プログラムでいうと、11行目の部分ですね。

Debug.Print f.Name

fは対象フォルダ内のFilesコレクションの要素、つまりFileオブジェクトですので、そのファイル名が出力されるということになります。

まとめ

以上、エクセルVBAでFileSystemオブジェクトを使って、フォルダ内のファイル一覧を取得する方法をお伝えしました。

Filesコレクションを掴んでしまえばこちらのものですね。

For Each文はとっても便利なので、ぜひマスターして頂ければと思います。

今回、ファイル一覧をやりましたので、次回はフォルダ一覧を出力してみたいと思います。

【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する
エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法のシリーズです。今回はFor Each文とコレクションを活用してサブフォルダ一覧を取得する方法です。

どうぞお楽しみに!

連載目次:FileSystemオブジェクトでフォルダやファイルを操作する

ファイルやフォルダを操作するのはデリケートな気がしますが、エクセルVBAではFileSystemオブジェクトを使うことでファイル、フォルダ、ドライブをオブジェクトとして安全にそして細やかに操作をすることができます。 このシリーズでは、FileSystemオブジェクトの様々な活用法についてシリーズでお伝えしていきます。
  1. 【エクセルVBA】FileSystemオブジェクトの基本と簡単にフルパスを生成・分解する方法
  2. 【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
  3. 【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法
  4. 【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
  5. 【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する

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