- ベストアンサー
複数ファイルにある特定のシートを1つにまとめる方法
- エクセルで複数ファイルにある特定のシートの特定した範囲を1つのファイルにまとめる方法を調べています。
- 1つのワークシートしかない場合の複数ファイルをまとめるマクロは見つけることができました。
- 複数のシートから特定のシートの特定した範囲を1つにまとめる方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> 同じフォルダにあるファイルをコピーしたい場合は > どのコードを直せばいいのでしょうか? あれ、おかしいですね。このマクロは同じフォルダにある全ての*.xlsファイル(自分自身を除く)以外をコピーして、その他のフォルダのファイルはいじらないのですが。 > このままだと関係ないファイルまでコピーしようとして > >Workbooks(FileName).Sheets("B").Range("A1:Z500").Copy > の部分でエラーがでてしまうので・・・。 確認していただきたいのですが、Excelファイルは同じフォルダにコピーするブックと、まとめ用ブック以外にはありませんか? (要は同じフォルダに「B」という名前のシートを持たないファイルがあると、上記の部分でエラーになるのですが、上のマクロはそういうファイルはないという前提なのです) もし同じフォルダにあるはずの「Bシート」を転記する処理がぜんぜん行われてないとなると、強制的にフォルダの位置を指定する、 Chdir "C:\My Documents" という行(フォルダ名は実際のフォルダ名に置きかえてください)を、 FileName = Dir("*.xls") の直前に挿入してみてください。
その他の回答 (5)
- ham_kamo
- ベストアンサー率55% (659/1197)
値で貼り付けですね。するとこういう感じでどうでしょうか。 Sub ブック集合() Dim FileName As String Dim c As Integer Dim OpenedBook As Workbook Dim IsBookOpen As Boolean FileName = Dir("*.xls") Application.ScreenUpdating = False Application.DisplayAlerts = False c = 0 Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If Workbooks(FileName).Sheets("B").Range("A1:Z500").Copy ThisWorkbook.Sheets(1).Cells(c * 500 + 1, 1).PasteSpecial (xlPasteValues) c = c + 1 If IsBookOpen = False Then Workbooks(FileName).Close End If End If FileName = Dir() Loop Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
お礼
ありがとうございます。 助かりました。 最後に 同じフォルダにあるファイルをコピーしたい場合は どのコードを直せばいいのでしょうか? このままだと関係ないファイルまでコピーしようとして >Workbooks(FileName).Sheets("B").Range("A1:Z500").Copy の部分でエラーがでてしまうので・・・。 申し訳ありません。
- ham_kamo
- ベストアンサー率55% (659/1197)
No.3です。補足拝見しました。 > B(Bはみんな同じです)というワークシートのA1:Z500までの > データを新規のブックの1つのワークシートにまとめたいのです。 の「まとめかた」がよくわからないです。「まとめる」というのは「集計する」ではなくて、1つのシートにコピーする、ということでしょうか?3つブックがあって、それぞれのシートBのA1:Z500を、 ブック1→まとめシートのA1:Z500 ブック2→まとめシートのA501:Z1000 ブック3→まとめシートのA1001:Z1500 というように上から転記していけばいいのでしょうか? とりあえず、昨日似たようなマクロを書いたところなので、それを手直ししてみました。 ・まとめブックと同じフォルダ以外にある全ての*.xlsファイルを開き、シートBのA1:Z500をまとめブックの1枚目のシートに上からコピーしていきます。(1つめはA1:Z500にコピー、2つめはA501:Z1000にコピー...) ・開いたブックにBという名前のシートがない場合、マクロがエラーになります。 Sub ブック集合() Dim FileName As String Dim c As Integer Dim OpenedBook As Workbook Dim IsBookOpen As Boolean FileName = Dir("*.xls") Application.ScreenUpdating = False c = 0 Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If Workbooks(FileName).Sheets("B").Range("A1:Z500").Copy _ ThisWorkbook.Sheets(1).Cells(c * 500 + 1, 1) c = c + 1 If IsBookOpen = False Then Workbooks(FileName).Close End If End If FileName = Dir() Loop Application.ScreenUpdating = True End Sub
補足
ありがとうございます。 助かります。 まとめるとは1つのシートにコピーすることです。 しかし、できればまとめブックと同じフォルダにあるファイルの シートBのA1:Z500をまとめブックの1枚目のシートに上からコピー して値を貼り付けという風にしたいのですが・・。 すべて貼り付けにしてしまうとリンクまで張り付いてしまうので。 何度もお手数をおかけしてしまって申し訳ないです・・。
- ham_kamo
- ベストアンサー率55% (659/1197)
えっと、これは複数のブックにある複数のシートから、特定のシートの特定した範囲を1つにまとめたい、ということですか? 具体的な条件(どのシートのどの範囲をどのようにまとめるか)がわからないと適切なアドバイスは難しいですが、上の場合だと、 .Worksheets(1).Copy After:=ThisWorkbook.Worksheets(i%) の部分を、やりたい処理に書き換える必要があります。たとえば、 Dim s As Worksheet For Each s In .Worksheets If sが特定のシート Then sの特定の範囲を、まとめるブックのどこかのシートのどこかのセルコピー End If Next みたいな処理が入るかと。
補足
早速の回答ありがとうございます。 上の場合だとシートのコピーになってしまうのですが やりたいことはAからZまでのブックの B(Bはみんな同じです)というワークシートのA1:Z500までの データを新規のブックの1つのワークシートにまとめたいのです。 ブック名はそれぞれですが、シート名と範囲は一緒です。 はよくてその後は書き換えないといけないかなと・・・。 それがまったくわからないんです・・。 上の質問のマクロはテストで実行してみましたが エラーが出てできませんでした・・。 再度探してこのマクロだと最後まで実行できました。 しかし、シートごとのコピーなのでやりたいこととは 違います・・。 Sub ブック集合() Dim Wb As Workbook Dim Fname As Variant Dim i As Integer, j As Integer j = ThisWorkbook.Sheets.Count Fname = Application.GetOpenFilename("EXCELファイル(*.xls), *.xls", , , , True) If Not IsArray(Fname) Then Exit Sub Application.ScreenUpdating = False For i = 1 To UBound(Fname) Workbooks.Open (Fname(i)) Set Wb = ActiveWorkbook With ThisWorkbook Wb.Sheets(1).Copy , After:=.Sheets(.Sheets.Count) End With Wb.Close Next Application.DisplayAlerts = False For i = 1 To j ThisWorkbook.Sheets(i).Delete Next Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
- Nouble
- ベストアンサー率18% (330/1783)
おっと! シート全体ではなのですね 失礼しました <(_ _)>
- Nouble
- ベストアンサー率18% (330/1783)
マクロでないとだめなのですか? 保存先と移動元のブックを開いて 両ブック中でシート名の名前のダブりがないように調整して 移動元の移動させるシートのタブを右クリック 出てきたメニューの中から「移動またはコピー」を選択 出てきたウインドウの上方「移動先ブック名」のプルダウンから保存先ブック名を選択 その下方「保存先」より保存先ブック内でのシートの位置を選択 最下方「コピーを作成する」にチェックが入ってない状態のまま 「Ok」をクリックすると シートが移動します 以上を必要数繰り返せばまとめられますが これでは駄目ですか?
お礼
ありがとうございます。 できました! このような作業をする場面が多いのでとても助かりました。m(__)m