- ベストアンサー
VBAで複数のファイルを一つにまとめる方法
- VBA初心者の方がExcel2010を使用して複数のファイルを一つにまとめる方法について質問されています。
- 指定したフォルダ内の複数のファイルにある特定のシートを一つのシートにまとめる方法を教えて欲しいという相談です。
- 参考URLのサイトで見つけたVBAのコードを使ってファイルをダイアログから選択する形ではなく、指定したファイルで実行したいとしています。また、フォルダ名が毎月変わるため、同じフォルダ内のデータをまとめたいと考えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>これを、ファイルを指定した状態で実行させたいと思い、 『指定した状態』とは? たとえば下記のマクロを書いてあるBook、 つまりThisWorkbookを開いた状態でマクロを実行する、という解釈で良いでしょうか? 以下、サンプルです。 ※集約したい特定のシートのシート名は共通だと解釈してConst sName = "DATA"の箇所で指定するようにしています。 マクロ内容としては 1)GetOpenFilenameダイアログで複数Bookをまとめて選択します。 2)選択したファイルを順次開いて処理後閉じます。 3)ThisWorkbookにシートを追加してそこに集約します。 Sub try() Const sName = "DATA" '特定のシートのシート名に変更必要。 Dim dest As Range Dim r As Range Dim x, ary, ar On Error GoTo errout '取得するBookをCtrl+クリックでまとめて選択。 x = Application.GetOpenFilename("XLfiles,*.xl*", MultiSelect:=True) If VarType(x) = vbBoolean Then MsgBox "cancel": Exit Sub Application.ScreenUpdating = False If IsArray(x) Then ary = x Else ReDim ary(0) ary(0) = x End If 'このマクロが書いてあるBookにSheetを追加して集約。 _ あるSheetに変更するなら差替え必要。 Set dest = ThisWorkbook.Worksheets.Add.Range("A1") 'Set dest = ThisWorkbook.Worksheets("集約").Range("A1") 'dest.Worksheet.UsedRange.Clear '"集約"シートの既存クリアが必要な場合。 For Each ar In ary With Workbooks.Open(ar, ReadOnly:=True) On Error Resume Next Set r = .Sheets(sName).UsedRange On Error GoTo errout If Not r Is Nothing Then dest.Value = ar Set r = Excel.Range(r.Worksheet.Range("A1"), r.Item(r.Count)) r.Copy dest.Offset(, 1) Set dest = dest.Offset(r.Rows.Count) Set r = Nothing End If .Close False End With Next errout: Application.ScreenUpdating = True With Err If .Number <> 0 Then MsgBox .Number & "::" & .Description End If End With End Sub dataシートを列いっぱい使っていたらエラーになります。 その他、同名Bookを既に開いていてOpenをキャンセルするとエラーになります。 そういったエラー対策は無しで、メッセージもExcelに任せてます。 必要であれば工夫してみてください。
お礼
end-u様、ありがとうございます。 教えていただいたコード、早速試して見ました。 説明が下手であった為、残念ながら私の意図する 動作ではありませんでした。ただ、内容を1つずつ 紐解いていくと、すごく勉強になる内容でした。 今回、私がしようとしていることは少し複雑というか 説明が難しくてなかなか伝えきれないもどかしさが あります。なので、end-u様から教えて頂いた内容を 利用させていただきながら、なんとか自分で解決して いきたいと思います。ありがとうございました!