• 締切済み

エクセルの関数の質問です。

エクセルの関数の質問です。 1日の案件数を求めるのは簡単ですが、同顧客が1日に何度も混在する場合の1日の顧客数の 求め方がわかりません。 種類の数え方の応用編でしょうか?どなたか教えてください! エクセルでsheet1のA2からA400までが顧客番号(文字列。空白含む。)、B2からB400までが日付(1日から31日)(1から31の数値。空白含む。)、sheet2のA2からA32までが1日から31日まで、のとき、sheet2のB2からB32にその日ごと(B2ならA2(1日))の顧客数を出す数式を教えてください。 ※sheet1の顧客番号、日付は、同じ顧客番号、同じ日付も含まれ、混在しています。 ついでにsheet2のC2からC32までに1日の案件数も出したいです! 例) sheet1 A  B 05 1日 05 1日 03 1日 01 1日 01 2日 01 2日 06 2日 05 2日 03 2日 sheet2 A   B   C 1日 3名  4件 2日 4名  5件 3日 0名  0件 4日 0名  0件 sheet2のBとCを数式にしたいです。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

#4の回答者です。(マクロでの解決法) ブックは重くなることはありませんが、配列数式と同じく、ブックを開くと再計算が要求されます。 Sheet2 A列 1日 2日 3日 4日 B列の数式 =mySumIf(Sheet1!$B$1:$B$9,A1,Sheet1!$A$1:$A$9) Function mySumIf(rng1, sText, rng2) As Long '件数を出すためのユーザー定義関数  Dim ar() As Variant  ReDim ar(0): ar(0) = -1  For i = 1 To rng1.Rows.Count   If Trim(rng1.Cells(i, 1).Text) = sText Then    buf = rng2.Cells(i, 1).Value    If i = 1 Then     ReDim Preserve ar(j)     ar(j) = buf     j = j + 1    ElseIf IsError(Application.Match(buf, ar, 0)) Then     ReDim Preserve ar(j)     ar(j) = rng2.Cells(i, 1).Value     ReDim Preserve ar(j)     ar(j) = rng2.Cells(i, 1).Value     j = j + 1    End If   End If  Next  If ar(0) <> -1 Then   mySumIf = UBound(ar) + 1  End If End Function C列は、同じ C1;=COUNTIF(Sheet1!$B$1:$B$9,Sheet2!A1) なお、1日、3名、4件 の接尾辞は、少なくとも、日付以外は、ユーザー定義書式で処理したほうがよいかもしれません。

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

こんにちは! 一例です。 ↓の画像で説明します。 Sheet1に作業用の列を2列設けています。 作業列C2セルに =A2&B2 D2セルに =IF(COUNTIF($C$2:C2,C2)=1,1,"") という数式をいれ、C2・D2セルを範囲指定し、D2セルのフィルハンドルでオートフィルで下へずぃ~~~!っとコピーします。 そして、Sheet2のB2セルに =SUMPRODUCT((Sheet1!$B$2:$B$1000=A2)*(Sheet1!$D$2:$D$1000=1))&"名" C2セルに =COUNTIF(Sheet1!$B$2:$B$1000,A2)&"件" という数式をいれ、B2・C2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 (エラー処理はしていません) 尚、数式はSheet1の1000行目まで対応できるようにしています。m(__)m

oideyanoto
質問者

お礼

ほったらかしですみません。。。 質問者です。 みなさん、素晴らしいご回答、ありがとうございました! 質問したのが初めてでして、どう皆さんにお礼をしたらよいものか、やり方がよくわかりません。。 本当にみなさんありがとうございます! 皆さんのおかげで解決しました! みなさん、本当に頭がいいですね!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

Sheet2 A1~ 1日 2日 3日 4日 B1~ =COUNT(INDEX(MATCH(ROW($A$1:$A$20),INDEX(SMALL((Sheet1!$B$1:$B$9=Sheet2!A1)*(Sheet1!$A$1:$A$9),ROW(INDIRECT("A"&COUNTIF(Sheet1!$B$1:$B$9,"<>"&Sheet2!A1)+1&":A"&COUNTA(Sheet1!$B$1:$B$9)))),,),0),,)) C1;=COUNTIF(Sheet1!$B$1:$B$9,Sheet2!A1) 上記の式は、小さな範囲で作られたもので、実際は、もっと大きな範囲ですると、かなり数式として重くなるはずです。おまけに、MATCH(ROW($A$1:$A$20)で、20名までしか探しません。これが、もっと多くなると、余計に重くなってしまいます。あまり大きなもので、補助列を使わない場合は、マクロによる処理のほうがよいのではないかと思います。

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

回答2です。大変失礼いたしました。シート1では作業列がC列でC2セルに式を入力して下方にオートフィルドラッグです。B2セルと回答2では記してしまいました。C2セルに訂正してください。

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

シート1には作業列を作って対応するのがよいでしょう。 B2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(COUNTA(A2:B2)<>2,"",1/SUMPRODUCT((A$2:A$400=A2)*(B$2:B$400=B2))) シート2ではB2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",SUMIF(Sheet1!B$2:B$400,A2,Sheet1!C$2:C$400)) C2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",COUNTIF(Sheet1!B$2:B$400,A2))

回答No.1

重複していないのであれば=count(検索範囲,検索条件)でできるとおもいます。 自分は5年ほどエクセルから離れているので若干曖昧ですが確かできたと思います。 別シートになっていても範囲を指定することができたはずです。 こんな感じで(sheet1!A$1:A$122,顧客番号) 参考にしてください。 参考URLのところで大体学びました。

参考URL:
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kih_moku.htm

関連するQ&A