2013-08-20 11 views
6

Wie kann ich die Anzahl der Vorkommen für einen gewissen Bereich erhalten basierend aufCount Anzahl der Vorkommen basierend auf 2 Bedingungen oder Regexp

1) ein regulärer Ausdruck

2) 2+ Bedingungen (wir Zellen sagen, die enthalten „ja“ und/oder „nein“)

Was ich im Moment habe:

COUNTIF(B5:O5; "*yes*") 

ich versuchte COUNTIF(B5:O5; {"*yes*", "*no*"}) oder COUNTIF(B5:O5; "(*yes*)|(*no*)") zu verwenden, aber weder von der Ich habe gearbeitet.

Oder, wie zähle ich Zellen, die einige Domain-Namen enthalten - yahoo.com hotmail.com und gmail.com mit regexp? zB:

(\W|^)[\w.+\-]{0,25}@(yahoo|hotmail|gmail)\.com(\W|$) 

UPDATE:

Der einfachste Weg, fand ich ist eine benutzerdefinierte Funktion für diese Zwecke zu erstellen, I 2 hinzugefügt, die perfekt funktionieren für mich und hoffe, dass es jemanden helfen wird:

/** 
* Count if cell value matches any condition (supports regexp also) 
*/ 

function countCustomMatchOr(data){ 
    var count = 0; 
    for(var i=0; i < data.length; i++){ 
    for(var j=0; j<data[i].length; j++){ 
     var cell = data[i][j]; 
     for(var k=1;k<arguments.length;k++){ 
     if(typeof arguments[k] == "number"){ 
      if(arguments[k] == cell) count++; 
     } else if(cell.toString().match(arguments[k])) count++; 
     } 
    } 
    } 
    return count; 
} 

Und

/** 
* Counts value in data range if matches regular expression 
*/ 

function countCustomRegExp(data, reg, flag){ 
    var rows = data.length, count = 0, re = flag?new RegExp(reg, flag):new RegExp(reg); 
    for(var i = 0; i < rows; i++){ 
    for(var j = 0; j < data[i].length; j++){ 
     if(data[i][j] != "" && data[i][j].toString().match(re)){ 
     count++; 
     } 
    } 
    } 
    return count; 
} 

um zu nutzen sie countCustomRegExp(A2:G3;"yes.*") oder countCustomMatchOr(A2:G3;"yes";"no") nur anwenden

+1

Ich weiß, dass dies eine alte Frage ist, aber es könnte besser sein, Ihre Lösung als Antwort anstatt als Bearbeitung hinzuzufügen. –

Antwort

10

Die Fußgänger Lösung für Ihr Problem (getestet in Excel und Google Text & Tabellen), um das Ergebnis von mehreren countif Formeln einfach hinzuzufügen ist:

=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*") 

wird dieser Ausdruck die Gesamtzahl von Zellen mit "Ja" oder "Nein". Es zählt doppelt eine Zelle mit "yesno" oder "noyes", da es beide Ausdrücke zusammenbringt. Sie könnten versuchen, das Doppel zu nehmen mit

=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*") - COUNTIF(B5:O5, "*no*yes*") - COUNTIF(B5:O5, "*yes*no*") 

Aber das werden Sie noch mit einem String wie noyesno in Schwierigkeiten geraten.

Allerdings gibt es einen ziemlich cleveren Trick in Google Text & Tabellen, die nur ein Hauch von der Lösung sein können, die Sie suchen:

=COUNTA(QUERY(A1:A9, "select A where A matches '(.*yes.*)|(.*no.*)'")) 

Die QUERY Funktion ist wie eine Mini-Datenbank Sache. In diesem Fall betrachtet es die Tabelle im Bereich A1:A9 und wählt nur die Elemente in der Spalte A aus, in denen das entsprechende Element in der Spalte A matches (in der preg regex Bedeutung des Wortes) der folgende Ausdruck ist - in diesem Fall "alles gefolgt von gefolgt von irgendetwas oder irgendetwas gefolgt von no gefolgt von irgendetwas ". In einem einfachen Beispiel, das ich gemacht, zählt dies ein yesnoyes nur einmal - es genau machen, was Sie fragen (glaube ich ...)

Gerade jetzt B5:O5 Ihre Reichweite breit mehrere Spalten ist und nur eine Zeile hoch; das macht es schwer, den QUERY Trick zu verwenden.Etwas eher weniger elegant (aber das funktioniert unabhängig von der Form des Bereichs) ist dies:

=countif(arrayformula(isnumber(find("yes",A1:A9))+isnumber(find("no",A1:A9))),">0") 

Die Summe der isnumber Funktionen fungiert als elementweise OR - leider ist die regelmäßige OR Funktion scheint nicht um an einzelnen Elementen eines Arrays zu arbeiten. Wie zuvor findet dies Zellen, die entweder "ja" oder "nein" enthalten, und zählt diejenigen, die eine dieser Zeichenfolgen enthalten.

+0

Wusste nicht über diese coole Abfrage! –

Verwandte Themen