今回は、特定のフォルダの中にあるファイルを一覧で表示するというマクロについて考えていきます。
例えば、ファイルの名前を一気にコピーしたいときとかに使えたりします。
それだけであれば、コマンドプロンプトから同じようなことができますし、そっちの方が手っ取り早かったりもします。
マクロで作る場合は、そこからさらに改良することもできます。
ファイル名と同等のフォルダを一気に作ったりだとか、ファイル名を一気にリネームしたりとか。
ただし、今回作るのはあくまでもファイルを一覧表示させるところまでです。
■ポイント
ファイルの一覧を取得するには、Dir関数を使用するのが一般的です。
buf = Dir("C:\Sample\Book1.xls")
のように使います。
一致した場合は、一致したファイル名を返します。
この場合は、Book1.xlsを返します。
さらに、Dir関数ではワイルドカードを使ってファイル名をしていることができます。
buf = Dir("C:\Sample*.xls")
とすると、Sampleフォルダ内にある.xlsを含むファイルをすべて返します。
ただし、一度にすべてを出力するわけではありません。
2回目以降は引数なしで使用することができます。
buf = Dir()といったように。
こうやって繰り返し利用することによって、2つ目以降のファイル名を取得することができます。
そして、最後は空文字を返します。
つまり、空文字を返すまでループすれば、一致したファイル名を全て取得することができるわけです。
と、文章で読んでもいまいちわかりにくいと思いますので、ぜひ回答を見て実際に試してみてください。
■回答
Sub Q19_Answer()
Dim buf As String, cnt As Long, Path As String
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
Path = .SelectedItems(1)
End If
End With
Range("E2").Value = Path
cnt = 2
buf = Dir(Path & "\")
Do While buf <> ""
cnt = cnt + 1
Cells(cnt, 2) = buf
buf = Dir()
Loop
End Sub
■解説
今回は前半部分で、フォルダを指定するダイアログを出力する処理を記述しています。
そして、そのフォルダ内にあるファイル一覧を取得しています。
前述したとおり、空文字を返すまでループ処理をしています。
この部分です。
Do While buf <> ""
cnt = cnt + 1
Cells(cnt, 2) = buf
buf = Dir()
Loop
これで、最初に指定したフォルダにあるファイル一覧を取得することができます。
実行例は以下です。まずデスクトップに新しいフォルダーを作成し、その中に
テキストファイルを複数用意しました。
そして、マクロを上記のマクロを実行してみます。
すると、このようにファイル一覧を取得することができました。