| 
    
     |  | ▼ミーコ さん: こんにちは。
 ▼neptune さん、横入り失礼しますm(_ _)m
 > ▼neptune さん:
 >
 > チャレンジしてみましたが、難しすぎて手に負えませんでした。
 > VBAを学び始めてからまだ期間が浅いもので。
 >
 > X = Dir("C:\Documents and Settings\AAA\", vbDirectory)
 > Y = Dir(X & "*.xls")
 >
 > Do While Y <> ""
 >  処理
 >  Y = Dir()
 > Loop
 
 あるフォルダ内の*.xlsファイルだけリストをとるのなら、
 VBAの 「Dir関数」のLoopが簡単ですが、
 サブフォルダもいっしょに、となると、いわゆる再帰処理
 を書かないといけないので初心者にはすこし難しいです。
 
 ところが、
 同じ Dir でも、DOS-プロンプトの「DIRコマンド」を使うと
 これがパラメータ /s を使うだけで、サブディレクトリ内の
 ファイルも同時に検索してくれます。
 しかも高速に(^^
 
 スタートメニュ−の[コマンドプロンプト]で
 dir "C:\Documents and Settings\AAA\*.xls" /s /b /o:D
 とタイプして[Enter]してみてください。
 画面に
 C:\Documents and Settings\AAA\ 直下とサブディレクトリ内の
 すべての*.xlsファイルがリストされるはずです。
 /のあとにオプションを
 /s が サブディレクトリも検索するオプション
 /b は ファイルのみ表示するオプション(日付やサイズは表示しない)
 /o はファイルリストの表示順を指定するオプションで、
 /o:N とすると、ファイル名順、
 /o:S とすれば、ファイルサイズの小さい順、
 /o:-S とすると、サイズの大きい順(降順)、
 /o:D なら Date順つまり古い方から、
 /o:-D なら 新しい更新日時順
 など、
 指定することにより、Dir関数や Fso では難しかった
 サブディレクトリの検索やファイルリストの指定順でソートなど
 パラメータをセットするだけで、やってくれますので、
 これを利用しない手はないと思います。
 
 ただ、
 DOS窓にリストされても、Excelに取り込みようがないので、
 dir "C:\Documents and Settings\AAA\*.xls" /s /b /o:D >"C:\dirList.txt"
 のようにすると、画面に表示する代わりに > のあとに指定した
 ファイルに書き出してくれます。
 
 以上のことを確認されたら、それをVBA上で実行して
 指定フォルダの(サブフォルダも含めた)*.xlsファイルの
 リストが取得できるように、DIRコマンドをつかうマクロを
 書いてみましょう。
 ↓こんな感じです。(エラー処理は入れてません。)
 
 '------------------------------------ 標準モジュール
 Option Explicit
 Sub Try1()
 Dim i As Long
 Dim fList() As String
 
 ''検索パスとファイル拡張子を指定してSubDir付き検索
 fList = SubDir("C:\Documents and Settings\AAA\*.xls")
 
 For i = 0 To UBound(fList)
 Debug.Print fList(i)
 Next
 
 End Sub
 
 'サブフォルダを含むファイルの検索(ファイルリストを返す)
 Private Function SubDir(Filename As String) As String()
 Dim v
 Dim tmpPath As String
 Dim sCmd As String
 Dim ko As Long
 
 tmpPath = Environ$("Temp") & "\Dir.tmp"
 sCmd = "DIR """ & Filename & """ /b/s /o:N > """ _
 & tmpPath & """"
 With CreateObject("WScript.Shell")
 ko = .Run("CMD /C " & sCmd, 7, True) 'Dirコマンド実行
 End With
 
 Dim io As Integer
 Dim buf() As Byte
 io = FreeFile()
 Open tmpPath For Binary As io '出力ファイルリスト取得
 ReDim buf(1 To LOF(io))
 Get #io, , buf
 Close io
 Kill tmpPath
 SubDir = Split(StrConv(buf, vbUnicode), vbCrLf)
 End Function
 '--------------------------------------------------
 上は
 Dir検索結果得られたフィル名リストをイミディエイト・
 ウィンドウに表示しているだけですが、
 
 >   Debug.Print fList(i)
 
 ここを
 
 Set Wb = Workbooks.Open(fList(i))
 '開いたファイルに対する処理 〜〜〜 〜〜〜
 Wb.Close SaveChanges:=True
 Set Wb = Nothing
 
 のように、処理を追加していけばいいでしょう。
 
 |  |