シートの検索と抽出方法

このQ&Aのポイント
  • シートの並び順が不明な場合でも、特定の条件に一致するシートからデータを抽出する方法について説明します。
  • アンケート結果を複数のシートにまとめた場合、IDを参照して特定のシートから回答を抽出する方法があります。
  • 集計シートに特定のIDが一致するシートから回答を抽出し、集計する方法を関数で実装することが可能です。
回答を見る
  • ベストアンサー

ある条件に一致するシートの検索と抽出

初めて質問します。 あるアンケートを実施し、1人1つのシートを複数枚、一つのブックに まとめたとします。 「シート1」   A   B    C   D・・・ 1 ID   氏名 2 003 Cさん 3 Q1  (1) 4 Q2  (2) 「シート2」   A   B    C   D・・・ 1 ID   氏名 2 001 Aさん 3 Q1  (2) 4 Q2  (3) この時、シートの並びはIDや名前の順にはなっておらず、順不同です。 ですので、どのシートが誰なのかがシート名ではわからない状態です。 このような状態で、例えば 下記「集計シート」のA2と一致するIDがあるシートから上記B3の結果を抽出し、 下記C2に返す、というのを関数でつくることはできるでしょうか。   A   B    C   D・・・ 1 ID   氏名  Q1  Q2・・・ 2 001 Aさん        ・・・ 3 002 Bさん        ・・・ 誰がどのシートなのかわからないため、IDを頼りに該当者を発見し、その人の 回答を集計シートにまとめる、ということになります。 どなたかご教示いただけますと幸いです。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

お望みの > 誰がどのシートなのかわからないため、IDを頼りに該当者を発見し、 > その人の回答を集計シートにまとめる と言うやり方でももちろん可能です。 が、シートがいくつあるか私には解りませんが、 一々全てのシートを見に行くのは時間効率が物凄く悪いと思いませんか? なので、代案です。 考え方の方針として、 ・全てのシートの名前を、各々のA2セルの値に変える(マクロ) ・INDIRECT関数を使って、各シートから該当セルを参照する(ワークシート関数) と言うモノです。 まず、シート名を変更するところから。 以下のマクロを走らせます。 Sub sample() Dim WS As Worksheet     For Each WS In Worksheets         If WS.Name <> "集計" Then             WS.Name = WS.Range("A2")         End If     Next End Sub 実に単純で、全てのシートに対し、名前が「集計」じゃなかったら シート名を各々のA2セルの内容に書き換えなさい、と言うものです。 シート100枚程度なら一瞬で終わります。 ただし、シート名は重複できませんので、既に在る名前には変更できません。 例えば2枚目のシートが「ID=001」で、5枚目のシートも「ID=001」だったら 5枚目のシートでエラーを返し、マクロが止まります。 コレを回避するには1行追加して Sub sample() Dim WS As Worksheet On Error Resume Next (以下同文に付き、省略) としてやると、エラーが起きたシートの名前を「変えずに」次に進めることが出来ます。 エラーがあり、名前が変わらなかったシートは目視確認の上で手動で変更してやりましょう。 何らかの問題があるようですので(主に重複だとは思います)。 以上、シート名変更のマクロでした。 続いて、参照するための関数です。 前述の通り、INDIRECT関数を使います。 関数についての詳細は別途お調べいただきたいのですが、 ザックリと言うと「指定される文字列への参照を返す」関数です。解りづらいですね。 例えばあるセル(A1セル)に、「B1」と言う文字列が入力されているとします。 B1セルには「テスト」と言う文字列が入力されている状態で、 C1セルに「=INDIRECT(A1)」と入力するとアラ不思議、C1セルには「テスト」と返ってきます。 C1セルに「=INDIRECT(A1&"ですよ")」と入力すると アラアラ不思議、C1セルには「テストですよ」と返ってきます。 そんな関数ですので、色々試してみてください。 さて、本題に戻ります。 「集計」シートの例えばC2セル。 ココは「ID=001」のシートのB3セルを参照したいはずです。 ここで注目すべきは「集計」シートのA2セルに「ID」が入っているところです。 つまり、INDIRECT関数を使って、   C2セル:=INDIRECT(A2&"!B3") としてやると良いですね。 A2セルの内容は「001」ですから、この式は実は「=001!B3」と言うことです。 D2セルなら、   D2セル:=INDIRECT(A2&"!B4") ですね。 名前(例えばB2セル)も同様に   B2セル:=INDIRECT(A2&"!B2") でいけそうな感じですね。 これらを下方向に必要な範囲にコピー(フィル)してやればOKです。 もっとやるのなら、   C2セル:=INDIRECT($A2&"!B"&COLUMN()) としてやると、横方向もコピー(フィル)だけで作ることが出来そうです。 ただし、質問文中のフォーマットで、一問一答であることが条件ではあります。 (COLUMN関数は「列番号」を数字で返す関数です。詳細は別途お調べ下さい。) これで集計表も問題なく出来ると思います。 以上、発想の転換です。 参考になりますかどうか。 補記) 質問文中ではIDが「001」など、全角数字3桁で表現されていますので、 マクロも関数も「それを想定して」の提案です。 これが「実は"1"(半角数字)で、表示形式で3桁に見せている」のであれば、 マクロも関数ももう少し見直さないといけないのかもしれません。 その「条件」は質問文中から読み取れませんので悪しからずご了承下さい。

i4d-yk
質問者

お礼

早々にご回答いただきましてありがとうございました。 マクロはシロウトなので、ご教示いただいた内容を1つ1つ 確認しながら作っていたつもりですが、 WS.Name = WS.Range("A2") のところでエラーが出ており、立ち止まっているところです。 INDIRECTも存在は知っていたものの、使うのは初めてだったのですが、 これはとても便利なのですね。 いろいろと活用の幅が広がりそうでありがたいです。

その他の回答 (3)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

別案も示しておきます。 方針としては ・シート名を「(IDに関わらず)連番でつけなおす」 ・INDIRECT関数で参照する と言うものです。 コレだと、シート名が重複することも無く、空白になる可能性も無いので エラーが発生する可能性は格段に減ります。 マクロです。 ※「集計」シートが先頭に在る場合 Sub Sample()     For i = 1 To Sheets.Count         If Sheets(i).Name <> "集計" Then             Sheets(i).Name = "回答" & i - 1         End If     Next End Sub ※「集計」シートが末尾に在る場合 Sub Sample()     For i = 1 To Sheets.Count         If Sheets(i).Name <> "集計" Then             Sheets(i).Name = "回答" & i         End If     Next End Sub どちらかを走らせると、シート名が「回答*」と言うシート名に変わります。 文中の「回答」を適宜な文字列に変えてもOKです。   Sheets(i).Name = "シート" & i としてやると、「シート*」と言う名前が付きます。 これをもって、INDIRECT関数を使います。 「集計」シートの1行目に項目行を持つとして、 「集計」シートの2行目に「回答1」シートの内容を転記していきます。 転記される側の「行」を判断するため、ROW関数も使います。 例えば、B1セルに「回答1」シートのA2セルを転記してくるなら、   B1セル:=INDIRECT("回答"&ROW()-1&"!A2") としてやります。 つまり、ROW()でその行の番号、2行目ですから「2」が返りますので、 INDIRECT関数のカッコ内は「回答1!A2」と出来るわけです。 これを必要数(行列とも)作ってやります。 そうすると、シート順に「集計」シートに転記されてきます。 このあと、全体をコピー→形式を選択して貼り付け→値を貼り付けてやり、 ID順にソートしてやれば探しやすくなるでしょう。 ※式のままだと並べ替えできません。どう頑張ってもシート順にソートされます。 複雑な式で一発で参照することは可能です。 が、後のメンテナンス、引継ぎ等で苦労してしまうことを考えると、 マクロも式も単純なほうが良いと思いますよ。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

> WS.Name = WS.Range("A2") > のところでエラーが出ており、立ち止まっているところです。 エラーメッセージの内容がわからないので特定できませんが、 考えやすいエラーの原因としては、 ・シート名が重複している ・エクセルのシート名に使えない文字を指定した どちらかだと思います。   WS.Name = WS.Range("A2") これは、「そのシートのA2セルの中身をシート名にしなさい」と言う意味です。 A2セルが空白であれば、エクセルのシート名に空白を指定しようとすることになり、 これは当然、エクセルの仕様でエラーが発生します。 IDがA2セルに無いのであれば、実際にIDを入力してあるセル番地に書き換えが必要です。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.2

要件を確認させてください 今回2シートともA2にID,B2に指名が入っているわけですが、 「こうなっているとは限らない」と、いうことなのですよね? 「集計シートに、既にID入力はされていて、 此に過不足はない、一人1件のみである」 と、いう前提で動いて構わないわけですね? >1人1シート と、いうことで 仮定ですが シート全体から探す必要、 6万行を超えてもっと下まで探す必要、 此は無いと思って良いですか? 回答記入の左側には「Q1」とか「氏名」とかの、ラベルが必ず例外なくあると思って良いですか? 500行目まで、 つまりA1:Z500くらいの範囲で探して良いでしょうか? なお、 駄目な場合はその旨をお申し付けください。 一応出来ましたけれどひな形です 使用に当たってはご自身で加筆して頂く必要があります。 残念ながら「それでも!!」という場合でなければお勧めできません。 C2:==CHOOSE( SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet1!$A$1:$Z$500)))*1)+ SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet2!$A$1:$Z$500)))*2)+ SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet3!$A$1:$Z$500)))*3)+ SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet4!$A$1:$Z$500)))*4)+ SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet5!$A$1:$Z$500)))*5), OFFSET(Sheet1!$A$1,SUMPRODUCT((Sheet1!$A$1:$Z$500=C$1)*ROW(Sheet1!$A$1:$Z$500))-1,SUMPRODUCT((Sheet1!$A$1:$Z$500=C$1)*COLUMN(Sheet1!$A$1:$Z$500)),1,1), OFFSET(Sheet2!$A$1,SUMPRODUCT((Sheet2!$A$1:$Z$500=C$1)*ROW(Sheet2!$A$1:$Z$500))-1,SUMPRODUCT((Sheet2!$A$1:$Z$500=C$1)*COLUMN(Sheet2!$A$1:$Z$500)),1,1), OFFSET(Sheet3!$A$1,SUMPRODUCT((Sheet3!$A$1:$Z$500=C$1)*ROW(Sheet3!$A$1:$Z$500))-1,SUMPRODUCT((Sheet3!$A$1:$Z$500=C$1)*COLUMN(Sheet3!$A$1:$Z$500)),1,1), OFFSET(Sheet4!$A$1,SUMPRODUCT((Sheet4!$A$1:$Z$500=C$1)*ROW(Sheet4!$A$1:$Z$500))-1,SUMPRODUCT((Sheet4!$A$1:$Z$500=C$1)*COLUMN(Sheet4!$A$1:$Z$500)),1,1), OFFSET(Sheet5!$A$1,SUMPRODUCT((Sheet5!$A$1:$Z$500=C$1)*ROW(Sheet5!$A$1:$Z$500))-1,SUMPRODUCT((Sheet5!$A$1:$Z$500=C$1)*COLUMN(Sheet5!$A$1:$Z$500)),1,1) ) 使用に当たっては SUMPRODUCT(NOT(ISERROR(FIND($A2,Sheet4!$A$1:$Z$500)))*4)+ と OFFSET(Sheet4!$A$1,SUMPRODUCT((Sheet4!$A$1:$Z$500=C$1)*ROW(Sheet4!$A$1:$Z$500))-1,SUMPRODUCT((Sheet4!$A$1:$Z$500=C$1)*COLUMN(Sheet4!$A$1:$Z$500)),1,1), を随時シート分追加頂き その上で全シート名をご使用になっているブックに沿う形に変更頂く必要があります。 数式の文字数制限も気になるので、不適切な回答だと思います ご容赦ください。 なお、 http://sdrv.ms/13L5aQG に、サンプルを置いておきます。

i4d-yk
質問者

お礼

2回もご連絡いただいてありがとうございます。 要件も十分にお示しできず失礼しました。 1つのブックには多くても50~60のシートが入る程度です。 なお、アンケートのフォーマットは決まっているため、IDや氏名、質問はどのシートも同じセルに入っています。 IDもひとりひとりに割り振られているため、重複はありません。 なぜシートが順不同になってしまうのかと言いますと、孫請け、下請けを経てこちらに集まってくるので、あまり細かい指示をしてしまうと回収がうまくいかなくなるためです。 孫請けは1,000程度、下請けは100程度で、最終的にこちらには70程度のブックになります。 シートさえまとめてくれれば集計はこちらでやるという前提です。 最初にご教示いただきましたマクロを試してみたところ、 WS.Name = WS.Range("A2") のところでエラーが出てしまいました。

i4d-yk
質問者

補足

大変失礼しました。 最初のご回答は別の方でした。

関連するQ&A

  • EXCELで複数条件の検索

    6人(A,B,C,D,E,F)で麻雀を打つことになりました。 全員と打てるようにするには6C4で 15通りの組み合わせが出来ます。 で、表を作りました。 C,D,A,Fの組み合わ(要するにA,C,D,F)の試合番号を求めるには、 どうすれば良いですか? ※A,C,D,Fの並びは順不同です

  • エクセルで検索、抽出を教えてください。

    いろいろ考えたのですが、わかりません。ご指導よろしくお願いします。 下記の表があります。A1:C1でタイトル、A2:C7でデータが入っています。Dの列にLOOKUPやMATCHなどを用いてそれぞれの氏名の人のQ3の回答を出したいのです。(D2,D3,D4にはうううを入れたい。D5,D6,D7にはかかかを計算で入れたいのです。)よろしくお願いします。   A, B, C, D 1 氏名,Q,こたえ 2 佐藤,Q1,あああ 3 佐藤,Q2,いいい 4 佐藤,Q3,ううう 5 鈴木,Q1,えええ 6 鈴木,Q2,おおお 7 鈴木,Q3,かかか

  • VBAにて、複数シートからデータを抽出

    エクセルVBAです。複数のシートからの集計、抽出の書き方について教えてください。 1つのファイルに50ほどのシートがあります。 各シートの列数やフォーマットは、同じですが行数は、異なります。 例 sheet1(シート名:集計):集計用   A    B    C       D     1 ※検索キーワードを入れるセルや 2   マクロを登録するボタン用として2行開けてある。 3 番号 氏名  郵便番号  住所  sheet2(シート名:STU)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  1  AB   345    YZ 3  1  CD   678    QS sheet3(シート名:XYZ)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  2  AB   345    YZ 3  2  CD   678    QS 4  3  CD   678    QZ 抽出前は、上記の様なファイルとなっております。 上記では、4列としてますが実際は、23列あります。 また、sheet3までですが、実際は、40~100シート位あります。 sheet1(シート名:集計):集計用   A    B    C       D     1     ※検索キーワード:氏名_CD としマクロを実行する  2       (↑例として氏名でフィルタリングしてますが他の指定項目でも実行したい、複数条件は、無)   3 番号 氏名  郵便番号  住所 4  1  CD   678    QS    (←sheet2(シート名:STU)の3列目) 5  2  CD   678    QS  (←sheet3(シート名:XYZ)の3列目) 6  3  CD   678    QZ  (←sheet3(シート名:XYZ)の4列目) ・  ・  CD    ・      ・ (←sheet4(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet10(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet30(シート名:・・・)の・列目) 上記の様にすべてのシートから氏名:CDでフィルタリングし集計シートに抽出したい。 よろしくお願いいたします。

  • Excelでの抽出(検索?)

    エクセルを使い、シートAにID(100件)を、シートBに不要なID(10件)が入っています。 このとき、シートCにA-Bの90件のIDを表示させたいのですが、どのような方法があるでしょうか。 シートCは、シートAで不要なIDの入っていた行が空白になって100行目まで表示されても、詰まって90行まで(空白がなく必要なIDのみ)が表示されてもどちらもでかまいません。 例えばこんな感じです。 シートA シートB シートC A12    B34    A12 B34    D78    C56 C56          E90 D78 E90 よろしくお願いいたします。

  • Excel VBA で二つのシートを比較抽出

    Excel VBA で二つのシートを比較して合致するレコードを別のシートに抽出する方法について 下記ホームページのコードを利用させていただきました。 https://okwave.jp/qa/q5917011.html ●fax2シート B列(検索順)  セル1 A    2 B    3 D    4 C ●fax3シート( 比較抽出結果)  セル1 A    2 B    3 C    4 D 比較抽出結果が検索順にするにはどのようにコードを記述すればよいか教えていただけますか。

  • エクセル 複数シートにまたがるデータの抽出

    複数シートからのデータ抽出についていくつか拝見いたしましたが 知識が足らず、操作できませんでした。 下記のような抽出が可能であれば、ご教授いただけたらと思います。 なお、VBやマクロ等は使用したことは、ほぼありません。 シートが複数あり、またそのシートが増えていく可能性があります。 シート名→「start」「佐藤」「山本」「end」「集計1」「集計2」ととりあえず作成。 (「集計1」にて別のデータ合計をとるため、「start」「end」シートを作成しました。  なお、佐藤~山本のシートは同じ書式ですが、シート名が変わる可能性も高い。  今回したいのは「集計2」においてです) 「佐藤」シート   A   B   C   D 01 佐藤 02 \  月曜 火曜 水曜 03 6:00  1   0.5   1 04 7:00  1    1 05 ~ 18 21:00 「山本」シート   A   B   C   D 01 山本 02 \  月曜 火曜 水曜 03 6:00 04 7:00  1   1   1 05 ~ 18 21:00  1   1   1 「集計2(曜日毎で、月曜)」シート   A   B   C   D 01 月曜 02 03 6:00 佐藤 04 7:00 佐藤 山本 05 ~ 18 21:00 山本 「集計2(曜日毎で、火曜)」シート   A   B   C   D 01 火曜 02 03 6:00 佐藤 04 7:00 山本 05 ~ 18 21:00 山本 できれば、名前(シート)が非常にたくさんになる可能性があるので 集計2に出てくる名前は、詰めてが理想です。 また、できればあまり都度の細かい作業がなければありがたいです。 (利用者で、できない可能性が高い) よろしくお願い申し上げます。

  • Excelで条件に一致したものだけQUARTILE

    条件に一致したものだけQUARTILE関数を使用して集計を行いたいのですが、 思うような結果にならず困っています。 Aシートに一覧があり、集計はBシートにて行おうとしています。 一覧にはC、D項目があり、C項目と固定の条件値が一致する全てのD項目を QUARTILE関数(引き数は2の中位数)で集計を行い、Bシートに表示させようとしています。 例として・・・ Aシート 期間(C項目)|金額(D項目) ーーーーーーーーーーーーーー 1       |200 3       |100 1       |800 2       |300 2       |700 1       |150 Bシート 期間(固定条件)|QUARTILE関数で集計 ーーーーーーーーーーーーーー 1         |200 2         |500 3         |100 何かよい方法があれば、ご教示ください。よろしくお願いします。

  • エクセルで複数シートから、検索して抽出

    はじめまして、右も左も分からない初心者です。 説明出来ないんですが、よろしくお願いします。 【ご質問内容】 エクセルは、XPを使用しています。 エクセルのVBAで、指定したキーワードを 含むデータを抽出したいと思っています。 【例】 Sheet1 A B C D E 1 番号 氏名  郵便番号  住所  メールアドレス 2 1   ○   △    大阪府   ○○ 3 2   △   ○    茨城県   ○○ Sheet2  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 ○  1   △    福岡県   ○○ 3 △  3   ○    茨城県   ○○ と各シートに、列がそれぞれバラバラになっています。 茨城県を検索すると、新しいシートに、 Sheet3  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 2   △   ○    茨城県   ○○ 3  A  B    C     D      E 4 氏名 番号 郵便番号  住所  メールアドレス 5 △  3   ○    茨城県   ○○ という風に、抽出したいと思っています。 どうしたらいいでしょうか?? よろしくお願いします。

  • エクセル:複数のシートから条件が一致したセルの文字を別シートへ順に表示するにはどうすればよいでしょうか?

    1日1シートで日報管理をしており、1ヶ月20シート程度になります。その20シートの中から条件の一致したセル内の文字列を集計用の別シートへ順に表示させたいのですが方法をご教授願います。いろいろ調べてはみたのですが別シートへ順に表示する方法がわかりませんでした。 具体的には下記の通りです。「あああ」「いいい」・・・は人の名前、「1ヶ月」「2ヶ月」は次に連絡するまでの期間です。 どうぞよろしくお願いいたします。 (シート1)  A列   B列  あああ  1ヶ月 いいい  2ヶ月 ううう  1ヶ月 (シート2)  A列   B列  えええ  1ヶ月 おおお  2ヶ月 かかか  1ヶ月 シート1とシート2の中から下記のように集計用シートに順に並べたいのです。 (集計用シート3)   A列       B列 「1ヶ月の人」  「2ヶ月の人」 あああ      いいい  ううう      おおお えええ かかか

  • 一致する条件の番号を写し取りたい

    2つに分かれているブックを、1つにまとめる作業をしているのですが 簡単にできないか、教えていただきたいのですが ブック1には 1  氏名   社員番号   ID番号 2   A     1      0012  3   D     4      0015 4   B     2      0013 5   C     3      0014 ブック2には 1 氏名    ID番号 2  A 3  E 4  C  5  B とあります。 ブック1,2の同じセルの氏名が一致する場合、ID番号を反映させ 違う場合は、検索をして一致する番号を反映させる方法が あれば、ぜひ教えてください。 手作業でしているので、時間がかかり困っております。

専門家に質問してみよう