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

即効テクニック

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

サブフォルダの一覧を取得する

(Excel 97/2000/2002/2003/2007)
ファイルが存在するかどうかを調べるにはDir関数を使います。
次のコードは、C:\Sample\Book1.xlsが存在するかどうかを判定します。

Sub Sample1()
  If Dir("C:\Sample\Book1.xls") <> "" Then
    MsgBox "存在します"
  Else
    MsgBox "存在しません"
  End If
End Sub   
Dir関数は、引数に指定したファイルが存在すると、そのファイル名を返し、存在しないと空欄を返します。 また、Dir関数には「*」や「?」のワイルドカードを指定できます。 ワイルドカードを指定し、該当するファイルが複数存在した場合は、Dir関数は、見つかったファイルをすべて順番に返します。 次のコードは、C:\Sampleフォルダに存在するすべての「*.xls」をイミディエイトウィンドウに表示します。
Sub Sample2()
  Dim buf As String
  buf = Dir("C:\Sample\*.xls")
  Do While buf <> ""
    Debug.Print buf
    buf = Dir()
  Loop
End Sub   
2行目の「buf = Dir("C:\Sample\*.xls")」で1回目の検索を行い結果を変数に入れます。 Dir関数の結果が空欄になるまでDo Loopで繰り返しを行います。 このとき「Dir()」のように、Dir関数の引数を省略すると、前回のDir関数で指定したのと同じ引数が指定されたものとみなされ、すでに見つかったファイルは検索されません。 ファイルの一覧を取得するのに便利なDir関数ですが、ではサブフォルダの一覧を取得するにはどうしたらいいでしょう。 実はDir関数には、検索するファイルの種類を指定する引数があり、サブフォルダだけを検索の対象とすることができます。次のコードで試してみましょう。
Sub Sample3()
  Dim buf As String
  buf = Dir("C:\Sample\*", vbDirectory)
  Do While buf <> ""
    Debug.Print buf
    buf = Dir()
  Loop
End Sub   
実行してみると、サブフォルダだけではなく、すべてのファイルまで表示されてしまいます。 Dir関数でサブフォルダだけを取得するには、ファイルのパターンとして指定するワイルドカードを「*」や「*.*」ではなく「*.」と指定します。
Sub Sample4()
  Dim buf As String
  buf = Dir("C:\Sample\*.", vbDirectory)
  Do While buf <> ""
    Debug.Print buf
    buf = Dir()
  Loop
End Sub   
実行すると、C:\Sampleフォルダ内のサブフォルダ一覧が取得できますが、ほかにも「.」と「..」という変な記号も見つかりました。 「.」と「..」はMS-DOS時代から使われているフォルダの相対位置を表す記号で、「.」が自分自身のフォルダ(ここではC:\Sample)を表し、「..」は親フォルダ(ここではC:\)を表しています。 HTMLでファイルの位置を相対的に表すとき「../Sample/Test.html」などと記述しますが、それと同じ理屈です。 Dir関数でサブフォルダだけを取得するときには、このように「.」と「..」も検索結果に含まれますので、次のように除外するといいでしょう。
Sub Sample5()
  Dim buf As String
  buf = Dir("C:\Sample\*.", vbDirectory)
  Do While buf <> ""
    If buf <> "." And buf <> ".." Then Debug.Print buf
    buf = Dir()
  Loop
End Sub