• ベストアンサー

【VBA】複数シートから抜き出したデータを集約

【Excel2010】の  ●同一ブック内で、  ●sheet1~9の同一列から、  ●sheet10の任意列へ、  ●データを抜き出して、続けて表示させたい と思っています。 手動オートフィルタや、関数で試しましたが、 作業のたびにかなりの手間になります。 願わくばVBAマクロで対応できればと思っているのですが、 知識不足のため、うまくできませんでした。 具体的な画面も添付させていただきます。 ご教示いただきたく、よろしくお願いいたします。 <補足> sheet1~9のデータ行範囲は作業ごと・シートごとに変わります。 (データ列は固定です)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

シートは左端からSheet1~Sheet10まで間に別のシートはなく並んでいるとして(シート名は問わない) Sheet10の2行目から詰めて転記します。コピー貼り付けはしません(短時間で頻繁にコピー貼り付けするとエラーになることがあるみたいです) Sub Test() Dim i As Long, j As Long Dim LastRow As Long, AL As Long, BL As Long Dim sh10ALastRow As Long, sh10BLastRow As Long Dim ShW As Worksheet, ShR As Worksheet Set ShW = Sheets(10) sh10ALastRow = ShW.Cells(Rows.Count, "A").End(xlUp).Row sh10BLastRow = ShW.Cells(Rows.Count, "B").End(xlUp).Row AL = 1: BL = 1 For i = 1 To 9 Set ShR = Sheets(i) LastRow = ShR.Cells(Rows.Count, "A").End(xlUp).Row For j = 2 To LastRow If ShR.Cells(j, "J").Value <> "" Then ShW.Cells(sh10ALastRow + AL, "A").Value = ShR.Cells(j, "J").Value AL = AL + 1 End If If ShR.Cells(j, "K").Value <> "" Then ShW.Cells(sh10BLastRow + BL, "B").Value = ShR.Cells(j, "K").Value BL = BL + 1 End If Next j Set ShR = Nothing Next i Set ShW = Nothing End Sub

comatte2019
質問者

お礼

kkkkkm 様 この度は早々に回答いただきまして、誠にありがとうございました。 ご教示いただいたコードを元に、無事解決することができました。 大変助かりました。 ありがとうございます。 まだまだ勉強を始めたばかりの初心者ですので、また別の質問をすることもあるかと思います。 もしお時間許されましたら、是非またお力添えいただきたくお願い申し上げます。 本当にありがとうございました。

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

Sheet1~Sheet9のJ、K列のデータを抽出(添付図の通り)   ↓ それぞれをSheet10のA、B列に連続的に貼り付け(添付図の通り)   ↓ 貼り付け結果で空白セルがあったら削除して上に詰める(添付図の通り) というマクロです。見てわかるように書いたつもりですがどうでしょうか。Sheet11以降があっても構いません。 回答の添付図は、チェックしやすいデータを入力し、Sheet10が問題なく集計されているのを確認しています。 ループの個所を除けば、「データ取り込み」、「データ貼り付け」、「空白削除」の3、4行のマクロです。変数の定義をちゃんと行い、Excelの機能を使えば、マクロも簡略化できるということですね。標準モジュールに貼り付けます。当方、Win10、Excel2010です。ご参考に。 Sub shtJoin()  Dim w As Integer, Ary(9) As Variant  For w = 1 To 9 '// データを取り込む   Ary(w) = Worksheets("Sheet" & w).Range("J2:K" & maxRw(w))  Next  Worksheets("Sheet10").Activate  Range("A2:B" & Rows.Count).ClearContents '// クリア  For w = 1 To 9 '// データ貼り付け   Range("A" & maxRw(10) & ":" & _      "B" & maxRw(10) + UBound(Ary(w)) - 1) = Ary(w)  Next  Range("A2:B" & maxRw(10)). _    SpecialCells(xlCellTypeBlanks).Select '// 空白を選択  Selection.Delete Shift:=xlUp: Range("A1").Select '// 削除 End Sub  Function maxRw(ShtNo As Integer) '// A、B列の最下行を取得   With Worksheets("Sheet" & ShtNo)    maxRw = WorksheetFunction.Max( _      Range("A" & .Rows.Count).End(xlUp).row, _      Range("B" & .Rows.Count).End(xlUp).row) + 1   End With  End Function

comatte2019
質問者

お礼

nishi6 様 この度は詳細に画面キャプチャまでご提供いただきまして、誠にありがとうございました。 キャプチャを拝見し、ご教示いただいたコードを理解することができました。 一番最初に回答いただいた方をベストアンサーとさせていただきましたが、大変心苦しく思います。 本当にありがとうございました。 まだまだ勉強を始めたばかりの初心者ですので、また別の質問をすることもあるかと思います。 もしお時間許されましたら、是非またお力添えいただきたくお願い申し上げます。

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

既出回答と考え方は同じだが、VBAのコード行数が少ない。繰り返しの記述が 最小限(Copy貼り付けを使うことで) Sub test01() Set tsh = Worksheets("Sheet3") '集約シート '-- For Each sh In Worksheets If sh.Name <> "Sheet3" Then lr = sh.Cells(100000, "B").End(xlUp).Row lr2 = tsh.Cells(100000, "B").End(xlUp).Row sh.Range(sh.Cells(2, "B"), sh.Cells(lr, "B")).Copy tsh.Cells(lr2 + 1, "B") End If Next End Sub 集約シート名Sheet3 と 列番号のBは適宜質問者のばあいで修正されたい」。 各シートのデータは10万行以下、このブックには、集約されるシートと集約するシート以外は置いてないとしている。 sheet1~9に意味を持たせるなら、シートタブ的に左にMOVしておいて ForNextを使えば同程度の行数になる。

comatte2019
質問者

お礼

imogasi 様 この度はご教示いただきまして、誠にありがとうございました。 大変助かりました。 一番最初に回答いただいた方をベストアンサーとさせていただきましたが、大変心苦しく思っております。 本当にありがとうございました。 また別の質問をすることもあるかと思いますので、もしお時間許されましたら、是非またお力添えいただきたくお願い申し上げます。 本当にありがとうございました。

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.2

同じものがあるという仮定で作りました。 Option Explicit Public Sub TestMacro() Const CONST_YASAI_COL As Integer = 10 Const CONST_KUDAMONO_COL As Integer = 11 Dim ws As Worksheet Dim rng As Range Dim a As Integer Dim i As Long Dim j As Long Dim rowMax As Long For a = 1 To 9 Set ws = ThisWorkbook.Worksheets(a) With ws rowMax = .Cells(.Rows.Count, 1).End(xlUp).Row For i = 2 To rowMax '野菜 If .Cells(i, CONST_YASAI_COL).Value <> "" Then WriteData .Cells(i, CONST_YASAI_COL).Value, 1 End If 'くだもの If .Cells(i, CONST_KUDAMONO_COL).Value <> "" Then WriteData .Cells(i, CONST_KUDAMONO_COL).Value, 2 End If Next i End With Set ws = Nothing Next a End Sub Private Sub WriteData(ByVal data As String, ByVal col As Integer) Dim i As Long Dim blnMatch As Boolean Dim k As Long i = 2 blnMatch = False 'チェック用 Debug.Print data With Worksheets("Sheet10") Do While .Cells(i, col) <> "" If .Cells(i, col).Value = data Then blnMatch = True Exit Do End If i = i + 1 Loop If blnMatch = False Then k = .Cells(.Rows.Count, col).End(xlUp).Row + 1 .Cells(k, col).Value = data End If End With End Sub

comatte2019
質問者

お礼

oboroxx 様 この度はご教示いただきまして、誠にありがとうございました。 一番最初に回答いただいた方のコードを採用させていただきましたが、ご教示いただいたコードでも無事解決することができました。大変勉強になりました。 ありがとうございました。 まだまだ勉強を始めたばかりの初心者ですので、また別の質問をすることもあるかと思います。 もしお時間許されましたら、是非またお力添えいただきたくお願い申し上げます。 本当にありがとうございました。

関連するQ&A

  • VBAを使わずに複数シートの列データを縦に並べたい

    フォーマットの異なる表が4種類あり、集計用シートと合わせて5シートを1つのブックにまとめています。各表はカテゴリーが異なるWebサイトのURLリストの列を持っていて、そのURLを集計用シートにまとめたい(縦に並べたい)のですが、Web検索で調べながらOFFSET、ROW、MATCH関数などで挑戦するも、関数の整理がつかず、セル位置の指定と入れ子の式が複雑でうまくいきません。 シート1のURL列の2行目(タイトル行があるので)から最終行までを参照した後、シート2の頭から順番に最終行まで参照し、それをシート4まで繰り返し行うというものです。 VBAは使わずに関数だけで完結させたいです。 どうかご教示ください。 よろしくお願いいたします。 ◆環境:Excel 2016/Windows10 ◆ブックの構成(添付画像ご参照)  ・シート1:参照元シート(1)  ・シート2:参照元シート(2)  ・シート3:参照元シート(3)  ・シート4:参照元シート(4)  ・シート5:参照先集計シート  ※シート1~4はフォーマット及び行数がバラバラの表。  ※各表にはWebサイトのURL一覧の列がそれぞれ含まれている。  ※各表のURL列の1行目のタイトルは「URL」で共通。(列番号はバラバラ) ◆やりたいこと  ・シート1~4のURLの列をまるごとシート5に縦に並べてまとめて参照したい。  ・マクロではなく関数で完結させたい。  ・シート1~4をそれぞれ更新(新データをペースト)すれば、シート5も最新に更新される運用としたい。

  • EXCEL 複数シートを1つのシートに集約する方法

    1つのブックに複数(30程度)の同一フォームのシートがあり、それらを1つのシートにまとめる方法があれば教えて下さい。 データを統合(集計)するわけではなく、単純にシート1の最後のデータの次の行にシート2のデータを追加、同様にシート3~最後のシートのデータを次々に追加したいのです。 手作業でデータをコピー&ペーストでももちろん可能ですが、結構時間がかかりますので簡単なマクロでできれば助かります。 よろしくお願いします。

  • エクセルで抽出したデータを別シートにコピーしたいです

    エクセル2003を使用しています。 例えば、以下のような表があります。  ABC 1あ10 2い15 3あ20 4 A列が条件となり、たとえば「あ」のデータだけ抽出して、そのデータを別シートにコピーします。 同じく「い」だけを抽出して、また別のシートにコピーします。 いままでは、オートフィルタで抽出して自分でコピーをして貼り付けしていましたが、日々データが次の行に追加になるので、毎回オートフィルタしてコピーするのは大変です。 関数か、マクロかVBAを使ってする方法はありますでしょうか。 できれば日々追加になるデータのみをすでにある別シートの前日までのデータの下に追加できるようになればいいと思うのですが。 知識が乏しくできません・・・ よろしくお願いいたします。

  • Excel VBAでオートフィルタで抽出したデータの一部だけ貼り付けるには

    いつもこのコーナーでは皆様にお世話になっております。以下のVBAマクロが組める方ご教示ください。 Sheet2にあるデータに複数条件でソートをかけ、ある数字(1から18まで)を入れたら、オートフィルタでE列のデータの選択部をSheet1のある部分に1行貼り付けるという作業です。以下のInputBoxに数字を入れるところからです。 (ソート後、どの数字を入れるか判断) ↓ InputBoxにある数字"○"(1から18まで)を入れる ↓ オートフィルタE列「"○-"で始まる」or「"-○"で終わる」 ↓ 抽出されたデータのE列(1列だけ)のデータ(上から17個分)を選択 ↓ 選択部をコピー ↓ Sheet1を選択。Sheet1の"K5"セルに行列を入れ替えて貼り付け という流れなのですが・・・ わかる方教えてください。よろしくお願いします。

  • エクセルのシート上でオートフィルターを使った際に関する、VBA上でのコードの記述について

    大変稚拙な質問の仕方をお許しください。 エクセルのシート上で、オートフィルターを使ってデータを抽出した前提で、VBAを使ってある作業をするためのマクロを組もうと思ったのですが、抽出されて表示された一番最初データの行を確定させるコードの記述が思い浮かびません。なにかいい方法はないでしょうか?よろしくお願いします。

  • Excel 微妙に違う2つのシートのデータをリンクさせる

    ある程度 同じデータのブック1とブック2があり、 ブック1は祭日などデータが無い日も日付があり、行が確保されていますが、 ブック2は祭日などデータが無い日は行が抜いてあります。 A列:日付、B列:曜日 C列:データ1、D列:リンクを入れる 04.11.22 月 56  =[ブック2.xls]シート1!H2 04.11.23 火  04.11.24 水 50  =[ブック2.xls]シート1!H3 04.11.25 木 52  =[ブック2.xls]シート1!H4 04.11.26 金 49  =[ブック2.xls]シート1!H5 04.11.29 月      04.11.30 火 A~C列はブック1、2とも同じデータです。(現在ブック1は1400行、ブック2は1300行くらい) D列にブック2のH列のデータを表記したいのですが、ドラッグなどでは行がずれてしまいます。 関数かマクロなど、何か良い方法を教えて下さい。 下記のことにも対応できれば更に便利なのですが・・。 ブック2のH列は時々J列とか他の列(表範囲内)に移動します。 そしてたまにはブック2のシート1もブック1に移動したりブック2に戻したりもします。

  • excel 複数ブック・シートからのデータ抽出

    下記画像の日報を集計したいのですが、ご教授お願いします。 『1月~12月』というブックの中に、『1日~31日』というシートを作成し日報管理を行っています。 すでに『1月~12月』というブックは作成されているので、そちらはいじらずに、その内容を「作業内容集計」という一つのブックに集計したいと思っております。 単価の列に金額が入っていた場合に、行全体を抽出し、一年分を一つのシートにまとめたいのですが可能でしょうか? おそらくマクロでないと無理だと思うのですが、関数でも、こんな方法があると教えていただける方がおられればうれしく思います。 excelは2003~2010という混在の環境ですが、とりあえずexcel2010で集計できれば良いと考えています。 よろしくお願いいたします。

  • オートフィルタで抽出したデータの行を削除(VBAで記述)

    Excel2000を利用しています。 VBAで、オートフィルタを利用した作業を記述したいと思っています。 データは一行目にタイトルが入っています。 オートフィルタで抽出したデータを その行まるまる削除したいと思っています。 その時、タイトル行(1行目)を除いて オートフィルタで抽出された行のみ選択して 削除する、という場合、どのように記述すればよいのでしょうか。 自分では全然分からないので 教えてください、よろしくお願い致します。

  • 不要なデータを切り取って別のシートに貼りつける

    シート1に色々なデータが並べています。A列~J列、5000行くらいです。 J列に「0」「1」「#N/A」の三つの値がバラバラに並べています。 フィルタで昇順にし、「0」「1」「#N/A」と奇麗に並べます。 「0」と「#N/A」の行を切り取ってシート2へ貼り付けます。 そして次にG列に「ダウンロード」以外の文字があった場合も同様に切り取ってシート2に貼り付ける といった作業をしています。作業が大変なので、マクロで実行したいのですが、コードの記述が分からないのです。教えて下さい。 宜しくお願いします。

  • 複数シートのデータを行列を入れ替えて統合したい

    現在1ブックに30シートが入っています。 30シートすべて同じフォーマットで A      B 項目名1 データ1 項目名2 データ2 … のように複数行2列の内容です。 この30シート分のデータを行列を入れ替えて1シートに統合し A項目名1       B項目名2       C項目名3 シート1のデータ1  シート1データ2  シート1のデータ3 シート2のデータ1  シート2データ2  シート2のデータ3 … シート30のデータ1  シート30データ2  シート30のデータ3 のようにしたいのです。何ブックもあり、手動では時間がかかるため VBAで処理できたらと思います。 どのようにすればよいか教えていただければ助かります。

専門家に質問してみよう