- ベストアンサー
再起処理について
お世話になっております。 VBA初心者です。 あるフォルダ以下にあるエクセルファイルに対しパスワードを一括変更するマクロを作成しております。 単一のフォルダに対し処理はできたのですが、配下全てとなると再起処理が必要なようで、いまいち理解できません。 そこで、どのようにしたら目的が果たせるかご教授いただけませんでしょうか。 以上、宜しくお願いいたします。 --------------------------単一のフォルダのソース Sub 同フォルダのみ() Dim myFilename Dim DR Dim MP Dim NP ' 各入力された値を変数にいれる ' (1)passwordがかかっているディレクトリ DR = Range("c4").Value ' (2)元からかかっているパスワード MP = Range("c8").Value ' (3)新しくつける読み込みパスワード NP = Range("c12").Value ' ファイル名 myFilename = Dir(DR & "\*.xls") ' ループ-------------------------ここから Do While myFilename <> "" ' エクセルファイルを開く Workbooks.Open Filename:=DR & "\" & myFilename, Password:=MP ' 新しいパスワード ActiveWorkbook.SaveAs Filename:=myFilename, Password:=NP ActiveWorkbook.Save Application.DisplayAlerts = False 'メッセージを出さない ActiveWorkbook.Close myFilename = Dir() Loop ' ここまで-------------------------ループ End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Dirを単独で使うのでしたら再帰処理には向いていません Dir処理中に新たにパスを与えたDir関数を使うと前の検索パスを破壊します Collectionオブジェクトと併用なら可能でしょう Dim Col as Collection Sub myfunc( sPath as String ) dim ss as string ss = Dir( sPath ) do if ss<>"" then if ss<>"." and ss<>".." then if GetAttr(ss) and vbDirectory then ' 孫フォルダーまでは考えていない col.Add(ss,ss) else ss = LcCse(ss) if right( ss, 4) = ".xls" then ' Excelファイルなら処理 call PasswordChange end if end if end if ss = Dir end if loop while ss<>"" end Sub Sub MainLoop ' コレクションを初期化 col = new Collection call myFunc( "C:\sample" ) if col.count then dim n as integer for n = 0 to col.count-1 call myFunc( col(n) ) next end if End Sub 上記の例では c:\sample\fooやc:\sample\bar などC:\sampleのサブフォルダーまではうまく機能しますが C:\sample\foo\testなど 孫フォルダーなどがあると動作がおかしくなります
その他の回答 (1)
- AKARI0418
- ベストアンサー率67% (112/166)
http://hanatyan.sakura.ne.jp/index.html ファイルシステムオブジェクトを利用してみてください。 再起処理の例も載っていると思います。
お礼
AKARI0418様 ご回答ありがとうございます。 FileSystemObjectを使用してなんとか作り上げることができました。 ご教授ありがとうございました。
お礼
redfox63様 ご回答ありがとうございます。 Dirにこだわらないで、別の方の回答にあるようにFileSystemObjectを利用しようと思います。 ただ、ちょっと考え方が難しくよくわからないので もう少し考えてみようと思います。 ありがとうございました。