あるフォルダの中に保存されているファイルの一覧を取得するにはどうしたらいいでしょう。
真っ先に思いつくのは、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以外の学習も必要になります。