• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA フォルダ内ファイルにマクロ一括処理)

VBAでフォルダ内のファイルを一括処理する方法

このQ&Aのポイント
  • VBAを使い、フォルダ内の全ファイルにマクロを一括で実行したいという要望がある。
  • 特定のシート名に基づいてセルの値を貼り付けるマクロを作成しているが、一つのファイルのみが処理される問題に悩んでいる。
  • 他のマクロは正常に動作するが、「値貼り付け」マクロだけが全ファイルで機能しない理由が不明で、情報を探している。

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

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (446/612)
回答No.1

マクロ呼び出しが1つだけ処理されて返ってこない理由は追及していませんが、これくらいの処理であれば、呼び出し側で処理した方が早いのではないかと思います。 気になるのは『「★」以外のシートを選択』で、対象シートが複数あってもForで回した最後のシートだけが処理されることになりますが、それで合ってます? 対象シートは1つしかないのかな。 Sub 一括処理() Dim Fpath As String Dim Fname As String Dim Wb As Workbook Fpath = ThisWorkbook.Path & "\" Fname = Dir(Fpath & "*.xlsm") Do Until Fname = "" If Fname <> ThisWorkbook.Name Then Application.DisplayAlerts = False 'ブックを開く Set Wb = Workbooks.Open(Fpath & Fname) 'シート名1文字目が「★」以外のシートを選択 Dim i For Each i In Wb.Sheets If Not i.Name Like "★*" Then i.Activate End If Next i '全セル選択 Cells.Select 'コピー Selection.Copy '値貼り付け Selection.PasteSpecial Paste:=xlPasteValues Cells(1, 1).Select Sheets(1).Select '「.xlsx」で保存 Wb.SaveAs Wb.Path & "\" & Replace(Wb.Name, ".xlsm", "保存.xlsx"), FileFormat:=xlWorkbookDefault Wb.Close SaveChanges:=True Application.DisplayAlerts = True End If Fname = Dir() Loop End Sub

numberbear
質問者

お礼

この度は返信ありがとうございました。 本日会社でアドバイス頂、いたコードで無事やりたいことが 実行出来ました。 呼び出し側で処理するという方向性に全く意識がなく、別の 方向性を示して頂けたことで解決に結びつきました。 対象シートは複数ある為(ファイルによりシート数は可変) 『「★」以外のシートを選択』を書いてました。 単独のファイルでマクロ実行する分には、最後のシートだけでなく 全てのシートで値貼り付けが出来ていました。 今週ずっとこのマクロで悩んでいましたので、とても助かりました。 ありがとうございました。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率66% (1737/2609)
回答No.3

回答No.2の追加です。 両方でCloseしてるからおかしくなっていると回答しましたが Sub 値貼り付け() で .Close した時点でマクロ事態(呼び出した方も)が終了してます。 以下のような感じでCloseがEndの役割 Sub Test1() Test2 MsgBox "test1" End Sub Sub Test2() MsgBox "test2" End MsgBox "EEE" End Sub ですので Sub 値貼り付け() の .Close をやめたら次々と一括実行されると思います。

numberbear
質問者

お礼

この度はご回答ありがとうございました。 デバックでコードをチェックしていた際に、マクロが終了 してしまう原因が分かりました。 今回記載したコードは検索して見つけたものを、自分で やりたいことに合わせて書き換えたもので、きちんと コードの意味を知ることが必要だと痛感しました。 マクロはまだ使い始めたばかりで、ご返信は大変参考に なりました。 新しい職場の業務改善の為に、まだまだこれからなので 勉強していきたいと思います。

  • kkkkkm
  • ベストアンサー率66% (1737/2609)
回答No.2

Sub 値貼り付け() で .Close して Sub 一括処理() で Wb.Close SaveChanges:=True としているのでおかしくなるのだと思います。 Sub 値貼り付け() の .Close をやめてみてはいかがでしょう。

関連するQ&A

専門家に質問してみよう