Excel formula 将长公式转换为数组公式

Excel formula 将长公式转换为数组公式,excel-formula,google-sheets,array-formulas,Excel Formula,Google Sheets,Array Formulas,文件: 问题 如何按计划转换以下简单公式!C20:I29按计划整合成一个简单的数组!C20 注: 以上代码只是部分解决方案。我将把ARRAYFORMULA版本的代码替换为当前类中代码的正确部分!L6 上述C6参考可以在计划之间的任何单元格上使用!C6:I15。我已将该范围命名为U代码。我以为我可以做到以下几点,但我错了 =用于公式计数器筛选器的数组学生$B$5:$B,可计算代码,过滤器学生$J$5:$O,同学们$J$4:$O$4='当前类'$B$3 出身背景 最初,我创建了一个表,现在它位于第1

文件:

问题 如何按计划转换以下简单公式!C20:I29按计划整合成一个简单的数组!C20

注:

以上代码只是部分解决方案。我将把ARRAYFORMULA版本的代码替换为当前类中代码的正确部分!L6 上述C6参考可以在计划之间的任何单元格上使用!C6:I15。我已将该范围命名为U代码。我以为我可以做到以下几点,但我错了

=用于公式计数器筛选器的数组学生$B$5:$B,可计算代码,过滤器学生$J$5:$O,同学们$J$4:$O$4='当前类'$B$3

出身背景 最初,我创建了一个表,现在它位于第1个版本-当前类!L6。此选项卡仅供参考,将很快删除。每个单元格都有一个稍加修改的公式。这个公式正确;然而,它是一个庞然大物,很难修改

专业人士

我不必创建任何助手数据。 所有计算都在内存中 缺点

太大 难以修改 我喜欢输出,但不喜欢缺点,所以我开始创建一个对编辑更友好的代码版本,我基本上可以接受。此代码位于当前类中!L6和一份按计划的二次副本!C33-它将被删除。它在当前类中只有一个公式!L6

专业人士

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

创建了两个2 helper表,其中一个我认为是不需要的 同样,我喜欢输出,但我真的不喜欢第二个助手表时间表!C20。我觉得这张桌子可以被淘汰,但我还没有弄清楚如何淘汰

如果您真的想使用arrayformula,请看这里。为了时间表!C20

也许您可以使用以前使用过的filteras,而不是索引和匹配部分,但我更喜欢索引和匹配,不想挖掘更多。您还可以使用一个帮助单元格来存储筛选或索引&匹配结果,以缩短公式

其核心思想是计算字符串中给定字符的出现次数,即lena1-lensubstitutea1。。。。你可以在网上找到许多关于它的文件


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

从@Sangbok Lee那里得到了一个好的答案后,我决定将他给我的函数的每个部分分解。在做这件事的时候,我发现与我上周在谷歌表单上做的一些工作有着极不可能的联系。我在另一个选项卡中的一个助手栏做了Sangbok Lee试图做的事情。我所要做的就是将helper列拆分为两列:第一列用于上一次的最终计算,第二列用于计算一个额外的count列

在修改了我们的两个公式,并测试了结果之后,我找到了一个我更满意的解决方案

=arrayformula(if(countif(Meta!$B$5:$B, (Timetable_Code)), (Timetable_Code & "     ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,""))
.
请查看以下内容中的差异:

看看第1版-当前课程!第1个版本的L6选项卡 看看现在的班级!第二版为L6 看看现在的班级!第三版和最终版的U6

还可以查看tab Meta和Schedule以了解差异


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

谢谢您的回答。这真的很有帮助。我分解了你的函数来理解它,并且基于我之前已经做过的代码片段找到了更好的解决方案。它仍然需要2组辅助数据,但第二组的占用空间较小。我会把我自己的答案贴出来,很好,我很高兴你找到了令人满意的解决方案
=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)))), " )") ,"")
.
=arrayformula(if(COUNTIF(Meta!$B$5:$B, ("=" & Timetable_Code)), (Timetable_Code & "     ( " & Timetable_StudentCount & " )") ,""))
.
=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))
=arrayformula(if(countif(Meta!$B$5:$B, (Timetable_Code)), (Timetable_Code & "     ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,""))
.