- ベストアンサー
エクセルファイルの結合方法と注意点
- エクセルファイルの結合方法や注意点について紹介します。同じフォーマットで作られた100個以上のエクセルファイルを1つのファイルに結合する方法について解説します。
- エクセルファイルの結合は手作業で行うと面倒な作業ですが、コンピュータを使用すれば簡単に行うことができます。エクセル2010で作成されたファイルに限り、拡張子が「xlsx」であることが条件となります。
- 手作業でエクセルファイルを結合する場合は、1つのファイルを基にして他のファイルの内容を切り取り貼り付けする必要があります。しかし、100個以上のファイルを結合する作業は非効率です。コンピュータを活用して、自動的に結合させる方法を使うことをおすすめします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
対象ファイルは全数拡張子がxlsxで、 >リストがある行を全選択して これは1枚目のシートで、 A1セルから右下方向に広がり、 リスト範囲の1行目、1列目には空白行が無いという条件でよければ 次のようなコードでいかがでしょうか。 このコードを含むマクロブックは ファイル群と同じフォルダーに配置して実行してください。 Sub Macro1() Dim buf As String Dim MyPath As String Dim FBook As Workbook Dim FSheet As Worksheet Dim TSheet As Worksheet Dim TRow As Long Application.ScreenUpdating = False MyPath = ThisWorkbook.Path & "\" Set TSheet = ThisWorkbook.Sheets(1) TSheet.Cells.Clear buf = Dir(MyPath & "*.xlsx") Do While buf <> "" Set FBook = Workbooks.Open(MyPath & buf) Set FSheet = FBook.Sheets(1) If TSheet.Cells(1, 1).Value = "" Then TRow = 1 Else TRow = TSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1 End If FSheet.Range("A1").CurrentRegion.Copy _ TSheet.Cells(TRow, 1) FBook.Close buf = Dir() Loop Application.ScreenUpdating = True End Sub
その他の回答 (7)
- SI299792
- ベストアンサー率47% (774/1619)
自分の事しか考えない人ですね。他の質問には答えてもらっていません。超能力で解れという事ですか。それとも、私の質問の意味が解らなかったでしょうか。仕方がないので、前回同様1行目から結合としました。 後、フォルダか決まっていない、その都度選択できるようにしたいのなら、最初からそう書いて下さい。書いてないと判りません。 ' Option Explicit ' Sub Macro1() ' Dim Path As String Dim I As Worksheet Dim FileName As String Dim ROut As Long Dim RCnt As Long ' With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then Path = .SelectedItems(1) & "\" End If End With ' Set I = ThisWorkbook.ActiveSheet FileName = Dir(Path & "*.xls") ROut = 1 ' While FileName > "" Workbooks.Open Path & FileName, ReadOnly:=True RCnt = Cells(Rows.Count, "A").End(xlUp).Row [1:1].Resize(RCnt).Copy I.Cells(ROut, "A").Resize(RCnt) ROut = ROut + RCnt ActiveWindow.Close False FileName = Dir Wend End Sub 例えば、図のような表であれば、1、2行目を結合したらまずいわけです。また、A列にデータがないので、データの有無をB列で判断する必要があります。だから何行目から、何列から何列までなのか聞きたいのです。(何行目までは決まっていなくていいです)
- SI299792
- ベストアンサー率47% (774/1619)
すみません、フォルダは >特定しません。 ということは、ダイアログボックスを開いて、フォルダを選択するということでしょうか。 それとも、このマクロを入れたワークブックと同じフォルダでいいのですか。 何行から始まっているのか、これは説明不足でした。 終了行でなく、開始行を聞きたかったのです。(終了行は決まっていないのが普通です) 普通、1行目がタイトルで2行目は項目名なので、3行目から結合させたいとかあります。 それとも、1行目から結合させればいいのですか。 後列、はとこからどこまでですか(前回聞き忘れました) 同じフォーマとなら、A列~Z列など、列は決まっているはずです。
お礼
回答ありがとうございます。 >>ダイアログボックスを開いて、フォルダを選択するということでしょうか その通りです。
- nishi6
- ベストアンサー率67% (869/1280)
この質問で気になるのは、 >1.100個のファイルから、基本となるファイル1つを開きます。 次回から開くBookは基本となるBookと異なる必要があります。 >2.開いたファイルの中には、リストがありその末尾を表示させます。 ファイルを結合するのに、末尾の表示は不要でしょう。 >4.リストがある行を全選択して、「切り取り」します。 切り取りよりコピーでしょうか。 >5.画面を基本ファイルにして、リストの末尾の行を選択 貼り付けるのは、末尾+1行でしょう。 一番問題なのはフォーマットが分からないことで、1行目に表題があり、2行目から連続的にデータが入力されているとしました。 また、表題はあるものの、2行目のデータがないと、おかしなことになります。これは、基本となるファイルと2回目以降の処理で発生する可能性があります。一応対応しています。 コードは新規のブックの標準モジュールに貼り付けます。実情に合うように、 xlsxPath Bookがあるフォルダー fstBook 最初のBook名 shtName データがあるシート名 Top = "A1" データ範囲の左上セル(表題) をセットしてください。 指定した最初のBook名のBookに結果が表示されます。6Bookでテストしました。ご参考に。当方、win10、Excel2010です。 Sub joinBook() Dim wbName As String '// 2つ目以降のデータBook Dim ws As Worksheet '// データのあるSheet Dim xlsxPath As String '// Bookがあるフォルダー Dim fstBook As String '// 最初のBook名 Dim shtName As String '// データがあるシート名 Dim Top As String '// データ範囲の左上セル Dim LstRow As Long '// 最後の行 Dim maxRow As Long '// データブックの最大の行 '// 設定(重要) xlsxPath = "N:\履歴\Work_xlsx" fstBook = "DataBook000.xlsx" shtName = "Sheet1" Top = "A1" Application.ScreenUpdating = False '// 最初のBookを開く Workbooks.Open xlsxPath & "\" & fstBook Worksheets(shtName).Activate LstRow = ActiveSheet.Range(Top).End(xlDown).Row - 1 If LstRow + 1 = Rows.Count Then LstRow = 0 End If wbName = Dir(xlsxPath & "\" & "*.xlsx") While wbName <> "" '// 最初のBookでない If wbName <> fstBook Then Workbooks.Open xlsxPath & "\" & wbName Worksheets(shtName).Activate ActiveSheet.Range(Top).CurrentRegion.Select '// データがあれば If Selection.Rows.Count > 1 Then Selection.Offset(1, 0).Select Selection.Resize(Selection.Rows.Count - 1).Select Selection.Copy Workbooks(fstBook).Worksheets(shtName).Range(Top).Offset(LstRow + 1, 0).PasteSpecial LstRow = LstRow + Selection.Rows.Count End If Application.DisplayAlerts = False Workbooks(wbName).Close Application.DisplayAlerts = True End If wbName = Dir() Wend Application.ScreenUpdating = True End Sub
- HohoPapa
- ベストアンサー率65% (455/693)
#4追記です。 1行目がタイトル行なら以下のようなコードです。 Sub Macro2() Dim buf As String Dim MyPath As String Dim FBook As Workbook Dim FSheet As Worksheet Dim TSheet As Worksheet Dim TRow As Long Application.ScreenUpdating = False MyPath = ThisWorkbook.Path & "\" Set TSheet = ThisWorkbook.Sheets(1) TSheet.Cells.Clear buf = Dir(MyPath & "*.xlsx") Do While buf <> "" Set FBook = Workbooks.Open(MyPath & buf) Set FSheet = FBook.Sheets(1) If TSheet.Cells(1, 1).Value = "" Then TRow = 1 FSheet.Range("A1").CurrentRegion.Offset(0, 0).Copy _ TSheet.Cells(TRow, 1) Else TRow = TSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1 FSheet.Range("A1").CurrentRegion.Offset(1, 0).Copy _ TSheet.Cells(TRow, 1) End If FBook.Close buf = Dir() Loop Application.ScreenUpdating = True End Sub
お礼
回答ありがとうございます。 ためしてみます
- SI299792
- ベストアンサー率47% (774/1619)
もう少し情報が欲しいです。 フォルダはどこか。 何行から始まっているのか、ヘッダーは何行からか。 ' Option Explicit ' Sub Macro1() ' Const Path = "D:\Test\" Dim I As Worksheet Dim FileName As String Dim RowO As Long Dim RowC As Long ' Set I = ThisWorkbook.ActiveSheet FileName = Dir(Path & "*.xls") RowO = 1 ' While FileName > "" Workbooks.Open Path & FileName, ReadOnly:=True RowC = Cells(Rows.Count, "A").End(xlUp).Row [1:1].Resize(RowC).Copy I.Cells(RowO, "A").Resize(RowC) RowO = RowO + RowC ActiveWindow.Close False FileName = Dir Wend End Sub とりあえず フォルダは、D:¥Test¥ A列から全て(XFD 列迄)A列が空白なら動きません。その場合、 赤丸部分を直して下さい。 ヘッダーは無し、データは1行目から、
補足
回答ありがとうございます。 >>フォルダはどこか。 特定しません。デスクトップに作成した「新しいフォルダ」かもしれませんし、サーバーのなかに作成した、名前を付けたフォルダだったり >>何行から始まっているのか、ヘッダーは何行からか ファイル内の表の行はまちまちです。5行もあれば500行くらいもあります。 なので、MAX1000行とさせてください。
- imogasi
- ベストアンサー率27% (4737/17069)
こういうのは操作で用意されているとは質問者も思わないだろう。 だから、VBAを使うことになると思う。 経験ありますか。 ーー 要点は、 各1ファイルにつき1シートだけを問題にするなら簡単です。 (1)問題のフォルダは1つで、ファイルはその中にすべて収まっているなら フォルダの中の各ファイルを捉えるコードを見つけるとよい。 WEBにはコードが載っている記事がたくさんある。 Googleで「VBA フォルダ内のファイルを開く」」などで検索。 (2)その中のシートは1つだけか? 形だけの空シートや他のデータのシートはないか。 集約するシートが、シートタブ的に一番左に位置すると扱いやすい。いつもSheets(0)で捉えられるから。 (3)A列の最終行が、データリスト列の各最終行と同じなら(凸凹してないなら)簡単に最終行は Sub test01() lr = Range("A10000").End(xlUp).Row ’--(A) MsgBox "最終行 " & lr End Sub の(A)1行で捉えられる。 (4)データを集約するブックのシートを、あらかじめ決めて、そこに貼りつける。 貼り付けるシートの張り付けるべき(先頭)行は、張り付ける直前に、(A)と同じコードを実行して、それに+1した行に張り付ければよい。 (5)2つのブックのシートのデータを扱うVBAコードの書き方。 ーー 今までに何度もこの質問は出ていて、コードを書く面白味もなく、テストデータが必要だが作るのは手間とか、コードを書くには時間がかかり、面倒なので略。 そもそもVBAなどをしたことがないのに、この課題を言うのは無理。丸投げになるし、回答のコードの意味も解らないだろうから。 ーー フリーソフトでもないか探すべきかと。 Googleで「フリーソフト エクセルシート集約」で照会してみたら、 https://search.vector.co.jp/vsearch/vsearch.php?key=excel+%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B+%E3%82%B7%E3%83%BC%E3%83%88 似たようなものはあるようだが、ぴったりかどうか、の問題は残る。
- kon555
- ベストアンサー率51% (1843/3560)
この辺りでどうでしょうか 動作確認はしてませんけども https://excelkamiwaza.com/folder_file_read.html https://www.moug.net/tech/exvba/0060003.html https://www.ex-it-blog.com/Excel-Folder-File-Macro
補足
回答ありがとうございます。 教えていただいたURLは、全てためしましたが、ダメでした。
お礼
回答ありがとうございます。 ためしてみます