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

No.014

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

2003/2007/2010/2013

フォルダーやファイルを確認、整理したいとき、フォルダーやファイルの名前がシートに一覧化されると、チェックに使えたりと便利です。
それを自動にやってくれるVBAをご紹介します。

フォルダーやファイルの名前を取得したい場合に複数の方法がありますが、今回は Dir関数を使用した方法でご案内します。
では先に記述をご紹介し、あとでポイントを少しご紹介します。

Sub Sample1()

  Dim strPath As String
  Dim strFlName As String
  Dim intR As Integer

  strPath = Range("B1") & "¥"
  intR = 3
  Range(Cells(3, 1), Cells(1048576, 1)).ClearContents

  strFlName = Dir(strPath & "*", vbDirectory)
  Do While strFlName <> ""
    If Replace(strFlName, ".", "") <> "" Then
      Cells(intR, 1) = strFlName
      intR = intR + 1
    End If
    strFlName = Dir
  Loop

End Sub

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

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

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

では、記述についてのポイントを以下に少し加えます。

フォルダー内のすべてのフォルダーやファイルを調べるために、Dir関数を利用しています。
Dir関数の基本的な説明は、次のヘルプ「フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》」をご参照ください。

今回の記述のポイントは、Dir関数の引数です。

  strFlName = Dir(strPath & "*", vbDirectory)

Dir関数1つ目の引数に「場所¥ファイル名」を指定しますが、場所は変数strPath、ファイル名は「"*"」と、なんでもありのワイルドカードを使用しています。
これでフォルダー内(場所)のすべてが対象となります。
Excelだけの一覧がほしい場合は「"*.xlsx"」、テキスト ファイルなら「"*.txt"」に変えてください。

そのあとカンマがあり、2つ目の引数に「vbDirectory」と指定しています。
これでファイルとフォルダーも対象になります。
ファイルの一覧のみでよい場合は場合は、「,vbDirectory」は必要ないので外してください。

そして次に、ループに入り、条件があります。

   If Replace(strFlName, ".", "") <> "" Then

この条件を満たしたときのみファイル名またはフォルダー名をセルに記載し、満たさない場合は何もせずに、次のファイルフォルダー取得に進みます。
変数strFlNameには、Dir関数が返したファイル名やフォルダー名が入ります。
実は、この条件を外して実行すると、上の階層のフォルダーを意味する「.」「..」といったドットが返されます。
これらは普通いらないと思いますので、変数strFlNameにドットのみの内容が格納された場合はセルに記載しないよう、条件を付けています。

ドットのみの内容が返されるのは、フォルダー名も一覧するために、Dir関数の引数で「vbDirectory」を指定したためです。
したがって、ファイル名のみの一覧でよければ、この条件も必要ないことになります。

ファイル名の一覧だけでよい場合は、次のようなシンプルな記述となります。

Sub Sample2()

  Dim strPath As String
  Dim strFlName As String
  Dim intR As Integer

  strPath = Range("B1") & "¥"
  intR = 3
  Range(Cells(3, 1), Cells(1048576, 1)).ClearContents

  strFlName = Dir(strPath & "*")
  Do While strFlName <> ""
    Cells(intR, 1) = strFlName
    intR = intR + 1
    strFlName = Dir
  Loop

End Sub

以上ですが、同じ動作で FileSystemObjectオブジェクトを使用したヘルプ「フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》」も是非参考にしてください。

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《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》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》
twitter hatena line pocket