Excel中如何统计A列或B列满足指定条件的行数(OR逻辑)
Excel多列OR条件计数方案
你要实现的「任意一列满足条件即计数、同一行多列满足也只算1次」的需求,可以用以下几种方案实现,按使用场景选择即可:
通用兼容公式(全Excel版本可用)
基于集合容斥原理计算,不需要高版本支持,也不需要启用宏:
=COUNTIF(A1:A100,"*shopping*")+COUNTIF(B1:B100,"*shopping*")-COUNTIFS(A1:A100,"*shopping*",B1:B100,"*shopping*")
逻辑说明:
- 先分别统计A列匹配、B列匹配的行数总和
- 减去两列同时匹配、被重复计数的行,最终结果就是OR逻辑下的准确行数
- 支持通配符匹配,和原生COUNTIF的条件写法完全一致
高版本简洁公式(Excel 365/2021及以上版本)
支持LAMBDA函数的版本可以直接逐行判断,不需要手动计算容斥,扩展更多列的时候更方便:
=SUM(--BYROW(A1:B100,LAMBDA(r,OR(ISNUMBER(SEARCH("shopping",r))))))
- 该写法默认不区分英文大小写,需要区分大小写时把
SEARCH替换为FIND即可 - 不需要写通配符,SEARCH会自动检测单元格内是否包含目标文本
- 如果要扩展到更多列,只需要把
A1:B100改成对应的数据范围即可
自定义COUNTIF_OR函数(完全匹配预期的调用方式)
如果需要频繁使用多区域OR逻辑计数,可以自定义通用函数,和你预期的调用逻辑完全一致:
- 按
Alt+F11打开VBA编辑器,右键点击当前工作簿名称,选择「插入-模块」 - 在模块代码窗口粘贴以下代码:
Function COUNTIF_OR(ParamArray args() As Variant) As Variant Dim i As Long, rowCount As Long, j As Long Dim isMatch As Boolean ' 校验参数是否为「区域,条件」成对传入 If (UBound(args) + 1) Mod 2 <> 0 Then COUNTIF_OR = CVErr(xlErrValue) Exit Function End If rowCount = args(0).Rows.Count ' 逐行判断是否有任意一组区域+条件匹配 For i = 1 To rowCount isMatch = False For j = 0 To UBound(args) Step 2 If args(j).Cells(i, 1).Text Like args(j + 1) Then isMatch = True Exit For End If Next j If isMatch Then COUNTIF_OR = COUNTIF_OR + 1 Next i End Function
- 保存文件为启用宏的格式(.xlsm),之后就可以直接按需要的格式调用:
=COUNTIF_OR(A1:A100,"*shopping*",B1:B100,"*shopping*")
如果系统区域设置默认公式分隔符为分号,把公式里的逗号换成分号即可正常使用。
内容的提问来源于stack exchange,提问作者snecserc
相关产品推荐
相关产品推荐

