• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel マクロで複数ブックのデータを一つのブックにまとめる方法)

Excelマクロで複数ブックのデータを一つのブックにまとめる方法

このQ&Aのポイント
  • マクロ初心者の方が、複数のExcelブックのデータを1つのブックにまとめたい場合の方法を教えてください。
  • 最初のマクロで全てのシートがコピーされてしまう問題と、ブックごとに保存の確認が表示される問題を解決するには、どの部分を変更すれば良いでしょうか?
  • 使用しているExcelのバージョンは2002です。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

やれやれ、注文が多いですねえ(笑) では、他のシートを参照している式は値に、同一シート内のみを参照する式は残します。但し、他シート参照の有無は式に”!”を含むかどうかで判定しますので、「名前定義」された他シートのセル参照の場合はそれが他シートなのか同じシートなのか判定できないので残ってしまいます。 Sub Consolid03() Dim mb As Workbook, wb As Workbook Dim myfdr As String, fname As String, n As Integer Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.ActiveSheet.Copy After:=mb.Sheets(mb.Sheets.Count) '開いたシートをコピーしてmbの末尾に置く wb.Close (False) '有無を言わずに保存せず閉じる For Each c In mb.Sheets(mb.Sheets.Count).UsedRange '取り込んだシートの使用範囲に If c.FormulaR1C1 Like "=*!*" Then '他シート参照があれば c.Value = c.Value '値に変更 End If Next mb.Sheets(mb.Sheets.Count).Protect Password:="merlionXX" 'パスワード保護 n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox "わがままな " & UCase(Environ("UserName")) & "さん、" & n & "件のブックをコピーしましました。" _ + Chr(&HD) + Chr(&HA) + "他シートを参照する式だけは値にしておきましたよ。" _ + Chr(&HD) + Chr(&HA) + "" _ + Chr(&HD) + Chr(&HA) + "取りこんだシートにパスワード保護もかけておきましたよ。", , "( ̄ー ̄)v " End Sub

dorikin
質問者

お礼

できました! 完璧です! ありがとうございました。 また、何度も何度もすいませんでした。

その他の回答 (3)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

では、コピーされたシートにある式はすべて値に変えてみました。 Sub Consolid02() Dim mb As Workbook, wb As Workbook Dim myfdr As String, fname As String, n As Integer Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.ActiveSheet.Copy After:=mb.Sheets(mb.Sheets.Count) '開いたシートをコピーしてmbの末尾に置く wb.Close (False) '有無を言わずに保存せず閉じる mb.Sheets(mb.Sheets.Count).Cells.Copy '取り込んだシートをコピー mb.Sheets(mb.Sheets.Count).Cells.PasteSpecial Paste:=xlValues 'そのまま値で貼り付け(式を消す) Application.CutCopyMode = False n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox UCase(Environ("UserName")) & "さん、" & n & "件のブックをコピーしましました。" _ + Chr(&HD) + Chr(&HA) + "式は消して値にしておきましたよ。", , "(〃^∇^)o" End Sub

dorikin
質問者

補足

さっそくのご回答ありがとうございます。 ですが・・・すいません。。 リンクしていない式が消えてしまうのは困ります。。。 また、複数人に配布するエクセルですので、シートの保護をかけようと思っています。 参照先がbook内の式だけはそのままで、リンクの式だけを消す あるいは 編集→リンクの設定→リンクの解除 のようなことはできないでしょうか? 何度も何度も申しわけありません。。。

  • suz83238
  • ベストアンサー率30% (197/656)
回答No.2

sheetは「bookを開いた時に表示されるsheetだけ」→これはVBAで分からない。 シートの名前とかセルのどこに何が書いてあるシートとかの分岐ができなければ全部読むしかありません。 たとえば、ブック毎にシートが違うとすれば、それをブックとシート名のデータをあらかじめ作っておき、それを読んで作ることはできます。 >保存しますか?とbookごとに聞いてきます これは、Application.ScreenUpdating = Falseの下にApplication.DisplayAlerts = False を入れればOKです。 下のApplication.ScreenUpdating = True Application.DisplayAlerts = True を入れることを忘れずに。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

どこかで見たような・・・と思ったら、わたしが書いたコードじゃないですか。 http://okwave.jp/qa2198774.html ですね。 では、開いたBOOKのアクティブなシートだけをコピーします。 保存を聞かず、保存しないで開いたBOOKを閉じます。 Sub consolid() Application.ScreenUpdating = False '画面更新を一時停止 Set mb = ThisWorkbook 'このコピー先ブックをmbとする。 myfdr = ThisWorkbook.Path fname = Dir(myfdr & "\*.xls") 'フォルダ内のExcelブックを検索 Do Until fname = Empty '全て検索 If fname <> mb.Name Then 'ブック名がこのブックの名前でなければ Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのブックを開きwbとする。 wb.ActiveSheet.Copy After:=mb.Sheets(mb.Sheets.Count) 'コピーしてコピー先ブックの末尾に置く wb.Close (False) '保存の有無を聞かずに保存しないで閉じる n = n + 1 'ブック数をカウント End If fname = Dir 'フォルダ内の次のExcelブックを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件のブックをコピーしましました。" End Sub

dorikin
質問者

補足

す・すごい! できました!ありがとうございました。 ただ1つだけ・・・ sheetとsheetの間のリンク貼付をしていた部分が、そのままbook間のリンクになってしまいます。 マクロで同時にリンクの解除というのは難しいのでしょうか? ps 元々merlionXXさんが作られたマクロなのですね。 非常に親切で使いやすいですね。

関連するQ&A