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