• ベストアンサー

再起処理について

お世話になっております。 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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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など 孫フォルダーなどがあると動作がおかしくなります

testAdmin
質問者

お礼

redfox63様 ご回答ありがとうございます。 Dirにこだわらないで、別の方の回答にあるようにFileSystemObjectを利用しようと思います。 ただ、ちょっと考え方が難しくよくわからないので もう少し考えてみようと思います。 ありがとうございました。

その他の回答 (1)

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.2

http://hanatyan.sakura.ne.jp/index.html ファイルシステムオブジェクトを利用してみてください。 再起処理の例も載っていると思います。

testAdmin
質問者

お礼

AKARI0418様 ご回答ありがとうございます。 FileSystemObjectを使用してなんとか作り上げることができました。 ご教授ありがとうございました。

関連するQ&A