如何在 Google 工作表中执行 SUMPRODUCT,但以两个向量中的文本为条件?

How do I do a SUMPRODUCT in Google Sheets, but conditional on the text in both vectors?

以下电子表格显示了 4 名学生的练习提交状态。有 4 个练习(1-4),但其中只有 2 个是家庭作业(因此评分)——它们的名称中有一个前缀 'H'。正确的提交被标记为“完成”。

我正在计算,对于每个学生,他有多少“完整”的提交,这也是家庭作业。最右边一列是我想要的结果。

各种countifs都试过了,就是搞不定。我有一个使用 SUMPRODUCT 的丑陋解决方案,但这需要将所有“完整”替换为 1(我宁愿不要)+ 一些。我更喜欢 Google 表格解决方案,但 excel 也可以...

有心帮老师:-)

我建议使用 mmult,这是从矩阵中获取行总计的标准方法。正如您提到的,第一步是将每个包含“完整”的单元格转换为 1,然后检查 headers 是否存在字母 H。

=ArrayFormula(mmult((A2:D6="complete")*(isnumber(SEARCH("h",A1:D1))),transpose(column(A2:D6))^0))

我已经在 Google 表格中对此进行了测试,但它也应该在 Excel 中工作。

编辑

(1) 使范围适应变化的最简单方法是对列数设置一些上限并使引用 full-column,例如

=ArrayFormula(if(A2:A="","",mmult((A2:M="complete")*(isnumber(SEARCH("h",A1:M1))),transpose(column(A2:M))^0)))

您可能希望将总数移到另一个 sheet:

=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)))

(2) 要获取百分比值,您可以使用 countif:

=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(SEARCH("h",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/countif(Sheet7!A1:Z1,"*h*")))

并将列格式设置为百分比。

编辑 2

要检查 headers 中是否存在 H 但忽略 h,请使用 Find 而不是 Search,并使用 regexmatch 而不是 countif:

=ArrayFormula(if(Sheet7!A2:A="","",mmult((Sheet7!A2:Z="complete")*(isnumber(find("H",Sheet7!A1:Z1))),transpose(column(Sheet7!A2:Z))^0)/sum(--regexmatch(""&Sheet7!A1:Z1,"H"))))

如果您只想包含 headers _starting_with H,请将正则表达式匹配中的“H”更改为 @player0 的回答中的“^H”。

如果 H 列的位置是已知的,你可以做简单的:

=INDEX(IF(A2:A="",,ADD(D2:D="complete", E2:E="complete")))


如果 H 的列数和位置未知:

=INDEX(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
  *(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")), 
 ROW(INDIRECT("A1:"&COLUMN()-1))^0))

更新:

=INDEX(TEXT(MMULT((INDIRECT("A2:"&ADDRESS(COUNTA($A:$A), COLUMN()-1))="complete")
  *(REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")), 
 ROW(INDIRECT("A1:"&COLUMN()-1))^0)/
 SUM(1*REGEXMATCH(UPPER(INDIRECT("A1:"&ADDRESS(1, COLUMN()-1))), "^H.*")), "0.00%"))