- ベストアンサー
エクセルの関数でダブルカウントを避ける方法
エクセルの関数機能で回答お願いいたします! _______A_______B_______C_______D_______E_______F 1____品名___値____設定____下限___上限 2_____AA______1______(1)______0______1.6 3_____AB_____1.5_____(2)_____1.4_____2.1 4_____AC______2______(3)_____1.8_____2.2 5_____AD______1______(4)_____2.2_____2.6 6____AE______3____(5)_____2.5_____3.1 このような表があります。 AA~AEまで5つの商品があり、 それぞれに値があります。 それらを 下限(D列)≦ 値 <上限(E列) の範囲に 当てはまる 品数 をカウントしたいのですが これをカウントし、F列に答えを返すと、 (1)0~1.6の間には 3つ (2)1.4~2.1の間には 2つ (3)1.8~2.2の間には 1つ (4)2.2~2.6の間には 0つ (5)2.5~3.1の間には 1つ となり、下限と上限の間にある値をダブッてカウントしてしまうのです。 F列の縦合計が 品名の数と同じようになるように、ダブらずに集計したいのですが ダブらないでカウントする条件を設定したいのです。 たとえば 品名ABの場合、 下限と上限の範囲には 2つヒット(設定(1)と(2))してしまうので この場合、(1)の方にカウントし、(2)にはカウントしない という風にし、絶対にダブルカウントせずに下限と上限の間の設定が2箇所ヒットした場合 常に下限が小さい方にカウントさせる方法はないでしょうか? もしもっとシンプルに以上の解決策を ご存知でしたら是非それも教えてください。 よろしくお願いいたします!!!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。maruru01です。 F2に、 =COUNTIF(B:B,">=" & MAX(D2,$E$1:E1))-COUNTIF(B:B,">=" & E2) と入力して、下の行へコピーします。 質問欄の例だと、F2から順に、 3、1、0、0、1 になります。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
ユーザー関数を作って、素直に考えたとおりできないか考えました。 (1)規範となる区分けは、E1:F5に 0 1.6 1.4 2.1 1.8 2.2 2.2 2.6 2.5 3.1 あるものとします。(「値」データと、区分け表部分が 質問では一体化して記述説明されているので、わかり難いかったので、わけました。) (2)区分けは下限の昇順に並んでいるとします。 (3)ある「値」が決まったとき、上記区分けの何番目に 属するかを返すユーザー関数で作りました。(2)のお陰で初めに見つかった、区分けの番号を返せばよい。 このユーザー関数の作り方は、 ツールーマクロ-VBEで出てくる画面で、メニューの挿入-標準モジュールをクリックして出てくる画面に、コピペします。 Function bet(a, b) Dim cl As Range n = 1 For Each cl In b If a > cl And a <= cl.Offset(0, 1) Then bet = n Exit Function Else n = n + 1 End If Next bet = "" End Function (4)ワークシートで、A列に値が入っているとします。 B1セルに=bet(A1,$E$1:$E$5)と入れます。 (本番で区分けが多いと、$E$5の5が変ります。) B2以下に式を複写します。 結果は、下記(結果)のようになります。 (5)別のセル範囲で =COUNTIF(B:B,1) 19 =COUNTIF(B:B,2) 6 =COUNTIF(B:B,3) 1 =COUNTIF(B:B,4) 4 =COUNTIF(B:B,5) 6 (合計36です。) と式を5つのセルに入れると、上記右のような件数になります。 (結果) これはA1:B5の下記5つ(質問例)と 1 1 1.5 1 2 2 1 1 3 5 --- 0.1刻みのA6:B36の 0.1 1 0.2 1 0.3 1 0.4 1 ・・・・(途中略) 2.8 5 2.9 5 3 5 3.1 5 を数えたものです。
お礼
ありがとうございました。
補足
ありがとうございます。 早速試してみたのですが (4)の B1セルに=bet(A1,$E$1:$E$5)と入れます。 というところでB1セルに上の式を入れると B1~B5までのセルが結合され数式がそのまま表示されて しまいました。 もし良ければ補足でもう少し詳しく教えてもらえませんか?VBAの標準モジュールに貼り付けるだけで後は何もしないのでしょうか?教えてください。
- hakone
- ベストアンサー率54% (40/73)
勝手に条件を解釈して、 ・上限の列(E列)は必ず昇順に並んでいる。 (2行目が2.2で3行目が2.1というような逆転がない) ・データは必ず(1)~(5)の何処かに入る。 と仮定しました。 で、F2に =COUNTIF(B$2:B$6,"<="&E2)-SUM(F$1:F1) と書いて、下の方にコピーしてみて下さい。 上記の仮定が間違っていたら、答えも間違っています。
お礼
ありがとうございました。
- MSZ006
- ベストアンサー率38% (390/1011)
例えば1.4~2.1の間をカウントするときは、 「1.4~2.1の間のカウント数」-「1.4~1.6の間((1)(2)で重複している範囲です)のカウント数」 というような計算式にすればよいと思います。
お礼
ありがとうございました。
- mshr1962
- ベストアンサー率39% (7417/18945)
(1)0~1.6 (2)1.4~2.1 (3)1.8~2.2 (4)2.2~2.6 (5)2.5~3.1 上記の設定が (1)0~1.6 (2)1.6~2.1 (3)2.1~2.2 (4)2.2~2.6 (5)2.6~3.1 なら =SUMPRODUCT(($B$2:$B$6>=$D2)*($B$2:$B$6<$E2)) で出来ますが... 上限と下限が重なっている限りは不可能です。
お礼
ありがとうございました。
お礼
ありがとうございました! シンプルかつ正確な回答、 そのとおりにやってみたらできました! 例題に出したものは私がやっているものを 簡略化したものだったので さらに手を加えてちゃんと動くかどうかだけが 心配です・・・またできなかったら教えてください。