- ベストアンサー
複数のエクセルファイルに対してマクロを順次実行する方法
エクセルのマクロについて教えていただきたいです。 以下のような状況なのですが、アドバイスいただけないでしょうか。 ・同一フォルダに100個以上の同じ形式のエクセルファイルがある(ファイル名に規則性はなし) ・各ファイルは2つのシートから成り、そのうちの「データ」というシートに対して処理を適用したい ・適用したい処理のマクロは作成済み なお、適用したい処理というのは、「データ」シートからある値以上のデータの平均を別のエクセルファイル(これは1つのファイル)に記入するという作業で、値を読み込むだけで書き込むことはありません。 このマクロをフォルダ内の全てのエクセルファイルに対して実行したいのですが、可能であれば各エクセルファイルを開かずにマクロを実行したいのです。(100個を越えるファイルを開いたり閉じたりする動作を避けたい) マクロはしっかりと勉強したわけではなく、ネットから情報を集めつつなんとか作っているレベルで、特にファイルの読み書きがよく理解できていません・・・分かりやすいサイトなどがあればそれも教えていただきたいと思っています。 自分でも上手く説明できていないのはわかりますので、もし必要な情報がありましたら付け加えさせていただきます。 分かる方がいらっしゃいましたらどうぞよろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Dir関数に対しもうひとつの方法として、FSOを使う方法がある。 ーー Sub test01() Application.DisplayAlerts = False Application.ScreenUpdating = False Dim objfs Dim objfolder Dim wb Set objfs = CreateObject("scripting.filesystemobject") Set objfolder = objfs.getfolder(CurDir) MsgBox CurDir For Each objfile In objfolder.Files If objfs.getextensionname(objfile) = "xls" Then MsgBox objfile.Name Set wb = Workbooks.Open(objfile) Windows(wb.Name).Visible = False MsgBox wb.Sheets(1).Range("A1") 'ここで、捕まえた1ブックの処理 wb.Close Set wb = Nothing End If Next Application.DisplayAlerts = False Application.ScreenUpdating = False End Sub ーー 上記のCurdirは エクセルの既定のフォルダのことだが、これ以外の場合は、ここで""でフォルダ名を囲んで指定するフォルダ名を入れる。 ---- 上記は各ブックを開く。 Sub test02() Application.DisplayAlerts = False Application.ScreenUpdating = False Dim objfs Dim objfolder Dim wb Dim buf As String Set objfs = CreateObject("scripting.filesystemobject") Set objfolder = objfs.getfolder(CurDir) MsgBox CurDir For Each objfile In objfolder.Files If objfs.getextensionname(objfile) = "xls" Then 'MsgBox objfile.Name 'On Error Resume Next target = "'" & CurDir & "\[" & objfile.Name & "]" & "Sheet1" & "'!R1C1" MsgBox target buf = ExecuteExcel4Macro(target) MsgBox buf End If Next Application.DisplayAlerts = False Application.ScreenUpdating = False End Sub をやると、私の少数例では、スムーズに行く。 質問者の場合も、うまく行くか自信が無い。 上記のSheet1というシート名を「データ」に変えてやってみてください。質問の場合は各ブックで「データ」というシートだから、定数として、指定できるが、Sheets(1)などの名前が各ブックで違うと、お手上げと思う(ただ良い方法があるかも。開かないで第1シート名は、多分取れないだろうと思うが)。 このシート名のシートがその全てのブックに無い場合は、処理が止まるかと思う。 === ExecuteExcel4Macro(target) というのは、使用を勧められる物ではない。 基本的にエクセルは、開いてデータを読んで使うもの。 この点経験も少なく私も手探りだが、情報も少なく、初心者が「エクセルファイルを開かずに・・」なんて言えることではない。 この質問も丸投げで、回答者頼りで、やりたいことだけ勝手に言っているが、こんな課題は初心者には早すぎる課題だと思う。 参考 詳しくは、Googleで「ExecuteExcel4Macro」で照会して勉強のこと。 http://officetanaka.net/excel/vba/tips/tips28.htm
その他の回答 (1)
- hallo-2007
- ベストアンサー率41% (888/2115)
VBA Dir関数でネットで調べてみてください。 指定したフォルダ内にファイルを取得します。 以下は、A1セルでフォルダを指定して、エクセルファイルを順に開いて、閉じます。 Sub Sample1() Dim buf As String, i As Long buf = Dir(Range("A1").Value & "\*.xls") Do While buf <> "" Workbooks.Open Worksheets(1).Range("A1").Value & "\" & buf ここに、やりたいことを記述してください。 Workbooks(buf).Close SaveChanges:=False buf = Dir() Loop End Sub
お礼
簡潔なご回答ありがとうございます! 教えていただいた関数を色々調べてみて知識も多少は吸収できました。 無事今回の作業は片付きましたが、今後に備えてもっと勉強しておきたいと思います。
お礼
おかげ様で無事実行できました! どうしても仕事で急ぎで必要であったため、このように丸投げの質問となってしまいましたが・・・ 今後少しずつ勉強していきたいと思います。 丁寧なご回答ありがとうございました。