Excelで表から特定の条件を満たすデータを抽出する方法

このQ&Aのポイント
  • Excelで表から特定の条件を満たすデータを抽出する方法を教えてください。
  • 具体的な要求として、表の中から3回全て100点だった人のデータを抽出し、別の場所に書き出したいと思っています。
  • 現在、countifをマクロで使って試してみましたが、上手くいきませんでした。シンプルなマクロの記述で実現できる方法を教えてください。
回答を見る
  • ベストアンサー

範囲を検索し指定の数だけあれば、それを書き出すには

いつも皆さんに大変お世話になっております。またひとつ教えていただきたいことがございます。 組、番号、氏名、数学の点数、英語の点数が表の見出しで、50名ほどのデータが入っている表があります。この表は200名ほどのデータの中で、2つの教科ともに100点を取った者だけが抽出されている表です。 数回実施したテストごとに両教科100点の者だけを抽出し、前のテストの同じ表に付け足しをしているのを「並べ替え」によって、次のようになっています。 組 番号 氏名    数学 英語 1  2  佐藤正一 100 100 1  2  佐藤正一 100 100 1  2  佐藤正一 100 100 1 35  山口篤  100 100 2  9  加藤稔  100 100 2  9  加藤稔  100 100  6 11  原田聡  100 100 6 11  原田聡  100 100 6 11  原田聡  100 100 やりたいことは、この表から3回名前がある者だけを上から順に拾っていき、別の場所に書き出し、3回とも100点だった者のリストを作りたいということなのです。 出来上がりはこういう感じです。↓ 組 番号 氏名    数学 英語 1  2  佐藤正一 100 100 6 11  原田聡  100 100 今のところ、countifをマクロで使う方法などを調べてやってみたのですが自分の理解が不足でうまくいきませんでした。 一番シンプルなマクロの記述で実現できる方法を教えていただきたく存じます。 よろしくお願いします。

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

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

Sheet1のC列に名前があるとします。 3回以上出現した場合、Shee2にコピーします。 (Sheet2はあらかじめ用意しておいてください) Sub macro() Dim C As Range, I As Integer For Each C In Range("C2:C" & Range("C" & Rows.Count).End(xlUp).Row) If C.Value = C.Offset(1).Value Then I = I + 1 If I = 2 Then C.EntireRow.Copy Worksheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1) End If Else I = 0 End If Next C End Sub

tarokawa20
質問者

お礼

早速のご回答ありがとうございます。 すみません、わからないところがありまして、 If C.Value = C.Offset(1).Value Then I = I + 1 If I = 2 Then で、CとCの一つ下が同じかどうかをみて、同じなら変数が1になり、 そのあと、Cの2つ下とを比べるという作業は、 each c in ~ によって行われると考えていいのでしょうか。

tarokawa20
質問者

補足

あと、すみませんがもう一つ質問させていただきたいのですが、 書きだす場所はこの表の数列右にしたいと思っています。 そこで、C.EntireRow.Copy のところを、「データの表の範囲におけるその行全部」 とするにはどうすればいいのでしょうか。 currentregionとかと組み合わせて簡単にできるものでしょうか。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! 横からお邪魔します。 No.1さんの補足を読ませてもらって・・・ >書きだす場所はこの表の数列右にしたいと思っています。 >そこで、C.EntireRow.Copy のところを、「データの表の範囲におけるその行全部」 >とするにはどうすればいいのでしょうか。 元データが何列あってもよいようにしてみました。 入力されているデータの2列隣りに表示するようにしています。 尚、データ変更があってもそのままマクロが実行できるように 一旦表示されている結果を消去するようにしています。 可能性としてはほどんどないのかもしれませんが、 同姓同名があってもB列の「番号」の重複はないと思いますので、 B列でデータ数を検索しています。 Sub Sample1() Dim i As Long, endCol As Long 'データの最終列取得 endCol = Range("A1").CurrentRegion.Columns.Count 'すでに表示されている結果を消去 Cells(1, endCol + 2).CurrentRegion.Clear '項目行を最終列の2列隣りにコピー&ペースト Range("A1").Resize(, endCol).Copy Cells(1, endCol + 2) For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row 'B列に3個以上存在、かつ最終列の2列右隣りに表示されている「番号」にB列データがない場合は If WorksheetFunction.CountIf(Range("B:B"), Cells(i, "B")) > 2 And _ WorksheetFunction.CountIf(Columns(endCol + 3), Cells(i, "B")) = 0 Then 'i列のA列~最終列をコピー&ペースト Cells(i, "A").Resize(, endCol).Copy Cells(Rows.Count, endCol + 2).End(xlUp).Offset(1) End If Next i End Sub ※ CurrentRegionで最終列を取得していますので、結果表示させるセルは必ず1列以上は空白列が必要です。 ※ 元データは並び替えしていなくても大丈夫だと思います。m(_ _)m

tarokawa20
質問者

お礼

大変わかりやすく、汎用性のあるマクロを教えていただき、ありがとうございました。 ご丁寧に本当にありがとうございます。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

>で、CとCの一つ下が同じかどうかをみて、同じなら変数が1になり、 >そのあと、Cの2つ下とを比べるという作業は、 >each c in ~ によって行われると考えていいのでしょうか。 Cの2つ下と比べるという事はしていません。常に1つ下と同じかどうか確認しています。 each c in ~は最初C2からスタートして、C3、C4と1つづつ下へCの参照先がずれていきます。 CがC2のときはC3とC3のときはC4と比べます。 2回連続で同じだった場合、コピーしています。

tarokawa20
質問者

補足

完全にうまく動きました。ありがとうございます。 でも、ぼくの理解が至らず、どういうわけでnext Cに行く前に、次々下へとずれていくのか、構文の意味がつかめません。 勉強してみようと思います。 ありがとうございました。

関連するQ&A

  • クエリで複数条件を同時に抽出・出力する方法

    お世話になります。 ACCESSのクエリであるテーブルの入力ミスを抽出したいと考えています。 例えば、氏名と科目と点数があるとします。 No.  氏名  科目  点数 -------------------------- 01 佐藤  国語   80 02 田中  国語   45 03 鈴木  国語   60 04 佐藤  数学   75 05 田中  数学   40 06 鈴木  数学   48 ここで抽出したい条件として、国語は59点以下、数学は49点以下の抽出をしたいとして、今まではクエリの条件に1つずつ科目と点数に条件を入れ1つずつ結果を抽出をしていましたが、同時に結果を得ることができますか?また、結果をリスト表(クエリかレポート)として出力できますか? 拙い文で申し訳ありませんが、分かる方いらっしゃいましたらよろしくお願いいたします。 (スキルとして少しで、ブランクもありますがVBA,SQLです)

  • あるフィールドの最大値を条件にデータを抽出する方法

    Access97のVBAで開発を行っています。SQLでデータの抽出で、あるフィールドの最大値を条件に指定して抽出する方法を教えてください。最大値という曖昧な条件なため、悩んでいます。 (例)ある学校の成績テーブル(左から、学籍番号,組,氏名,性別,科目,点数) 0103,鈴木,男,国語,95 0103,鈴木,男,数学,40 0103,鈴木,男,英語,80 0104,高橋,男,国語,45 0104,高橋,男,数学,85 0104,高橋,男,英語,55 | |(SQLで各人の最高点のデータのみ抽出したい) ↓ (抽出結果) 0103,鈴木,男,国語,95 0104,高橋,男,数学,85 知っている方、是非教えてください。 お願いします。

  • VBA? と関数。色の付いた文字のセルは?

    以前ここで「エクセルで赤の文字のセルとカウントするVBA」を教えていただきました。 その後もう一つ調べたい事がおきました。どなたか力を貸してください。 【例】 月曜日 田中 橋本 佐藤 鈴木 加藤 09:00 田中     佐藤     加藤 09:30 田中     佐藤 鈴木 加藤 10:00     橋本 佐藤 鈴木 加藤 10:30     橋本 上記のような契約シフト表を作っています。応援勤務をすると応援した時間分だけ赤色で名前を足しています。以前はこの赤色のみをカウントしその日の合計応援時間を出していました。 しかし又、新たに誰が何時から何時まで応援勤務したかを抽出する必要が出てきました。 (1) 枠の中で赤色の文字になっている氏名の抽出 (2) その文字の位置から何時から何時までが応援勤務なのかを知りたい 自分で考えましたが何がなにやら頭が混乱してきてしまいました。 どなたかどうか力を貸してください。 ちなみに今までは手で抽出していたのですが雇用者が60名以上にも及ぶ為どうしても簡易計算式で抽出する必要があります。

  • 文字検索について

    エクセル内のシートに表を作成しています。 A2:A6に各氏名(田中・佐藤・鈴木・石橋・内藤、5名分)。 B1:F1に各教科(国・数・社・理・英、5科目)。 セルB2:F6内に各者の教科別点数を入力しています。 『この表ではA1の部分は空白となっています』 そして、今回行いたい内容としては、 セルB2:F6内の点数を多い順から別の表に抜き出し、 同時に該当する点数の氏名と教科を、点数の入ったセルの 左となりに抜き出したいと考えてます。 例えば、B2のセルに100点が入り全体でTOP1の場合は 別表に氏名(田中)、教科(国)、点数100点と 並べて抜き出すということです。 この用に、TOP1~TOP5を縦に並べ抜き出したいと考えております。 幾度も挑戦したのですが、私の力ではどうもなりませんでした。 どうぞ宜しくお願いします。

  • エクセルでの、表からのデータ抽出について

    関数を使った、表からのデータ抽出方法について教えてください。 氏名 生年月日 年齢 担当者 所属 佐藤 1973/4/5 33 加藤 営業 上田 1987/10/4 19 永田 経理 林 1978/6/8 28 永田 営業 西田 1977/7/9 29 清水 営業 長尾 1984/6/25 22 加藤 経理 上のような表がある時に、別のシートに誕生日ごとの表を出したいのですが、どのようにすれば良いか分からずに困っています。なお”別のシート”に抽出したデータは、以下のような表をイメージしています。 (抽出例) 1月生まれ 該当者なし 2月生まれ 該当者なし 3月生まれ 該当者なし 4月生まれ 5日 1973 33歳 佐藤 (加藤) 5月生まれ 該当者なし 6月生まれ 8日 1978 28歳 林 (永田) 25日 1984 22歳 長尾 (加藤) というように、誕生日を基準に月ごとに表示され、該当するデータの横軸のデータも連動して表示したいのと、可能であれば日にちの若い順に順番に表示ができれば理想的です。またできることなら、営業か経理かでシートが分けられると完璧です。 自分でできない割には欲張りな質問ですみません。方法をご存知の方に、ご教授いただければありがたいです。よろしくお願いいたします。

  • EXCELの表からの「抽出」、「転記」

    1.元帳(Sheet8)から転記した「金融機関向け提出資料」(Sheet10)があったので、こ れからまた転記して組単位で「No.」と「氏名」の表(Sheet5)を作りたいので  す。 2. 添付画像「金融機関向け提出資料」(Sheet10)において、9組を例にとると、No.7、No.16、No.17、No.23の、以下続  く。これ等をSheet5の表に抽出していきたいのです。Sheet5の構想は、1行目:組 番号、2行目は項目名:No.(A2)と氏名(B2)、3行目~27行目(25名分)に各  データを 抽出、転記する。一組分の範囲はA1:B27です。 3.組の数は9組ありますが、一組だけその方法を教えて頂ければ結構です。 4.尚、Sheet10のNo.は1~188です。Sheet10のG列に、組番号を転記しています。こ の組番号はSheet10では印刷領域外です。 5. Sheet10からSheet 5に抽出し、転記した最初の人の(1)No.と(2)氏名をオートフィ ルで下にコピーすると、同じ組のNo.と氏名が表示されたら良いのですが・・・。 6.私はマクロが使えません。INDEX関数やMATCH関数は使ったことがあります。 元帳(Sheet8)からINDEX関数で「金融機関向け提出資料」(Sheet10)に転記して います。 7.最初から9組分の表を作成しておいて、そこにデータを順次転記していく方法もあ るのかも知れません。 8.Sheet10の一部を「画像添付」します。 以上ですが、よろしくご指導ください。

  • 他のシートのセルの値を引用したい

    EXCEL2007でマクロ作成中の初心者です。今困っています。お助けください。 シートのA列に名前が書いてあります。 その名前の横B列に番号を入れたいのです。      A       B     1 佐藤   2 伊東   3 加藤   4 以下つづく 横B列の番号は他のシートにあります。現状では以下の番号になります。     A          B     1 佐藤        1   2 伊東        3   3 加藤        5   4 以下つづく 他のシートに以下の表があります。これは可変の表で、名前は次の列は空白です。 名前のあるセルのみ上の番号を表示したいです。 、       A    B    C    D    E     F   G  →以下つづく    1     2 番号    1     2    3     4    5    6   7   →以下つづく    3 名前   佐藤        伊東       加藤      田中  →以下つづく わかりにくいかもしれませんがよろしくお願いします。

  • excelのデータ抽出?検索?についておしえてください。

    excelのデータ抽出?検索?についておしえてください。 エクセル2003で sheet1に次のようなデータがあります。   A列  B列  C列     D列  E列 ・・・ 1 組   番号  氏名     古典  現文 ・・・  2 1   1   青木 優    3 1   2   池田 洋子   4 1   3   植村 美紀   ・ ・ sheet2には1組の成績が sheet3には2組の成績が入っています。 クラスによって科目が違います。 この「氏名」と1行目の「科目名」が一致するデータを 他のシートから読み出してくる関数がありませんでしょうか 青木さんの古典を1組のシートから読み出すといった感じです。 説明がへたで 申し訳ないのですが うまく検索ができなくて困っています。 ぜひ くわしいかた教えてください。 どうぞ よろしくおねがいします。

  • エクセルで質問です。

    エクセルで質問です。 sheet1に     A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     C      佐藤    東京 4  2     B      鈴木    埼玉 5  3     A      加藤    千葉 6  4     B      本多    東京 このようなデータがたくさんあります。(左の数字は行番号、上のアルファベットは列番号) これを別シートにグループ順に   A     B      C     D 1  No.   グループ    氏名   住所 2 3  1     A      加藤    千葉 4  2     B      鈴木    埼玉 5  3     B      本多    東京 6  4     C      佐藤    東京 と表示させる方法はありますか。 エクセルに詳しくないのですが どなたか助けていただければと思います。

  • フィルタオプションを使って検索条件数が変わる場合(マクロ)

    こんにちは。 今マクロでフィルタオプションを使ってデータを抽出するための手順を登録しています。 Excelの画面は (1)社員番号 氏名  部署 (2)社員番号 氏名  部署   0001   田中   0002   佐藤   0003   鈴木   0004   高橋 となっているとします。上の(1)は検索条件を入力する場所です。(2)は検索元となるデータ及び検索したデータを表示させる場所です。 今登録したマクロを少しだけ修正して以下のようになっています。 Rows("25:25").Select Range(Selection, Selection.End(xlDown)).Select Selection.AdvancedFilter action:=xlFilterInPlace, criteriarange:=Rows _ ("1:5"), unique:=False Range("A25").Select 今検索条件の部分はcriteriarange:=Rows("1:5")となっていますが、このままだと6行目以降に条件を入れた場合その条件はひっかからないようになってしまいます。 何行目まで条件を入れるかわかりませんが、時々によって6つだったり5つだったりすると思うのです。なので、条件が入っている行までを検索条件になるようにしたいのですが、どのようにすればいいのでしょうか? マクロについてはかなり初心者ですが、業務上便利だと思い、どうしても作りたいので教えていただけないでしょうか? 説明が長くてすみません。 よろしくお願いします。

専門家に質問してみよう