- ベストアンサー
[Excel]重複数のトップテンの作り方
- Excelの関数を使って重複したデータの「重複数のトップテン」を作成する方法について教えてください。
- 現在はCOUNTIFを使用していますが、より簡単な方法や参考になるURLがあれば教えてください。
- 具体的なデータの例を挙げながら、重複したデータの「日付」部分をカウントして、「モノが売れた日トップテン」を取得する方法を知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! 一例です。 >実際には、データ数は膨大ですので・・・ とありますので、これから説明する方法は不向きかもしれません。 (配列数式を使っています) とりあえずやり方だけ! ↓の画像のように作業用の列を設けています。 そして、B列の数式を少し変更します。 B2セルに =IF(COUNTIF($A$2:A2,A2)=1,COUNTIF(A:A,A2),"") 作業列C2セルに =IF(B2="","",IF(COUNTIF($B$2:B2,B2)=1,RANK(B2,B:B),"")) という数式を入れ、B2・C2セルを範囲指定しC2セルのフィルハンドルでずぃ~~~!っと下へコピーしておきます。 H3セルに =IF(COUNT(C:C)<ROW(A1),"",INDEX(B:B,MATCH(SMALL(C:C,ROW(A1)),C:C,0))) としれこれも下へコピー I3セル(配列数式になってしまいます)に =IF(OR($H3="",COUNTIF($B:$B,$H3)<COLUMN(A1)),"",INDEX($A$1:$A$1000,SMALL(IF($B$1:$B$1000=$H3,ROW($A$1:$A$1000)),COLUMN(A1)))) ※ この画面からI3セルにコピー&ペーストする場合はI3セルに貼り付け後、数式バー内で一度クリック! 編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 これを列方向と行方向にオートフィルでコピーすると 画像のような感じになります。 とりあえず1000行目まで対応できる数式にしていますが、 データ量によっては表のレイアウトを考え直すか、VBAでの方法が良いかもしれませんね。 今はこの程度しか思いつきませんが、 参考にならなかったらごめんなさい。m(_ _)m
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
関数式でやろうとすると、 (1)理解しにくい「多数の関数の組み合わせ」になり式が長くなる (2)配列数式というものになる たりする。 それでもよければ(コピペして、うまく行きました、ありがとう式の質問者がほとんど)だが)下記は無視して。 ーーー 作業列を使うことを提案したい 例データ 日付 品物 20XX/10/01 みかん 20XX/10/01 みかん 20XX/10/01 りんご 20XX/10/02 みかん 20XX/10/03 りんご 20XX/10/03 りんご II1に日付と入れる データーフィルターフィルタオプションの設定 指定した範囲 ON リスト範囲 $A$1:$A$7 衆出範囲$H$1:$H$100 重複するレコードは無視する ON 検索条件範囲は何も入れない。 ーー 結果 H列 と I列(=次のステップの結果) 日付 20XX/10/01 3 20XX/10/02 1 20XX/10/03 2 I2の式は =COUNTIF($A$2:$A$100,H2) <--A100の100などは適宜増やして 下方向に式複写。 結果上記I列。 ーー その中で一番件数が多いのは =LARGE(I2:I100,1) <--J10セルに入れるとする その日付は =INDEX($H$1:$H$100,MATCH(J10,$I$1:$I$100,0)) 20XX/10/01 2番目以降もLargeの第2引数の1を2にしたりする。連続した順位なら、ROW()-9などで式複写で導出できる。
お礼
回答ありがとうございます。 私の考えていた抽出手順と違い、 1.オートフィルタで、日付の重複データを省いたデータを取得 2.1で取得したデータをもとにCOUNTIFで重複数を取得 3.1と2で取得したデータからランキングを表示 といった手順でしょうか? 用いる関数式が簡略化されるので、良さそうですね。 この方法についても、実環境で試してみたいと思います。 有難うございました。
- kagakusuki
- ベストアンサー率51% (2610/5101)
今仮に、A1セルとI1セルに「日付」、B1セルに「商品名」、 G1セルに「ランク」、 H1セルに「カウント」、と入力されているものとし、D列とE列を作業列として使用するものとします。 まず、D2セルに次の数式を入力して下さい。 =IF(AND(ISNUMBER(INDEX($A:$A,ROW())),COUNTIF($A$1:INDEX($A:$A,ROW()),INDEX($A:$A,ROW()))=1),COUNTIF($A:$A,INDEX($A:$A,ROW())),"") 次に、E2セルに次の数式を入力して下さい。 =IF(ISNUMBER($D2),$D2+(MAX($A:$A)-INDEX($A:$A,ROW()))/MAX($A:$A),"") 次に、D2~E2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 次に、H2セルに次の数式を入力して下さい。 =IF(MIN(H$1:H1)=MIN($D:$D),"",LARGE($D:$D,COUNTIF($D:$D,">="&MIN(H$1:H1))*(ROWS($1:1)>1)+1)) 次に、G2セルに次の数式を入力して下さい。 =IF(ISNUMBER($H2),ROWS($2:2),"") 次に、I2セルに次の数式を入力して下さい。(I2セルの書式設定はA列のセルと同じ設定にして下さい) =IF(AND(ISNUMBER($H2),COLUMNS($I:I)<=COUNTIF($D:$D,$H2)),INDEX($A:$A,MATCH(LARGE($E:$E,COUNTIF($D:$D,">"&$H2)+COLUMNS($I:I)),$E:$E,0)),"") 次に、G2~I2の範囲をコピーして、同じ列の3行目以下に貼り付けて下さい。 次に、I列全体をコピーして、I列よりも右にある列の範囲に貼り付けて下さい。
お礼
回答ありがとうございます。 やはり関数式で表現すると、複雑なものになってしまうのですね。 お教えいただいた方法についても、実環境で試させて頂き、 検討してみたいと思います。 有難うございました。
お礼
回答ありがとうございます。 予想以上に複雑な関数式になるのですね。。。 まずは教えて頂きました方法を理解できるよう調べつつ、実環境で試してみたいと思います。 また、VBAを用いる方法も検討してみたいと思います。 アドバイス有難うございました。