• ベストアンサー

EXCELの複数条件の抽出について

下記のような表で それぞれ(AさんBさんCさん)の来店回数を計算したいのです。 注意点としては、「日付が同じ場合は来店を1回とする」です。 もし、表を変えたほうがよい場合は、まだ作成途中なので、助言いただければ、変更しようとも思っております。 A    B     C 日付   氏名    品名 5/2   A    ピラフ        A    ケーキ        B    コーヒー 5/4   C    ピラフ        B    コーヒー 5/9   D    ケーキ 似たようなものを探してみたのですが、どうもうまくいきません。 どうぞよろしくお願いします。  

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

  • ベストアンサー
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.4

>表を変えたほうがよい場合は、まだ作成途中なので、 >助言いただければ、変更しようとも思っております。 一般論としては、日付列はきちんと埋めておいた方が良いですね。 日付列が埋まっていれば、ピボットテーブルも使えますし、 数式で処理するのに手間がかかりません。 日付を入力する手間が問題なら、 A2セルを =A1 としてあらかじめフィルしておけば、 手打ちした部分以降が自動的に同じ日付になります。 日付列の見た目が問題なら、 条件付き書式で文字色や罫線を制御することもできます。 ----------------------------------------------------- ●甲案:日付欄を埋めて数式で処理(参考画像) 1.作業列  D2セル : =IF(COUNTIF(INDEX(B:B,MATCH(A2,A:A,0),1):B2,B2)=1,B2,"") として下方にフィル ※同日2回目以降の注文(?)が消えます。 2.結果(F列に集計用の氏名があるとして)  G2セル : =COUNTIF(D:D,F2) ----------------------------------------------------- ●乙案:日付欄を埋めずに数式で処理 1.作業列1  D2セル : =IF(A2="",D1,A2) として下方にフィル ※直近の日付が返るので、後は甲案と同じです。 2.作業列2  E2セル : =IF(COUNTIF(INDEX(B:B,MATCH(D2,D:D,0),1):B2,B2)=1,B2,"") として下方にフィル 3.結果(G列に集計用の氏名があるとして)  H2セル : =COUNTIF(E:E,G2) ご参考まで。

riri0707
質問者

お礼

画像までつけてくださり、本当にありがとうございます! すごくわかりやすく、しかも私の知っている関数などで処理できるので、問題が解決できます! 関数もうまく組み合わせると、きちんと処理できるんですね。 もっと勉強します。ありがとうございました!

その他の回答 (3)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

作業は少々複雑ですが一度設定すれば追加入力した結果が即座に表示されますので関数のみで対応する方法を提案します。 A,B,C列の1行目に項目名がデータは2行目から入力されているとします。 D2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(B2="","",IF(A2<>"",B2&"/"&A2,IF(A2="",B2&"/"&RIGHT(D1,LEN(D1)-FIND("/",D1)),""))) E2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(D2="","",IF(COUNTIF(D$2:D2,D2)=1,LEFT(D2,FIND("/",D2)-1),"")) F2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(E2="","",IF(COUNTIF(E$2:E2,E2)=1,MAX(F$1:F1)+1,"")) 最後にお望みの表をH,I列に表示させるとします。 H1セルには氏名、I1セルには来店回数と入力します。 H2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(COUNTIF(F:F,ROW(A1))=0,"",INDIRECT("E"&MATCH(ROW(A1),F:F,0))) I2セルには次の式を入力し下方にオートフィルドラッグします。 =IF(H2="","",COUNTIF(E:E,H2)) これで完成ですが作業列が見障りでしたら列を非表示にすればよいでしょう。

riri0707
質問者

お礼

すごいです! 関数だけで処理できると思っていなかったので・・・・。 もっと勉強しないといけないと、実感してしまいました。 ありがとうございます、参考にさせていただきます。

  • tru_sat
  • ベストアンサー率66% (2/3)
回答No.2

この表のままで、かつマクロ等を使わず、Excelの関数だけでやるなら以下の方法はどうでしょう。 まず、ピボットテーブルで、縦軸を日付、横軸を氏名にして集計対象を氏名にします。 そうすると、以下のようになります。  日付  A  B  C  D  総計  5/2 2  1        3  5/4    1  1     2  5/9          1  1  総計  2  2  1  1  6 次にこのピボット表で、列ごとにcountA()で値がある個数を求めます(総計行以外)。 そうするとAは5/2のところだけに"2"という値があるのでcountA()の値は1となります。 またBは5/2と5/4のところにそれぞれ1という値があるのでcountA()の値は2となります。 このように表中の値が何であれ(1日に10回来て値が10でも)、countA()は値があるかどうかだけをカウントするので、同一人物が1日に何回来ても、1にすることができます。 ピボット&countA()の2段階ですが、これならマクロなどの知識も要らず、簡単かなと。 思いつきなのでもっとよい方法があるかも知れませんがご参考まで。

riri0707
質問者

お礼

ピボットテーブルで・・・しかも、わたしの知っている関数で そういう風にするとできるんですね! すごく参考になりました、本当にありがとうございます!

  • Hachi5592
  • ベストアンサー率36% (252/698)
回答No.1

ピボットテーブルを使用してはいかがでしょうか? 日付と氏名を行に、データに氏名をレイアウトにすると 目的の結果が得られます。

riri0707
質問者

お礼

なるほど!ピボットテーブルですか・・・。 気づきませんでした。ありがとうございます! 知ってはいましたが、あまりうまく使いこなせてなくて。 ありがとうございます!

関連するQ&A