2013-08-20 10 views
6

Jak mogę uzyskać liczbę wystąpień dla pewnego zakresu oparciu oLiczba zdarzeń na podstawie 2 warunków lub regexp

1) wyrażenie regularne

2) 2+ warunki (powiedzmy komórki zawierające "Tak" i/lub "nie")

Co mam w tej chwili:

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

Próbuję użyć COUNTIF(B5:O5; {"*yes*", "*no*"}) lub COUNTIF(B5:O5; "(*yes*)|(*no*)"), ale żadna z m pracował.

Lub jak zliczyć komórki zawierające niektóre nazwy domen - yahoo.com hotmail.com i gmail.com za pomocą regexp? np:

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

UPDATE:

Najprostszym sposobem znalazłem jest utworzyć funkcję niestandardową dla tych celów, dodałem 2, który działa idealnie dla mnie i mam nadzieję, że to pomoże komuś też:

/** 
* 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; 
} 

I

/** 
* 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; 
} 

W celu wykorzystywać je tylko zastosować countCustomRegExp(A2:G3;"yes.*") lub countCustomMatchOr(A2:G3;"yes";"no")

+1

Wiem, że to stare pytanie, ale lepszym rozwiązaniem może być dodanie rozwiązania zamiast odpowiedzi. –

Odpowiedz

10

Najbardziej pieszych rozwiązanie problemu (testowane w Excelu i Google Docs) jest po prostu dodać wynik kilku countif wzorów:

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

To wyrażenie będzie liczyć łącznie komórek z "tak" lub "nie". Podwójnie policzy komórkę z "yesno" lub "noyes", ponieważ pasuje do obu wyrażeń. Można starać się deblu z

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

Ale to nadal będzie Ci kłopoty z ciągiem jak noyesno.

Jednak jest to dość sprytny trik w Dokumentach Google, które mogą być tylko wskazówką roztworu szukasz:

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

Funkcja QUERY jest jak mini rzeczy bazy danych. W takim przypadku przegląda tabelę w zakresie A1:A9 i wybiera tylko elementy w kolumnie A, w której odpowiadający element w kolumnie A matches (w znaczeniu słowa: preg regex) wyrażenie następujące po nim - w tym przypadku "wszystko po którym następuje yes po czym następuje cokolwiek, lub cokolwiek innego, po którym następuje no, po którym następuje cokolwiek ". W prostym przykładzie, który zrobiłem, liczy się tylko jeden raz - czyniąc go dokładnie tym, o co prosiłeś (myślę ...)

W tej chwili twój zakres B5:O5 ma kilka kolumn szerokości i tylko jeden wiersz jest wysoki; to sprawia, że ​​trudno jest użyć sztuczki QUERY.Coś raczej mniej elegancki (ale który działa niezależnie od kształtu zasięgu) jest taka:

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

Suma funkcji isnumber działa jako element mądry OR - niestety regularne OR funkcja nie wydaje do pracy nad poszczególnymi elementami tablicy. Tak jak poprzednio, znajduje komórki zawierające "tak" lub "nie" i zlicza te, które zawierają jeden z tych łańcuchów.

+0

Nie wiedziałem o tym fajnym zapytaniu! –

Powiązane problemy