将长公式转换为ARRAYFORMULA

时间:2017-03-22 09:16:52

标签: excel-formula google-sheets array-formulas

文件:https://docs.google.com/spreadsheets/d/1N4cGw5eUq_3gCJh1w39qVatX9KV1_Hr-AqRHj_nbckA/edit#gid=1770960621

问题

如何将Schedule!C20:I29处的以下简单公式转换为Schedule!C20处的单个简单ARRAYFORMULA?

=Count(Filter(Students!$B$5:$B, Find(C6, Filter(Students!$J$5:$O,Students!$J$4:$O$4 = 'Current Class'!$B$3))))
.

注意:

  • 以上代码只是部分解决方案。我将代码的ARRAYFORMULA版本替换为Current Class!L6
  • 中代码的正确部分
  • 上面的C6引用可以采用Schedule!C6:I15之间的任何单元格。我已将该范围命名为Timetable_Code我以为我可以做到以下几点,但我错了......

    =Arrayformula(Count(Filter(Students!$B$5:$B, Find(Timetable_Code, Filter(Students!$J$5:$O,Students!$J$4:$O$4 = 'Current Class'!$B$3)))))

背景

最初,我创建了一个现在位于1st Version - Current Class!L6的表。此选项卡仅供您参考,很快就会被删除。每个细胞都有一个略有修改的配方。 这个公式正常;然而,它是一个庞然大物,很难修改......

=if(COUNTIF(Meta!$B$5:$B, CONCATENATE("=",if(L$5 = "THURSDAY", "TH", if(L$5 = "SUNDAY", "SU", left(L$5,1))), if(left($K6, 2) = "12", 0, left($K6, 1)))), CONCATENATE(if(L$5 = "THURSDAY", "TH", if(L$5 = "SUNDAY", "SU", left(L$5,1))), if(left($K6, 2) = "12", 0, left($K6, 1)), "     ( ", Count(Filter(Students!$B$5:$B, Find(CONCATENATE(if(L$5 = "THURSDAY", "TH", if(L$5 = "SUNDAY", "SU", left(L$5,1))), if(left($K6, 2) = "12", 0, left($K6, 1))), Filter(Students!$J$5:$O,Students!$J$4:$O$4 = $B$3)))), " )") ,"")
.

赞成

  • 我不必创建任何帮助数据。
  • 所有计算都是"内存中"

缺点

  • 太大
  • 难以修改

我喜欢输出,但我不喜欢这个缺点,所以我开始创建一个更加编辑友好的代码版本,我很满意。此代码位于Current Class!L6(以及Schedule!C33的辅助副本 - 它将被删除。)它在Current Class!L6处有一个公式... < / p>

=arrayformula(if(COUNTIF(Meta!$B$5:$B, ("=" & Timetable_Code)), (Timetable_Code & "     ( " & Timetable_StudentCount & " )") ,""))
.

赞成

  • 很容易理解
  • 非常容易修改
  • 无需将公式复制到其他单元格

缺点

  • 创建了两(2)个辅助表(我认为其中一个是不必要的)

同样,我喜欢输出,但我真的不喜欢第二个辅助表(Schedule!C20)。我觉得这张桌子可以被淘汰,但我还是弄不清楚。

2 个答案:

答案 0 :(得分:1)

如果您真的想使用arrayformula,请点击此处。对于Schedule!C20

=arrayformula((len(concatenate(index(Students!J5:O, , match('Current Class'!$B$3, Students!J4:O4, 0))))-len(substitute(concatenate(index(Students!J5:O, , match('Current Class'!$B$3, Students!J4:O4, 0))),C6:I15,"")))/len(C6:I15))

可能你可以使用filter(正如之前所做的那样)代替index & match部分,但我更喜欢index & match并且不想再挖掘更多。您还可以使用一个帮助单元格来存储filterindex & match结果,以缩短公式。

核心思想是计算字符串中给定字符的出现次数,即len(a1) - len(substitute(a1, ...。你可以在网上找到很多关于它的文件。

无论如何,如果我是你,我会对目前的状态感到满意。只需锁定并隐藏帮助表或表格即可。没有人关心隐藏的床单,如果发生了不好的事情,你可以恢复任何改变。

答案 1 :(得分:0)

在从@Sangbok Lee那里得到一个好的答案之后,我决定打破他给我的每一部分功能。在这样做的过程中,我发现上周我在Google表格中所做的一些工作的可能性非常小。我在另一个标签中有一个辅助列,就像Sangbok Lee试图做的那样。我所要做的就是将辅助列分成两列(前一个最终计算为1,后者为1)并计算一个额外的计数列

在重新设计了两个公式并测试结果后,我找到了一个让我更满意的解决方案!

Derived

查看Google Sheet

中的差异
  • 查看第一个版本的Derived标签
  • 查看=arrayformula(if(countif(Meta!$B$5:$B, (Timetable_Code)), (Timetable_Code & " ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,"")) . 第二个版本
  • 查看1st Version - Current Class!L6第3版和最终版

  • 另请参阅标签Current Class!L6Current Class!U6了解差异。

注意:绿色是旧数据,红色是新数据