エクセルVBAで使うコードの備忘録。VBAで指定フォルダ内のすべてのファイル名を取得するコード。Dir関数を使ってフォルダ内のファイルを順に取得すると、ファイルシステムオブジェクトを使う方法を紹介します。本記事で紹介する方法はサブフォルダ内のフォルダは取得対象ではありません。サブフォルダに含まれるすべてのファイルパス一覧を取得する方法についてはこちらをご覧ください(ちょっと複雑になります)。
Dir関数を使って取得する
フォルダ内のファイル数を取得するでも同様の説明をしましたが、Dir関数にワイルドカードを指定してフォルダ内のファイルを検索して順次取得します。Dir関数の特性として、Dir関数を引数なしで使用すると「直前に指定したファイル名かつまだ検索にかかっていないファイル」の名前が返されるというものを使用しています。
下記のファンプルコードでは、ファイル数を一度カウントしてから配列のサイズを再定義し、再定義された配列に再度ファイル名を格納しています。ほとんど同じ作業を二度繰り返しているのであまりスマートではありません。
なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サンプルコード
Public Sub GetFileNames()
'--- ファイル名を知りたいフォルダのパス ---'
Dim folderPath As String
folderPath = "[フォルダのパス]"
'--- ファイル名(ワイルドカードを使用) ---'
Dim fileName As String
fileName = "*"
'--- ファイル数を格納する変数 ---'
Dim i As Long
i = 0
'--- Dir関数の戻り値を格納する変数 ---'
Dim tmp As String
'--- ファイル数をカウント ---'
tmp = Dir(folderPath & "\" & fileName)
Do While tmp <> ""
i = i + 1
tmp = Dir()
Loop
'--- ファイル名を格納する配列 ---'
Dim str() As String
ReDim str(1 To i)
'--- ファイル名を取得 ---'
i = 0
tmp = Dir(folderPath & "\" & fileName)
Do While tmp <> ""
i = i + 1
str(i) = tmp
tmp = Dir()
Loop
End Sub
ファイルシステムオブジェクトを使う
ファイルシステムオブジェクトを使用すると、ダイレクトにファイル名の配列を取得することができるのでシンプルにコードを書くことができます。こちらの方法でも、フォルダ内のファイル数をまず取得して配列を再定義し、その配列に再度ファイル名を割り当てていくという手順を取っているので、Dir関数を使った場合と考え方は同じです。Dir関数を使った場合と比較すると、ループの数が少なくて済むので、こちらの方がややシンプルな書き方と言えます。
こちらも、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サンプルコード
Public Sub GetFileCountFso()
'--- ファイル名を知りたいフォルダのパス ---'
Dim folderPath As String
folderPath = "[フォルダのパス]"
'--- ファイルシステムオブジェクト ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'--- ファイル数を格納する変数 ---'
Dim n As Variant
n = fso.GetFolder(folderPath).Files.Count
If (0 < n) Then
'--- ファイル名を格納する配列 ---'
Dim str() As String
ReDim str(1 To n)
'--- ファイル名を格納 ---'
i = 1
Dim f As Object
For Each f In fso.GetFolder(folderPath).Files
str(i) = f.Path
i = i + 1
Next f
End If
End Sub