• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同じシート名を一枚にまとめる)

エクセルマクロで同じシート名をまとめる方法

このQ&Aのポイント
  • エクセルのマクロを使用して、同じシート名を一つのシートにまとめる方法をご教授願います。シート名には「売上」や「部署」などがあり、複数のシートがあります。現在、複数のブックから一つのファイルにまとめることはできましたが、同じシート名同士のみをまとめることができません。ご助力いただけると幸いです。
  • 「売上」というシート名のシートを一つにまとめる方法や、「部署」というシート名のシートを一つにまとめる方法を教えてください。マクロを使用しても構いません。現在は、「統合表」というシートがあり、そこにデータを書き込んでいますが、同じシート名同士のみをまとめる方法がわかりません。
  • 現在、エクセルのマクロを使用して複数のシートから一つのファイルにまとめています。しかし、同じシート名同士のみをまとめることができず、困っています。具体的には、「売上」というシート名のシートを一つにまとめる方法や、「部署」というシート名のシートを一つにまとめる方法を知りたいです。どなたかご教授願います。

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

>下記のコード ## もうひと息な気がするんですけどね。 >For Each sh2 In ActiveWorkbook.Worksheets これが、1シートずつ処理をしようとしているということですよね? >If sh2.Name = "発注" Or _ >sh2.Name = "部署" Or _ >sh2.Name = "使い方" Or _ >sh2.Name = "残すシート" Then Exit For '統合表は統合対象外 ここは対象外のシートなら1シートずつの処理を終了する(Exit For)となっていますけど本当? 本当は対象外のシートなら処理をしたくなくて次のシートへ進みたいということですよね? シート名が"売上"、"売上(2)"、"売上(3)" のシートだけを処理したいときは、 instr(sh2.Name,"売上")>0 という条件をつかうと便利です。 msgbox(instr("ABC","AB"))やmsgbox(instr("XABC","AB"))、msgbox(instr("ABC","AC")) をイミディエイトでなりプログラムでなり動かしてみてください。 前者は1や2、後者は0が返ってきます。 つまり、instr(sh2.Name,"売上")>0というのは、シート名に「売上」の文字があるときという 条件になります。(詳しくはVBAのINSTR関数を調べてください。) ということで、 For Each sh2 In ActiveWorkbook.Worksheets If sh2.Name = "発注" Or _ sh2.Name = "部署" Or _ sh2.Name = "使い方" Or _ sh2.Name = "残すシート" Then Exit For '統合表は統合対象外 を For Each sh2 In ActiveWorkbook.Worksheets If instr(sh2.Name,"売上")>0 then とし、 Next i Next を Next i END IF Next とすると、売上シートに関してはお望みのことができるでしょう。 >"部署"シート名を一枚にまとめる も同様の処理を下に書いてあげるとできるでしょう。 ## 本当は、売上と部署の両方を一度に処理するほうが、効率いいのですが、 ## まずは、1個ずつ別々にできるようにならないと混乱するだけかと思います。

sarumi3
質問者

お礼

ありがとうございます!!! きちんと動きました。 ずっと、孤独にマクロをやってきて、 誰にも助けてもらえなかったので、 こんなにも親切に教えてくださり、とてもうれしいです。 感謝しきれません。 これから、もっとマクロを勉強します!!

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

>同じシート名を一枚にまとめたい。 書き方が雑。後を読めば判るが。しっかり表現せよ。 ーー (1)同じファイル名がどれだけあるかとらえるコードは出来たのか。 (2)(1)のそれぞれについてシート名で()を除いて比較して同じかどうか判別する。 (3)同じならどうするのか。集約シートを新たに作るのか。()無しのシートのデータの次に加えていくのか。質問に書いてあるか。 (4)集約シートの最終行を割りだし、その次の行以下に貼り付け(初心者が聞きそうなところはここか) ーーー (1)は手作業で今回は解決するとして 元シート名 Sheet1 Sheet2 Sheet1(2) Sheet1(3) Sheet3 白紙のシートSheet1集約、Sheet2集約、Sheet3集約を作っておく。 データ すべて第1行目(見出し行)からで、2列のデータと仮定。 Sheet1 XX   YY <-列見出し a 1 b 2 c 3 d 4 Sheet2 UU   VV aa 100 bb 101 cc 102 Sheet1(2) XX   YY x 11 y 12 z 13 Sheet1(3) XX   YY u 21 v 22 w 23 s 24 t 25 Sheet3 ZZ     UU aaa 201 bbb 202 ccc 203 ーーーー コード 標準モジュールに Sub test01() Dim ch For Each ws In Worksheets x = ws.Name If InStr(x, "集約") = 0 Then p = InStr(x, "(") If p <> 0 Then y = Left(x, p - 1) Worksheets(x).Activate Range("A2").CurrentRegion.Select With Selection .Range(Cells(2, "A"), Cells(.Rows.Count, "B")).Copy _ Worksheets(y & "集約").Range("A65536").End(xlUp).Offset(1, 0) End With Else y = x Worksheets(x).Range("A2").CurrentRegion.Copy Worksheets(x & "集約").Range("A1") End If MsgBox y End If Next End Sub ーー 結果 Sheet1集約 XX   YY a 1 b 2 c 3 d 4 x 11 y 12 z 13 u 21 v 22 w 23 s 24 t 25 他の集約シートは掲載略。 まず上記の例でやってみて、自分の場合に修正する個所を見つけてみてください。

sarumi3
質問者

お礼

私のつたない説明に、親切回答くださり、ありがとうございます。 コードのこの修正を、ずっとやっていましたが、 どうしても、私では出来ませんでした。 .Range(Cells(2, "A"), Cells(.Rows.Count, "B")).Copy _ Worksheets(y & "集約").Range("A65536").End(xlUp).Offset(1, 0) ここで止まってしまうので、selectionが違うのかなとか、 修正しましたが、解決できませんでした。 やはり、基本がまだ理解できていないようです。 もっと、勉強します。ありとうございます。