|    | 
     ▼ミーコ さん: 
こんにちは。 
▼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 
 
のように、処理を追加していけばいいでしょう。 
 
 | 
     
    
   |