エクセル関数で頻度の高い行を抽出する方法

このQ&Aのポイント
  • エクセルの関数を使用して、各名前ごとに更新日の頻度が高い行を抽出する方法について教えてください。
  • 以下の表の中から、名前ごとに更新日の頻度が多い行だけを抽出する方法を教えてください。
  • 例えば、表の中から名前ごとに更新日の頻度が高い行を取得するためのエクセル関数を教えてください。
回答を見る
  • ベストアンサー

頻度の高い行を抽出

エクセルの関数について質問させてください。 例えば以下の表があるとします。 名前   更新日 AA 2014/2/10 AA 2014/2/10 AA 2014/2/26 AA 2013/12/10 BB 2014/2/1 BB 2014/1/17 BB 2014/2/1 以下の抽出結果のように、各名前ごとに更新日の頻度が多いものだけを抽出するための 関数などありましたら教えてください。 よろしくお願いいたします。 <抽出結果> 名前 更新日 AA 2014/2/10 BB 2014/2/1

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

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

こんばんは! 一例です。 ↓の画像で左側がSheet1で右側のSheet2に表示するとします。 Sheet1に作業用の列を2列設けます。 尚、Excel2007以降のバージョンとします。 (COUNTIFS関数や、IFERROR関数を使用しているため) 作業列1のD2セルに =IF(COUNTIF(A$2:A2,A2)=1,ROW(),"") 作業列2のE2セルに =IF(COUNTBLANK(A2:B2),"",COUNTIFS(A:A,A2,B:B,B2)+1/ROW()) という数式を入れ、両列ともオートフィルでずぃ~~~!っと下へコピーしておきます。 そしてSheet2のA2セルに =IFERROR(INDEX(Sheet1!A:A,SMALL(Sheet1!D:D,ROW(A1))),"") B2セルに =IFERROR(INDEX(Sheet1!B$1:B$1000,MATCH(MAX(IF(Sheet1!A$1:A$1000=A2,Sheet1!E$1:E$1000)),Sheet1!E$1:E$1000,0)),"") このB2セルのみが配列数式になってしまいますので、Ctrl+Shift+Enterで確定! この画面からコピー&ペーストする場合は 上記数式をドラッグ&コピー → B2セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま) Ctrl+Shiftキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 最後にA2・B2セルを範囲指定 → B2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 ※ 作業列が目障りであれば遠く離れた列に設けるか、非表示にしてください。 ※ 同一名で更新日の頻度が最も高いものが複数ある場合 上位の行のデータが表示されます。m(_ _)m

ken6791
質問者

お礼

ありがとうございました。 助かりました。わかりやすかったです。

その他の回答 (8)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.9

>たとえで項目を2つだけ書きましたが、実をいうと10項目ぐらいあり、また名前も1000人分あります。 >抽出結果を別シートにしたいと考えています。 この条件なら計算負荷が比較的少ない、以下のような数式で対応するのが簡便かもしれません。 元データがSheet1のA2セル以下にデータがあり(項目名が1行目)、別シートのA2セルに以下の式を入力し、下方向に10個オートフィルコピーします。 =INDEX(Sheet1!A:A,SMALL(INDEX((MATCH(Sheet1!A$2:A$1000&"",Sheet1!A$2:A$1000&"",)<>ROW(A$2:A$1000)-1)*100+ROW(A$2:A$1000),),ROW(A1)))&"" B2セルには以下の式を入力し、同じく10個程度オートフィルコピーします(セルの書式は日付)。 =MODE((Sheet1!$A$2:$A$1000<>A2)*ROW($A$2:$A$1000)/10000+Sheet1!$B$2:$B$1000)

ken6791
質問者

お礼

ありがとうございました。 助かりました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.8

 回答No.7です。  先程の回答文において、「配列変数やSUMPRODUCT関数」と記述している箇所がありますが、これは「配列数式やSUMPRODUCT関数」の間違いです。

ken6791
質問者

お礼

ありがとうございました。 勉強になりました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.7

 頻度が最も多い日付が、同数1位で複数存在するという事もあり得ると思われますが、 >たとえで項目を2つだけ書きましたが、実をいうと10項目ぐらいあり、 とされておられるという事は、同じ名前の中で、頻度が同数1位の日付が複数ある場合であっても、表示する事が出来る行は、1つの名前につき1行だけという事になりますから、頻度が同数1位の日付の内、上から順番に検索して行った際に、最初に現れる行のデータのみを抽出する(該当する行が複数あっても、抽出するデータは1行分のみ)という考え方で宜しいでしょうか?  もしその考え方で良いとした場合で、尚且つ、Excel2007以降のバージョンのExcelを使用する事が出来る場合には、作業列を1行使用するだけで、配列変数やSUMPRODUCT関数の様な処理が重くなりやすい方法などは使わずに、御質問の目的を達成する事が出来ます。  今仮に、元データの表の中で「名前」と入力されているセルが、Sheet1のA1セルであり、抽出結果の表の中で「名前」と入力されているセルが、Sheet2のA1セルであるものとします。  又、Sheet3のA列を作業列として使用するものとします。  まず、Sheet3のA2セルに次の関数を入力して下さい。 =IF(OR(INDEX(Sheet1!$A:$A,ROW())="",INDEX(Sheet1!$B:$B,ROW())=""),"",IF(COUNTIFS(Sheet1!$A$1:INDEX(Sheet1!$A:$A,ROW()-1),INDEX(Sheet1!$A:$A,ROW()),Sheet1!$B$1:INDEX(Sheet1!$B:$B,ROW()-1),INDEX(Sheet1!$B:$B,ROW())),"",MATCH(INDEX(Sheet1!$A:$A,ROW()),Sheet1!$A:$A,0)*10000000+COUNTIFS(Sheet1!$A:$A,INDEX(Sheet1!$A:$A,ROW()),Sheet1!$B:$B,INDEX(Sheet1!$B:$B,ROW()))))  次に、Sheet3のA2セルをコピーして、Sheet3のA3以下に貼り付けて下さい。  次に、Sheet2のA1セルに次の関数を入力して下さい。 =Sheet1!$A$1  次に、Sheet2のA2セルに次の関数を入力して下さい。 =IF($A1="","",IF(COUNTIF(Sheet3!$A:$A,">"&(MATCH($A1,Sheet1!$A:$A,0)+1)*10000000)*COUNTIF(Sheet1!$A$1:$B$1,A$1),IF(INDEX(Sheet1!$A:$B,MATCH(SMALL(Sheet3!$A:$A,COUNTIF(Sheet3!$A:$A,"<"&CEILING(LARGE(Sheet3!$A:$A,COUNTIF(Sheet3!$A:$A,">"&(MATCH($A1,Sheet1!$A:$A,0)+1)*10000000)),10000000))),Sheet3!$A:$A,0),MATCH(A$1,Sheet1!$A$1:$B$1,0))="","",INDEX(Sheet1!$A:$B,MATCH(SMALL(Sheet3!$A:$A,COUNTIF(Sheet3!$A:$A,"<"&CEILING(LARGE(Sheet3!$A:$A,COUNTIF(Sheet3!$A:$A,">"&(MATCH($A1,Sheet1!$A:$A,0)+1)*10000000)),10000000))),Sheet3!$A:$A,0),MATCH(A$1,Sheet1!$A$1:$B$1,0))),""))  次に、Sheet2のA2セルをコピーして、Sheet2のB2セルに貼り付けて下さい。  次に、Sheet2のB2セルの書式設定を[日付]に設定して下さい。  次に、Sheet2のA2~B2の範囲をコピーして、同じ列範囲の3行目以下に貼り付けて下さい。  以上です。

回答No.5

頻度の多いものを導く関数に「MEDIAN」というものがあります。 "AA",”BB"をそれぞれ直接入力する場合は  =MEDIAN(IF($A$2:$A$5="AA",$B$2:$B$5))  =MEDIAN(IF($A$6:$A$8="BB",$B$6:$B$8)) という式になります。 セル参照をさせて式を作る場合は(添付画像参照) セルF2 =MEDIAN(IF($A$2:$A$8=E2,$B$2:$B$8))の式を作り、最後に「Ctrl」+「Shift」+「Enter」で配列数式として完成させます。 尚、表示形式がシリアル値で出力しますので、お好みの日付を選択してください。

ken6791
質問者

補足

早速回答いただきありがとうございます。 説明が不十分でした、すいません。 補足説明させていただきます。 たとえで項目を2つだけ書きましたが、実をいうと10項目ぐらいあり、 また名前も1000人分あります。 抽出結果を別シートにしたいと考えています。 いただいた回答を基にカスタマイズして自分なりにやってみたのですが、 うまくいきませんでした。助けていただけるとうれしいです。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

>C2にAA, C3にBBが入力していない場合はどうすればいいですか? 重複のない名前を取得するなら、C2セルに以下の数式を入力して下方向にオートフィルコピーしてください。 =INDEX(A:A,SMALL(INDEX((MATCH(A$2:A$100&"",A$2:A$100&"",)<>ROW(A$2:A$100)-1)*100+ROW(A$2:A$100),),ROW(A1)))&""

ken6791
質問者

補足

早速回答いただきありがとうございます。 説明が不十分でした、すいません。 補足説明させていただきます。 たとえで項目を2つだけ書きましたが、実をいうと10項目ぐらいあり、 また名前も1000人分あります。 抽出結果を別シートにしたいと考えています。 いただいた回答を基にカスタマイズして自分なりにやってみたのですが、 うまくいきませんでした。助けていただけるとうれしいです。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

以下のような配列数式で表示することができますが、表示データ数が多くなると(データ範囲が大きくなる場合も)、シートの動きが重くなるのであまりお勧めできません。 D2セル以下に重複のない名前が入力されているなら(この部分も自動的に表示させることはできますがお勧めできません)、E2セルに以下の数式を入力しCtrl+Shift+Enterで確定してください。 =INDEX(B:B,MAX((COUNTIFS($A$2:$A$100,D2,$B$2:$B$100,$B$2:$B$100)=MAX(COUNTIFS($A$2:$A$100,D2,$B$2:$B$100,$B$2:$B$100)))*ROW($B$2:$B$100))) #なお、上記の回答はExcel2007以降のバージョンを使用している場合の回答です。 Officeソフトはバージョンによって使用できる機能や操作方法が大きく異なるので、質問の際には必ずバージョンを明記するようにしましょう。

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

=MODE(IF($A$1:$A$100="AA",$B$1:$B$100,"")) =MODE(IF($A$1:$A$100="BB",$B$1:$B$100,"")) とすればいいです。 配列数式ですので、CtrlキーとShiftキーを押しながらEnterするのを忘れないようにしてください。

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

C2にAA、C3にBBと入力してあるとして、 D2のセルに以下のように入力、Ctrl+Shift+Enterで確定し、D3にコピー。 =MODE(IF($A$1:$A$100=C2,$B$1:$B$100,""))

ken6791
質問者

補足

早速の回答ありがとうございます。 C2にAA, C3にBBが入力していない場合はどうすればいいですか?

関連するQ&A

  • Excel特定文字抽出の関数を教えてください。

    Excelの特定文字からはじまる文字列を抽出したいです。 aa/bb(aa/は固定ですがbbは文字数を含めて可変します) また、aa/bbの前後にはほかの文字列(ccccやdddddなど)が入っています。 下記のような感じですが、aa/*****だけを抽出し何件あるか調べたいです。 最終的に結果のようにしたいのですが、関数かマクロを教えていただけますでしょうか? よろしくお願いします。 ・シート A1 ccc aa/bb ddddd     B1 gada aa/fasd haadf A2 rrrr aa/cccc nnaxxx B2 hjhafd aa/bb hfahfdha ・ ・ ・ ・結果 件数 aa/bb 2 aa/cccc 1 aa/fasd 1

  • エクセル リストアップ

    以下のような表があります。    1 2 3 4 5 aa 20 25 45 20 38 bb 16 98 45 78 20 cc 20 45 20 66 44 dd 44 20 13 20 89 この中から複数ある20(値)を検索し、 その位置を以下のようにリスト形式で 抽出できないでしょうか。 aa1 aa4 bb5 cc1 cc3 dd2 dd4 vlookup や match ではうまくいきません。 できれば関数でお願いします。

  • エクセル・順位関係のデータ抽出

    エクセルの関数に関する質問です。 名前 1点数 1順位 2点数 2順位 ○○  ○   ○   ○   ○  ○○  ○   ○   ○   ○  ○○  ○   ○   ○   ○  となっている表がsheet1にあったとき、1順位と2順位のいずれかが20位以内に入る人のデータだけを集めた表を、sheet2に抽出したいです。関数などを用いて、sheet1の表にデータを入れ込めば一発で結果がsheet2に表示されるようなフォーマットを作りたいのですが、方法を教えてください。

  • エクセルで抽出した結果の最早時間取り出し

    エクセルの表において、該当の日付の中から、一番早い時間を抽出したいのですが、どういう関数を使ってどう書けばいいのでしょうか。 具体的には、以下のようにA列に日付があり、1行目に該当日付(抽出日付)が あるとして、2行めに抽出結果を出したいです。 計算結果 (1) "" (2) 15:00 (3) 07:29 (4) 15:45 (5) 03:45 以上、よろしくお願いします。

  • エクセル 行にある項目を抽出

    間違えて他のカテゴリーで質問してしまいました。 そちらは閉めましたので改めてこちらで質問させてください。 エクセルで下記のような表から項目を抽出したいのですが うまくいきません A列 りんご みかん りんご ぶどう みかん と入力されていて任意のセルに、A列に入力されている項目から 重複分を除き抽出したいです 具体的には任意セルに「りんご、みかん、ぶどう」と抽出したいのです。 フィルタオプションを利用し、抽出することはできました。 また、それをマクロ登録すれば、A列に追加項目があっても 自動変更できるという、回答も頂き、確かにできたのですが、 このエクセルから、ハイパーリンクでワードへ飛ばしたり、 いろいろと込み入っているため、できれば、 マクロではなく、関数利用をしたいのですが、 どのような関数を利用すればよいのかわかりません。 ご存知でしたら、ご教示お願いいたします。

  • 複数の表を切り替えて抽出する方法について(Excel)

    エクセルで、複数の表を切り替えて抽出する方法を色々考えてみました。はじめは、Lookup関数を使いましたが、特定の文字に対となるものを抽出するにはIndex関数とMatch関数の組み合わせがいいことが分かりました。しかし、複数の表を切り替えるとなると、やっぱり、If関数の階層化となってしまいます。名前の定義を使って切り替えようかとも思いましたが、途方にくれてしまいました。ユーザー関数の方がいいのかも??って感じで、考えがまとまりません。どなたか?詳しい方、お知恵を拝借できないでしょうか?宜しくお願いします。イメージとしては、 =選択抽出(表の名前,検索列名前,検索文字列,抽出列名前)ってな感じで、表の名前を変更することにより任意の表を選べ、検索列名前、を変更することにより表の中の任意の列を選べる、(抽出も同じ)てな感じで、任意の表の任意の列を検索し、任意の列から抽出するってな、万能なユーザー関数を模索しています。 ヒントだけでもいいので、拝借お願い致します。 (イメージは、エクセルの名前定義を使う方法が正しいものとしての仮定での話です)宜しくお願い致します。

  • エクセル2003@(ちょい難)別シートからある固定値の全セルを抽出し、同じ列にある値を合計する

    お世話になります。 エクセルは簡単な関数が扱える程度です。 2時間近くググったり質問サイトの過去ログを 調べたりしても解決出来なかった計算があるので、 ご教授の程よろしくお願い致します。 やりたいことの説明 ↓(ここから) ================================== (1)シート1に次のような表を作成     |A列|B列| ----|---|---|---- 1行 |AA| 5 | 2行 |BB| 4 | 3行 |AA| 3 | 4行 |CC| 7 | 5行 |CC| 9 | 6行 |BB| 6 | (2) シート2の任意、例えばC1に「AA」と入れる。 この時、シート1のA列の中に「AA」が含まれる行を全て抽出し、 その隣のセルの値の合計をシート1のセルに出力されるようにしたい。 例えばこの場合だと、シート2のC1に「AA」と入れることにより、 シート1のB1(値は5)とB3(値は3)を加算し、シート2のD1に計算結果(値は5+3で8)を出力したい。 ================================== ↑(ここまで) 以上、宜しくお願い致します。 質問の内容がちょいややこしいので、 分かり辛ければエクセルの画像をつけて 説明させていただこうと思います。

  • spreadsheetで特定行のみ抽出する関数等

    googlleのspreadsheetで特定行のみ抽出する関数等はありますか?(EXCELでもよいです。似たようなのはあると思うので) 1 バナナ 2 りんご 3 いちご という表があったとして、ある店では、1と3しか売っていない。その際、その店用の 1 バナナ 3 いちご という詰めた表(チェック表)を作る、というのが必要な状況です。 表の項目(行)数は100くらい、店舗数は10くらいあります。 Excelでのやり方でも良いです。 もちろん、各店舗の表の方で、必要なものだけ番号を入れて、vlookupで項目名を引っ張ってくるというはできます。しかしこれだと、そのつど追加したり削除するごとに行をずらしたりする必要があるので、できれば(例えば)下記のようにしたいです。 〇をつけたものが選択される形 (基本の表1) 1 バナナ 2 りんご 3 いちご (選択するステップ 表2) 1〇バナナ 2 りんご 3〇いちご (結果としての表 表3) 1 バナナ 3 いちご この関数が使えるとか、他、何かヒントでもいただけるとありがたいです。

  • エクセル2000 データ抽出

    毎回、関数についての質問コーナーは閲覧させて頂いております。 昨日より、私が解決できないエクセルでのデータ抽出方法を色々と検索して、探して見ましたが見当たりません。どなたか詳しい方がいましたらアドバイスを頂ければと思ってます。 私が、エクセルでデータ抽出したいのはですね。。 一つのエクセルファイルは、日々更新されて(手入力で)いく、いわゆる、進捗管理表。 入力項目:日付、名前、学校名、合・否・条件付き・補習、その他色々。。 もし、その生徒が合格or条件付きor補習だったら(不合格以外)、学校ごとの他のエクセルファイルへ、データを自動で抽出できる。。 そんな、機能的な数式はありますか? アクセスは、使ってはいけないそうです。 教えてください。または、以前これと同じ様な質問をして回答されたページを教えてください。 お願いいたします。

  • アクセスにおける行の抽出

    お世話になります。 アクセスにて行を抽出したいのですが、どのようにしたらよいのか悩んでます。 教えていただけますでしょうか? 以下のようなデータがあります。 場所    色 ----------------- 東京    赤 東京    青 秋田    白 秋田    緑 秋田    青 大阪    青 大阪    白 福岡    青 色の優先順位 1.赤 2.青 3.白 4.緑 で、 東京の場合、「東京 赤」 秋田の場合、「秋田 青」 大阪の場合、「大阪 青」 福岡の場合、「福岡 青」(福岡は1行なので、ダイレクトに行を抽出する。) という具合に行を抽出したいのですが、 この場合、クエリにて条件を設定すると思いますが、どのようにしたらよいでしょうか? たぶんiif関数を使うのかなと思いますが・・・・・・ またこの元データはエクセルで、2つのエクセルデータを統合して新たな表を作るイメージです。 もちろんエクセルで作成できてもいいのですが、データを操るにはアクセスと思っておりますので、なんとかアクセスできないか思案しております。 よろしくお願いします。

専門家に質問してみよう