ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

No.015

フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》

2003/2007/2010/2013

フォルダー内のフォルダーやファイルの名前をシートに一覧化するVBAをご紹介します。

フォルダーやファイルの名前を取得したい場合に複数の方法がありますが、今回は FileSystemObjectオブジェクトを使用した方法をご案内します。
同じ動作でDir関数を使用したヘルプ「フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》」も参考にしてください。

FileSystemObjectオブジェクトは、ファイルやフォルダーを操作することができるオブジェクトで、普段よく行うあやゆる操作ができます。
今回はそのうちのファイル名やフォルダー名の取得に利用します。
簡単な説明を後に入れますので、先に記述を確認していきましょう。
FileSystemObjectオブジェクトを使用する際の記述はいくつかパターンありますが、よく使われる2パターンでご案内します。

サンプルの動作は、まずExcelのセルB1にファイル、フォルダーの一覧がほしいフォルダーのパスを入力しておきます。
ボタンをクリック(VBAを実行)すると、セルA3以下にフォルダー、ファイルの一覧が表示されます。

今回サンプルファイルも用意していますので、次のリンクをクリックしダウンロードしてご利用ください。

サンプルVBAファイル ダウンロード

<オブジェクト変数を使う方法>

Sub Sample1()

  Dim FSO As Object
  Dim strPath As String
  Dim intPathLen As Integer
  Dim intR As Integer
  Dim F As Variant

  strPath = Range("B1") & "¥"  'フォルダー場所
  intPathLen = Len(strPath)
  intR = 3
  Range(Cells(3, 1), Cells(1048576, 1)).ClearContents

  Set FSO = CreateObject("Scripting.FileSystemObject")
  For Each F In FSO.GetFolder(strPath).SubFolders  'フォルダー名
    Cells(intR, 1) = Right(F, Len(F) - intPathLen)
    intR = intR + 1
  Next F
  For Each F In FSO.GetFolder(strPath).Files  'ファイル名
    Cells(intR, 1) = Right(F, Len(F) - intPathLen)
    intR = intR + 1
  Next F
  Set FSO = Nothing

End Sub

<Withステートメントを使う方法>

Sub Sample2()

  Dim strPath As String
  Dim intPathLen As Integer
  Dim intR As Integer
  Dim F As Variant

  strPath = Range("B1") & "¥"  'フォルダー場所
  intPathLen = Len(strPath)
  intR = 3
  Range(Cells(3, 1), Cells(1048576, 1)).ClearContents

  With CreateObject("Scripting.FileSystemObject")
  For Each F In .GetFolder(strPath).SubFolders  'フォルダー名
    Cells(intR, 1) = Right(F, Len(F) - intPathLen)
    intR = intR + 1
  Next F
  For Each F In .GetFolder(strPath).Files  'ファイル名
    Cells(intR, 1) = Right(F, Len(F) - intPathLen)
    intR = intR + 1
  Next
  End With

End Sub

どちらの記述においても、CreateObject関数を使用して、CreateObjectオブジェクトを呼び出し、ファイル システムへのアクセスを可能にしています。
もう少し詳しくは、下記<ヘルプmemo>をご覧ください。

では、記述について触れておきます。

For Each~Next の構文がそれぞれ2度出てきます。

  For Each F In FSO.GetFolder(strPath).~

.GetFolder(パス)のあと、1つ目の「.SubFolders」はパス配下のすべてのサブフォルダー、2つ目の「.Files」はパス配下のすべてのファイルがコレクションで返されます。
For Each構文により、コレクション内の各すべてを処理します。

処理内容は、取得したフォルダー名やファイル名をセルに代入する作業を行うわけですが、それぞれフルパスで返されるため、Right関数を使用して名前部分を取り出しています。

ヘルプmemo

<FileSystemObjectオブジェクト>
コンピューターのファイル システムへのアクセスを提供します。
構文: Scripting.FileSystemObject
ヒント:
FileSystemObjectオブジェクトは、VBA組み込みではない外部オブジェクトで、Windows内にある Scrrun.dll ファイルより提供されるものです。
したがって、FileSystemObjectオブジェクトを使用するためにはアクセスする必要があり、CreateObject関数を使用して参照、FileSystemObjectオブジェクトのインスタンスを作成することができます。
あとは、FileSystemObjectオブジェクトのプロパティやメソッドを使用して、ドライブ、フォルダー、ファイルを扱うことができます。

FileSystemObjectオブジェクトについては、別の機会に詳しくご紹介していく予定です。

twitter hatena line pocket

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
データを快速で検索するには 《Find》
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》