即効テクニック |
ファイルが存在するかどうかを調べるにはDir関数を使います。 次のコードは、C:\Sample\Book1.xlsが存在するかどうかを判定します。Sub Sample1() If Dir("C:\Sample\Book1.xls") <> "" Then MsgBox "存在します" Else MsgBox "存在しません" End If End SubDir関数は、引数に指定したファイルが存在すると、そのファイル名を返し、存在しないと空欄を返します。 また、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 Sub2行目の「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