- ベストアンサー
エクセルマクロで同じシート名をまとめる方法
- エクセルのマクロを使用して、同じシート名を一つのシートにまとめる方法をご教授願います。シート名には「売上」や「部署」などがあり、複数のシートがあります。現在、複数のブックから一つのファイルにまとめることはできましたが、同じシート名同士のみをまとめることができません。ご助力いただけると幸いです。
- 「売上」というシート名のシートを一つにまとめる方法や、「部署」というシート名のシートを一つにまとめる方法を教えてください。マクロを使用しても構いません。現在は、「統合表」というシートがあり、そこにデータを書き込んでいますが、同じシート名同士のみをまとめる方法がわかりません。
- 現在、エクセルのマクロを使用して複数のシートから一つのファイルにまとめています。しかし、同じシート名同士のみをまとめることができず、困っています。具体的には、「売上」というシート名のシートを一つにまとめる方法や、「部署」というシート名のシートを一つにまとめる方法を知りたいです。どなたかご教授願います。
- みんなの回答 (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個ずつ別々にできるようにならないと混乱するだけかと思います。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
>同じシート名を一枚にまとめたい。 書き方が雑。後を読めば判るが。しっかり表現せよ。 ーー (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 他の集約シートは掲載略。 まず上記の例でやってみて、自分の場合に修正する個所を見つけてみてください。
お礼
私のつたない説明に、親切回答くださり、ありがとうございます。 コードのこの修正を、ずっとやっていましたが、 どうしても、私では出来ませんでした。 .Range(Cells(2, "A"), Cells(.Rows.Count, "B")).Copy _ Worksheets(y & "集約").Range("A65536").End(xlUp).Offset(1, 0) ここで止まってしまうので、selectionが違うのかなとか、 修正しましたが、解決できませんでした。 やはり、基本がまだ理解できていないようです。 もっと、勉強します。ありとうございます。
お礼
ありがとうございます!!! きちんと動きました。 ずっと、孤独にマクロをやってきて、 誰にも助けてもらえなかったので、 こんなにも親切に教えてくださり、とてもうれしいです。 感謝しきれません。 これから、もっとマクロを勉強します!!