web-dev-qa-db-ja.com

COUNTIFにOR条件を含めますか?

この質問は以前に尋ねられたものであり、答えは常に2つのCOUNTIFを足し合わせることであるようです。これはほとんどのアプリケーションで問題ありませんが、私には機能しません。

0、1、またはそれ以上の有効なトークンと0、1、またはそれ以上の無効なトークンを含むことができる列があります。たとえば、A、B、Cが有効なトークンで、D、E、Fが無効な場合、次の表の「トークン」列のようなデータが表示される可能性があります。さまざまな解釈を示すために、「ValidCount」列と「Valid」列を追加しました。

    ╔======╦=======╦============╦=======╗
║行番号║トークン║ValidCount║有効な║
╠======╬=======╬============╬=======╣
║ 1║A、E║1║True║
║2║║0║False║
║3║B║1║True║
║ ║偽║
║5║A、B、C║3║真║
║6║C║1║真║
╚====== =====╩============╩=======╝

有効なトークンのインスタンスを次のように数えることができます(生データが「Raw」というシートにあり、トークンが列ADにあり、問題のトークンが「Summary」というシートのセルA30にある場合)。

=COUNTIF(Raw!$AD$2:$AD$79,CONCATENATE("*",Summary!$A30,"*"))

問題は、有効なトークンごとにこれを実行して合計すると、有効なトークンの総数がカウントされることです。 私がやりたいのは、少なくとも1つの有効なトークンを持つセルの数を取得することです。上記の例を使用すると、正解は6ではなく4です。

私がやりたいのは、次のようなOR関数を使用することです。

=COUNTIF(Raw!$AD$2:$AD$79,OR(CONCATENATE("*",Summary!$A30,"*"),CONCATENATE("*",Summary!$A31,"*"),[...snip...]))

しかし、これは0を与えます。

これを行う方法はありますか?理想的には、VBAに頼ることなく。

3
Tom Wright

考えられる2つの数式アプローチを次に示します。「有効なトークン」がセルSummary!A30:A32に(各1つ)表示されている場合は、このバージョンを使用できます。

=SUMPRODUCT((ISNUMBER(SEARCH(Summary!A30,Raw!$AD$2:$AD$79))+ISNUMBER(SEARCH(Summary!A31,Raw!$AD$2:$AD$79))+ISNUMBER(SEARCH(Summary!A32,Raw!$AD$2:$AD$79))>0)+0)

または、より広い基準範囲でより簡単に「拡張可能」になり、この配列式を試してください

=SUM((MMULT(ISNUMBER(SEARCH(TRANSPOSE(Summary!A30:A32),Raw!$AD$2:$AD$79))+0,{1;1;1})>0)+0)

CTRL+SHIFT+ENTERで確認

{1; 1; 1}は基準範囲の長さに一致する必要があり、TRANSPOSEは基準範囲が垂直である場合にのみ必要です。

3
barry houdini

おそらくすべてのゼロを見つけて、これを合計から引くことができますか?

私が考えているのは:

=counta(Raw!$AD$2:$AD$79)-countif(Raw!$AD$2:$AD$79,0)

[範囲_AD2:AD79_に空白セルがないと想定しています]

それはあなたが欲しいものを私に与えているようです。確認してもらえますか?

EDIT:さて、あなたの初期データは[〜#〜] all [〜#〜]あなたが実際に持っているものではないようです、それで、アプローチを変えてください。

この数式を1つの追加列(セル_C2_)で提案します。

=IF(AND(ISERROR(FIND("A",B2)),ISERROR(FIND("B",B2)),ISERROR(FIND("C",B2))),0,1)

これにより、A、B、またはCのいずれかがセル_0_にない場合は_B2_が得られ、セル_1_にある場合は_B2_が得られます。

一番下までドラッグします。 Excelのステータスバーに合計が表示されます。または、列で=SUM()関数を使用することもできます。

1
Jerry

私の最初の考えはCOUNTIFS関数を使用することでしたが、そのANDs基準を一緒に使用しました。 ORは正しい考えですが、お気づきのとおり、OR基準内のセル値はテストされません。

私が思いついたのは、VBAを使用することだけでした。サンプルトークンをワークシートの最初の6行に配置して、このコードを思いつきました。数式としても使用できる新しい関数に簡単に変更できます。

 Sub CountTokens()
 
 Dim count As Integer 
 Dim token As String 
 Dim tokens As Variant 
 
 Sheet1.Range( "A1:A6")
トークンの各セルについて= Split(Cell.Value、 "、")
 For tIndex = LBound(tokens)To UBound(tokens)
 token = tokens(tIndex)
 If token = "A" Or token = "B" Or token = "C" Then 
 count = count + 1 
終了For 
 End If 
 Next tIndex 
 Next Cell 
 
 MsgBox "Count:"&count 
 
 Endサブ
0
Brad Patton