【问题标题】:Convert long formula into an ARRAYFORMULA将长公式转换为 ARRAYFORMULA
【发布时间】:2017-03-22 09:16:52
【问题描述】:

文档: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 有一个单个 公式...

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

优点

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

缺点

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

再次,我喜欢输出,但我真的不喜欢第二个辅助表 (Schedule!C20)。我觉得这个表可以消除,但我一直无法弄清楚如何消除。

【问题讨论】:

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


    【解决方案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 并且不想挖掘更多。您也可以使用 one 帮助单元格来存储 filterindex & match 结果以缩短公式。

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

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

    【讨论】:

    • 感谢您的回答。这真的很有帮助。我分解了你的函数来理解它,并且我找到了一个基于我之前已经做过的代码 sn-p 的更好的解决方案。它仍然需要 2 组帮助数据,但第二组占用的空间更小。很快会考虑发布我自己的答案
    【解决方案2】:

    在得到@Sangbok Lee 的好回答后,我决定分解他给我的功能的每个部分。在这样做的同时,我发现与我上周在 Google 表格中所做的一些工作极不可能有联系。我在另一个选项卡中的一个帮助列做了 Sangbok Lee 试图做的事情。我所要做的就是将该辅助列拆分为两列(1 列用于上一个最终计算,1 列用于)并计算额外的计数列

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

    =arrayformula(if(countif(Meta!$B$5:$B, (Timetable_Code)), (Timetable_Code & "     ( " & vlookup(Timetable_Code, StudentCount_Lookup, 2, false) & " )") ,""))
    .
    

    查看Google Sheet中的差异

    • 查看1st Version - Current Class!L6 第一个版本的标签
    • 查看Current Class!L6 了解第二版
    • 查看Current Class!U6 了解第三版和最终版

    • 另请查看标签 MetaSchedule 以了解差异。

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

    【讨论】:

    • 好主意,我很高兴您找到了令人满意的解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 2022-11-27
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2019-10-11
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多