• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでご相談です!)

VBAで複数のファイルを一つにまとめる方法

このQ&Aのポイント
  • VBA初心者の方がExcel2010を使用して複数のファイルを一つにまとめる方法について質問されています。
  • 指定したフォルダ内の複数のファイルにある特定のシートを一つのシートにまとめる方法を教えて欲しいという相談です。
  • 参考URLのサイトで見つけたVBAのコードを使ってファイルをダイアログから選択する形ではなく、指定したファイルで実行したいとしています。また、フォルダ名が毎月変わるため、同じフォルダ内のデータをまとめたいと考えています。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.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に任せてます。 必要であれば工夫してみてください。

-antsu-
質問者

お礼

end-u様、ありがとうございます。 教えていただいたコード、早速試して見ました。 説明が下手であった為、残念ながら私の意図する 動作ではありませんでした。ただ、内容を1つずつ 紐解いていくと、すごく勉強になる内容でした。 今回、私がしようとしていることは少し複雑というか 説明が難しくてなかなか伝えきれないもどかしさが あります。なので、end-u様から教えて頂いた内容を 利用させていただきながら、なんとか自分で解決して いきたいと思います。ありがとうございました!

関連するQ&A