- ベストアンサー
Excelのカウントについて(複数条件)
- ExcelのCOUNTIF関数を使って、複数条件のカウントを簡潔にする方法について教えてください。
- Excelの表で、A列の特定の条件に一致するセルの数をカウントする方法を効率的に行いたいです。
- ExcelのCOUNTIF関数を使用して、順番が違っても同じ数字でできているセルをカウントする方法を知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
下の式が、数式的には一番シンプルかと・・・配列使っているのでシンプルと言っていいのかな? =SUMPRODUCT(ISNUMBER(FIND(1,$A$1:$A$5))*(ISNUMBER(FIND(2,$A$1:$A$5)))*ISNUMBER(FIND(3,$A$1:$A$5))) 簡単に説明するとSUMPRODUCT関数は、1,2,3,4といった配列の積を計算する関数です。 また、trueを「1」としてfalseを「0」として認識するようにできています。 上記の式を簡単に説明するとしたの4ステップを踏んで計算しています。 (1) 「1」をあるかどうかをfind関数で調べる (2) (1)の結果が数値であるかどうかをISNUMBERで調べる ない場合は、(1)でエラーとなっていますのでfalseが返るので「0」あれば、trueなので「1」です。 (3) (1)(2)の内容を「1」「2」「3」それぞれに対して行っていて、その結果をすべて掛けます。 すると、「1」「2」「3」のすべて含まれていれば「1×1×1=1」となります。 しかし、一つでも含まれていいなければどこかで「0」を掛けることになるので 結果は「0」となります。 (4) (1)~(3)の内容を参照しているセルぞれぞれに行ってその結果を配列として扱いますので 結果的に「0」が「1」しか含まない配列が出来上がっています。 その配列を、積するので「1」の総数が出てきます。 提示いただいたケースだと「1、1、0、1、1」の配列が出来上がっていますので 「1+1+0+1+1=4」となります。 上記の説明でイメージできなかったら、SUMPRODUCT関数の詳細な説明がされているHPなどを 参照されるといいと思います。 う~ん、配列を文書だけで説明しきる文章力がなくてすいません・・・w
その他の回答 (4)
- KURUMITO
- ベストアンサー率42% (1835/4283)
お示しの表が2行目から下方にあるとします。 B列は作業列でB2セルには次の式を入力して下方にオートフィルドラッグします。A6セルまでデータがあるとしたらB6セルまでオートフィルドラッグします。 =IF(SUMPRODUCT((ISNUMBER(FIND(TRIM(MID(SUBSTITUTE(A2,"-",REPT(" ",100)),1,10)),A$2:A2))*ISNUMBER(FIND(TRIM(MID(SUBSTITUTE(A2,"-",REPT(" ",100)),100,10)),A$2:A2))*ISNUMBER(FIND(TRIM(MID(SUBSTITUTE(A2,"-",REPT(" ",100)),200,10)),A$2:A2))))=1,MAX(B$1:B1)+1,"") A7セルにカウントを表示させるのでしたらA7セルには次の式を入力すればよいでしょう。 =MAX(B:B)
お礼
いろいろな方法がありますね。参考にさせていただきます。
- kagakusuki
- ベストアンサー率51% (2610/5101)
ANo.3の (1)1-2-3と1-2-30の識別 (2)1-2-3と1-2-3-3の識別 も可能にする関数は次の様になります。 =SUMPRODUCT(ISNUMBER(FIND("-1-","-"&$A$1:$A$5&"-"))*ISNUMBER(FIND("-2-","-"&$A$1:$A$5&"-"))*ISNUMBER(FIND("-3-","-"&$A$1:$A$5&"-"))*(LEN($A$1:$A$5)-LEN(SUBSTITUTE($A$1:$A$5,"-",))=2))
お礼
追記ありがとうございます。複数桁にも対応できるようにしていただき感謝です。
- prius770c
- ベストアンサー率35% (91/258)
No.2です。 追記ですが、先ほどの関数には次のような制約がありますのご注意を (1)1-2-3と1-2-30の識別はできません。 (2)1-2-3と1-2-3―3の識別はできません。 そのため、使用する場合の前提として (1)ハイフン以外の数値は一桁であること (2)一桁の数値は、3つであること ※こちらは、先ほどの回答の(3)の部分を3回から変更すれば対応できます。
お礼
詳細にお知らせいただきありがとうございます。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! なかなかいい案が浮かばないので、VBAで無理矢理やってみました。 尚、余計なお世話かもしれませんがA列データが何行あっても対応できるようにしています。 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Columns("B:F").Insert Dim i As Long i = Cells(Rows.Count, 1).End(xlUp).Row If Not Cells(i, 1) Like "*-" Then Cells(i, 1).ClearContents End If Range(Cells(1, 1), Cells(i, 1)).Copy Cells(1, 2).Select ActiveSheet.Paste Columns(2).Select Selection.TextToColumns Destination:=Cells(1, 2), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _ "-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _ TrailingMinusNumbers:=True For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row On Error Resume Next Cells(i, 5) = WorksheetFunction.Min(Range(Cells(i, 2), Cells(i, 4))) & "-" & _ WorksheetFunction.Small(Range(Cells(i, 2), Cells(i, 4)), 2) & "-" & _ WorksheetFunction.Max(Range(Cells(i, 2), Cells(i, 4))) Next i For i = 1 To Cells(Rows.Count, 5).End(xlUp).Row If WorksheetFunction.CountIf(Range(Cells(1, 5), Cells(i, 5)), Cells(i, 5)) = 1 Then Cells(i, 6) = 1 End If Next i Cells(Rows.Count, 1).End(xlUp).Offset(1).Select Selection = WorksheetFunction.Sum(Columns(6)) Columns("B:F").Delete End Sub 'この行まで 一部マクロの記録をそのまま使っています。 尚、A列データ内の「-」は二つまでとしています。(それ以上ある場合はコードが変わってきます) 他に良い方法があればごめんなさいね。m(__)m
お礼
ありがとうございます。 VBAまでは考えてませんでしたが、こういった方法もあるのかと思いました。参考にさせていただきます。
お礼
=SUM(COUNTIF(A1:A5,"1-2-3","1-3-2","2-1-3","2-3-1","3-1-2","3-2-1"})) と、すっきりできたものの組合せを書かなきゃ行けないのが面倒でしたが、教えていただいた方法ですと簡単ですね。また、詳細な解説もありがとうございます。参考にさせていただきます。