如何用ArrayFormula实现多列COUNTIF批量求和(Google Sheets)
解决Google Sheets中COUNTIF+VLOOKUP批量统计的数组公式方案
嘿,我太懂你逐行复制公式的痛苦了——上千行的重复操作简直是效率杀手!之前用ArrayFormula、MMULT、SIGN尝试没成功?别慌,咱们一步步把这个批量统计的需求搞定。
核心思路
我们要把VLOOKUP返回的多列结果批量转换成「是否包含目标关键词」的布尔值,再对每行的布尔值求和,用ArrayFormula一次性完成所有行的计算,彻底告别复制粘贴。
具体公式实现
假设你的表格结构是:
- A列是需要匹配的关键字/ID(从A2开始到A1001)
- 数据源在
Sheet2!A:E区域,VLOOKUP需要返回其中的B到E列
列1:统计包含"Defense"的数量
在结果单元格(比如B2)输入:
=ArrayFormula(IF(A2:A1001="",,MMULT(--REGEXMATCH(VLOOKUP(A2:A1001, Sheet2!A:E, COLUMN(Sheet2!B:E), FALSE), "Defense"), SEQUENCE(COLUMNS(Sheet2!B:E), 1, 1, 0))))
列2:统计包含"Offense"的数量
在相邻单元格(比如C2)输入:
=ArrayFormula(IF(A2:A1001="",,MMULT(--REGEXMATCH(VLOOKUP(A2:A1001, Sheet2!A:E, COLUMN(Sheet2!B:E), FALSE), "Offense"), SEQUENCE(COLUMNS(Sheet2!B:E), 1, 1, 0))))
公式拆解(帮你搞懂每一步)
VLOOKUP(...)批量匹配:
用A2:A1001作为批量输入,COLUMN(Sheet2!B:E)指定要返回的多列(这里是第2到第5列),结合ArrayFormula让VLOOKUP一次性输出所有行的多列结果,而非单行。REGEXMATCH(..., "Defense")判断匹配:
检查VLOOKUP返回的每个单元格是否包含"Defense",返回TRUE或FALSE。需要忽略大小写的话,改成"(?i)Defense"即可。--转换布尔值:
把TRUE转成1、FALSE转成0,让布尔值能被数值求和。MMULT(..., SEQUENCE(...))批量求和:SEQUENCE生成一个和返回列数相同的全1列向量,MMULT会对每行的1/0数组求和,替代逐行的COUNTIF功能。IF(A2:A1001="",,...)优化显示:
避免空行显示多余的0,让空行保持空白,表格更整洁。
常见失败原因排查
如果之前尝试没成功,大概率是这几个问题:
- VLOOKUP没返回多列数组:一定要用
COLUMN(返回列范围)指定多列,不能写单个列号。 - 布尔值没转数字:忘记加
--的话,MMULT无法对布尔值求和。 - MMULT维度不匹配:
SEQUENCE的行数必须和VLOOKUP返回的列数一致,用COLUMNS(返回列范围)自动获取就不会出错。
灵活调整技巧
- 要覆盖更多行(比如2000行),把
A2:A1001改成A2:A2000或者直接A2:A(自动处理所有非空行)。 - 如果是精确匹配而非包含,把
REGEXMATCH换成= "Defense"即可,比如--(VLOOKUP(...) = "Defense")。
内容的提问来源于stack exchange,提问作者kouki
相关产品推荐
相关产品推荐

