No.012
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
2003/2007/2010/2013
フォルダーに入っているブックに同じ処理を行う場合こそ、VBAはとても役に立つと感じるものです。
今回使用する構文は、Do~Loop の繰り返し構文と、Dir関数を使用します。
では、Dir関数についてご紹介します。
Dir関数は、簡単に言うと引数に一致するファイル名やフォルダー名を文字列で返す関数です。もう少し詳しくは、下記<ヘルプmemo>を見てください。
そして今回、Dir関数が引数に一致するファイル名を最初に返した後、次にDir関数を引数省略で使用すると、「引数を引き継ぎ、一度返したファイル名と同じファイル名は返さない」という特徴的な性質をうまく利用しつつ、Loop することで、フォルダー内のすべてのファイルを処理していくことができます。
では、簡単な構造を下記に記しておきます。
以下は、「D¥test¥ 配下のブックをすべて開いて処理する。」という内容です。
わかりやすく、変数名を日本語にしています。
Sub ブックをすべて開いて処理()
Dim パス As String, ファイル As String
パス = "D:¥test¥"
ファイル = Dir(パス & "*.xlsx") 'パス配下拡張子「.xlsx」の最初のファイル名を返す
Do While ファイル <> "" 'Dir関数がファイル名を返さなくなるまで繰り返す
Workbooks.Open パス & ファイル 'ファイル名のブックを開く
ブック処理内容の記述 '開いたブックで処理をする
Workbooks(ファイル).Close 'ブックを閉じる
ファイル = Dir '引数なしDir …引数を引き継いだ次のファイル名を返す
Loop
End Sub
上記の記述で、いくつかポイントをあげてみます。
最初に登場するDir関数、引数の設定でワイルドカードが指定できます。
これによって、ファイルの名前や拡張子などを特定して探すことができる、例えば同じフォルダー内のブックでも合致しない場合は対象としないようにできます。
もう1つ、Dir関数の引数には、パスを含むファイル名を指定しますが、Dir関数の答えはパスなしのファイル名です。
したがって、Dir関数で返したファイルを開くような場合は、パスを指定する必要があります。
最後にもう1つ、Dir関数が引数を引き継ぎつつ別のファイル名を返し、最後にもう該当がなくなった場合は、空白("")を返します。
それがLoop構文の条件となっています。
では、以下に簡単なサンプルをご用意いたします。
処理内容は、D:¥test¥フォルダー内ファイル名「A」から始まるブックの1行目に色を付けて保存して閉じます。
Sub Sample()
Dim myPath As String, myBook As String
myPath = "D:¥test¥"
myBook = Dir(myPath & "A*.xlsx")
Do Until myBook = ""
Workbooks.Open myPath & myBook
Worksheets(1).Rows(1).Interior.Color = 5287936 'セル緑色
Workbooks(myBook).Close SaveChanges:=True '保存して閉じる
myBook = Dir
Loop
End Sub
セル緑色のところは、自由に処理内容を記述して活用してください。
サンプルのファイルがありますので、以下のリンクよりダウンロードしてご利用ください。
<Dir関数>
指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、フォルダーの名前、またはドライブのボリューム ラベルを表す String を返します。
構文: Dir [ (pathname, [ attributes ] ) ]
引数:
pathname …ファイル名を指定する文字列式[省略可]
attributes …ファイル属性を指定する定数または数式を指定[省略可]
値 / 定数
0 / vbNormal(規定) …属性のないファイル
1 / vbReadOnly …属性のないファイルと読み取り専用のファイル
2 / vbHidden …属性のないファイルと隠しファイル
4 / vbSystem …属性のないファイルとシステム ファイル、Mac版では使用不可
8 / vbVolume …ボリューム ラベル、Mac版では使用不可
16 / vbDirectory …属性のないファイルとディレクトリまたはフォルダー
64 / vbAlias …指定されたファイル名はエイリアス、Mac版でのみ使用可
ヒント:
pathname が見つからない場合は、長さ 0 の文字列 ("") が返されます。
引数を省略して Dir を再度呼び出すことで、pathname に一致する追加のファイル名を取得することができます。
ファイル名は、昇順など特定の順序で取得されるわけではありません。