【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
即効テクニック |
あるフォルダの中に保存されているファイルの一覧を取得するにはどうしたらいいでしょう。 真っ先に思いつくのは、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 SubDir関数は、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以外の学習も必要になります。