【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!

HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > フォルダ内のファイル一覧を取得する

即効テクニック

ファイル操作関連のテクニック

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

(Excel 97/2000/2002/2003/2007/2013/2016)
あるフォルダの中に保存されているファイルの一覧を取得するにはどうしたらいいでしょう。
真っ先に思いつくのは、Dir関数とDo Loopステートメントを使う方法です。
ここでは、C:\Workフォルダに、複数のファイルが存在するものとします。
取得したファイルの一覧は、アクティブシートのA列に書き出します。

Sub Sample1()
  Dim i As Long, buf As String
  Const Path As String = "C:\Work\"
  buf = Dir(Path & "*.*")
  Do While buf <> ""
    i = i + 1
    Cells(i, 1) = buf
    buf = Dir()
  Loop
  msgbox "全部で" & i & "個ファイルがありました"
End Sub   
これは、それほど難しくありませんね。 今回は、FileSystemObjectを使った方法を解説します。 FileSystemObjectのFilesプロパティは、指定したフォルダ内に存在するすべてのファイルをメンバーとするコレクションを返します。
Sub Sample2()
  Dim i As Long, FSO As Object, f As Object
  Const Path As String = "C:\Work\"
  Set FSO = CreateObject("Scripting.FileSystemObject")
  MsgBox "全部で" & FSO.GetFolder(Path).Files.Count &  _
                       "個のファイルがあります"

  For Each f In FSO.GetFolder(Path).Files
    i = i + 1
    Cells(i, 1) = f.Name
  Next f
  Set FSO = Nothing
End Sub   
Dir関数は、Do Loopが終了するまでファイルの個数がわかりません。 一方のFileSystemObjectは、FilesコレクションのCountプロパティを調べることでファイル数だけを先に取得することも可能です。 さて、上記のSample2は、For Eachステートメントでファイル名を取り出しました。 これを、For Nextステートメントでやってみましょう。 ファイルの個数はFiles.Countで分かるのですから、次のようになります。
Sub Sample3()
  Dim i As Long, FSO As Object
  Const Path As String = "C:\Work\"
  Set FSO = CreateObject("Scripting.FileSystemObject")
  MsgBox "全部で" & FSO.GetFolder(Path).Files.Count &  _
                      "個のファイルがあります"

  For i = 0 To FSO.GetFolder(Path).Files.Count - 1
    Cells(i + 1, 1) = FSO.GetFolder(Path).Files(i).Name
  Next i
  Set FSO = Nothing
End Sub   
コードをよくご覧ください。特にFor Nextステートメントのところです。 考え方としては、どこも間違っていません。 これは、ワークシートの一覧を取得する、次のような考え方と同じです。
Sub Sample4()
  Dim i As Long
  For i = 1 To Worksheets.Count
    Cells(i, 1) = Worksheets(i).Name
  Next i
End Sub   
しかし、Sample3はエラーになります。 エラーの箇所は「Cells(i + 1, 1) = FSO.GetFolder(Path).Files(i).Name」行です。 「Cells(i + 1, 1)」部分に間違いはありませんから、エラーの原因は次の「FSO.GetFolder(Path).Files(i).Name」にありそうです。 コードをいくら眺めても理由は分かりません。 実は、FileSystemObjectのFilesコレクションは、
「Fles("Sample.xls")」
のようにメンバー名で特定することはできても、
「Files(1)」
のような、インデックス値による特定はできないのです。 最近では、VBAからOLEオートメーションを使って、Windows Scripting Host(WSH)やFileSystemObject、Internet Explorerなどを活用するケースも珍しくありません。 ただし、そうした外部機能では、Excel VBAと仕様が異なる部分もあり得るので、使いこなすにはVBA以外の学習も必要になります。