ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

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

セル緑色のところは、自由に処理内容を記述して活用してください。

サンプルのファイルがありますので、以下のリンクよりダウンロードしてご利用ください。

サンプルVBAファイル ダウンロード

<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 に一致する追加のファイル名を取得することができます。
ファイル名は、昇順など特定の順序で取得されるわけではありません。

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
データを快速で検索するには 《Find》
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》
twitter hatena line pocket