如何根据以下内容获取某些范围的出现次数
我现在得到的是:
COUNTIF(B5:O5; "*yes*")
我试图使用COUNTIF(B5:O5; {"*yes*", "*no*"})
或COUNTIF(B5:O5; "(*yes*)|(*no*)")
,但它们都没有奏效。
或者,我如何计算包含一些域名的单元格-yahoo.com,hotmail.com和gmail.com-使用正则表达式?例如。:
(\W|^)[\w.+\-]{0,25}@(yahoo|hotmail|gmail)\.com(\W|$)
解决问题的最行人解决方案(在Excel和Google Docs中测试)只需添加几个countif
公式的结果:
=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*")
此表达式将使用“是”或“否”计算单元格的总数。它将使用“yesno”或“noyes”对单元格进行双重计数,因为它匹配两个表达式。你可以尝试拿出双打
=COUNTIF(B5:O5, "*yes*") + COUNTIF(B5:O5, "*no*") - COUNTIF(B5:O5, "*no*yes*") - COUNTIF(B5:O5, "*yes*no*")
但是这仍然会让你遇到像noyesno
这样的字符串。
然而,Google Docs中有一个相当聪明的技巧,可能只是提示您正在寻找的解决方案:
=COUNTA(QUERY(A1:A9, "select A where A matches '(.*yes.*)|(.*no.*)'"))
QUERY
函数就像一个迷你数据库的东西。在这种情况下,它查看范围A1:A9
中的表,并且仅选择列A中的元素,其中列A中的对应元素matches
(在preg regex
意义上的单词)后面的表达式 - 在这种情况下,“任何后跟yes
随后是任何东西,或任何随后no
后跟任何东西“。在我做的一个简单的例子中,这只计算一次yesnoyes
- 使它完全符合你的要求(我认为...)
现在你的范围B5:O5
是几列宽,只有一行高;这使得很难使用QUERY
技巧。不那么优雅的东西(但无论范围的形状如何都有效)是这样的:
=countif(arrayformula(isnumber(find("yes",A1:A9))+isnumber(find("no",A1:A9))),">0")
isnumber
函数的总和充当元素OR
- 不幸的是,常规的OR
函数似乎不适用于数组的各个元素。和以前一样,这会找到包含“是”或“否”的单元格,并计算包含其中任何一个字符串的单元格。
这很大程度上受到Floris's answer的启发。特别参见评论。如果你TRANSPOSE
要比较的项目行,QUERY
也适用于水平数据:
=COUNTA(QUERY(TRANSPOSE(B5:O5), "select * where Col1 matches '.*(yes|no).*'"))
据我所知,Col1
是“特殊的”并且区分大小写!
我有同样的问题,如果你不想使用VBA
,尝试添加一个SUM
到你的公式:=SUM(COUNTIF(B5:O5; {"*yes*", "*no*"}))
NGinx发现的最简单方法是为这些目的创建自定义功能。他们添加了2个对他们完美的工作,并希望它也能帮助别人:
/**
* 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;
}
和
/**
* 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;
}
为了使用它们,只需使用countCustomRegExp(A2:G3;"yes.*")
或countCustomMatchOr(A2:G3;"yes";"no")