この質問は以前に尋ねられたものであり、答えは常に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に頼ることなく。
考えられる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は基準範囲が垂直である場合にのみ必要です。
おそらくすべてのゼロを見つけて、これを合計から引くことができますか?
私が考えているのは:
=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()
関数を使用することもできます。
私の最初の考えは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サブ