【问题标题】:Excel multilevel array formula with partial string matches to sum resultant cellsExcel 多级数组公式与部分字符串匹配以求和结果单元格
【发布时间】:2020-01-06 22:51:03
【问题描述】:

我已经尝试了一天多的时间来解决这个问题,但运气不佳。我之前已经成功使用过 SUMIFS、INDEX、MATCH、COUNTIF、“--”等数组函数,我不是新手,也不是这些方面的专家。我似乎无法将它们正确地编织在一起,而且很可能是在一条完全不正确的路径上。

基本上,我正在尝试聚合来自多个电子表格的数据,需要将各种项目(行)映射为规范形式以进行求和。

这里的图片显示了我的任务的一个代表性但简化的版本。此示例电子表格(Final...、Mapping、DataSet1、DataSet2)上的每个“区域”实际上位于不同的电子表格中,每个 xlsx 中有几张 50-150 行的工作表。

请注意,B 列中的名称是非常随意的(意味着并非所有 P1 都具有“x”模式,如此处所示为 x1、x2 等。不要依赖名称中的任何模式,除了 x、y ,映射表中的 z 是数据集中 B 列中名称的子字符串(不区分大小写,尾随匹配)。

在图像中,最终结果表(手动求和)是我想通过(数组)公式计算的结果:单个公式是理想的(假设我有许多电子表格从中提取月度数据,所以我不能轻易修改,但可以根据需要创建一个临时电子表格,因此对辅助列或辅助行开放)。

这是过程 - 对于最终结果表中的每个名称 (B3-B5),我想从它的组件中总结名称如下:

  1. 在映射表中查找所有匹配项(因此对于 P1,公式 =IF($C$10:$C$15=$B3, $B$10:$B$15,"") 给出 {"x1";" ";"";"x2";"";"x3"}。
  2. 然后我想搜索 B19:B26 中的 x1、x2 和 x3 中的每一个以获取 DataSet1 中的第 21、22、24、25、26 行,并搜索 B31:B35 以获取 DataSet2 中的第 32 行,然后将一月总计进入 C3。 (有效, C3=C21+C22+C24+C25+C26+C32)。 P2 和 P3 也一样,到 2 月、3 月、...

我被困在如何从 2 的中间结果中删除空白或 0 或 Div0 或此类“错误行”,并且还需要使用 2 个不同大小的数组(上面示例 2 中的 3 个有效行,忽略空白)搜索数据集中的许多行。我尝试了 SEARCH("*"&IF($C$10:$C$15=$B3, $B$10:$B$15,""), $B$19:$B$26) 但得到了意想不到的结果。我试图用 TRUE/FALSE 和 1/0 等替换中间结果 {"x1";"";"";"x2";"";"x3"} 中的文本以帮助 INDEX 或 MATCH ,但因下游(“周围”)公式中的错误而受阻。

提前致谢。

【问题讨论】:

    标签: excel array-formulas


    【解决方案1】:

    这是一个无需使用讨厌的 (imo) CSE 公式的解决方案。

    =  SUMPRODUCT($C$19:$F$26*(COUNTIFS($B$10:$B$15, RIGHT($B$19:$B$26,2),$C$10:$C$15,$B3)>0)*($C$18:$F$18=C$2))
       +
       SUMPRODUCT($C$31:$F$35*(COUNTIFS($B$10:$B$15, RIGHT($B$31:$B$35,2),$C$10:$C$15,$B3)>0)*($C$30:$F$30=C$2))
    

    每个数据集都有一个SUMPRODUCT。如果可能,最好将所有数据集放在一个表中,并用一列标识它属于哪个数据集。

    它的工作方式是获取数据集中的每个值,然后乘以最右边的 2 个字符是否出现在该 P 代码的映射表中,再乘以该值是否在正确的月份。因此,如果其中任何一个条件为假,它就会返回 0。然后返回总和。

    针对 OP 评论的更新

    如果 X、Y、Z 代码不总是 2 位,但第一部分总是 8 位,您可以轻松修改:

    RIGHT($B$19:$B$26,2)
    

    成为:

    RIGHT($B$19:$B$26,LEN($B$19:$B$26)-8)
    

    为第一个数据集制定公式:

    =SUMPRODUCT($C$19:$F$26*(COUNTIFS($B$10:$B$15, RIGHT($B$19:$B$26,LEN($B$19:$B$26)-8),$C$10:$C$15,$B3)>0)*($C$18:$F$18=C$2))
    

    您可以修改其他数据集并将它们简单地添加在一起。

    【讨论】:

    • 两种解决方案都适用于测试电子表格。我很快就会开始制作主要系列。但非常感谢。如果出现问题,将恢复。
    【解决方案2】:

    不错的挑战!您是否愿意将所有表(DataSet1、DataSet2...)放到一个电子表格中,以便我们每个月只能引用一个范围?

    这是一个解决方案(希望是一个好的起点) - 数组公式(Ctrl+Shift+Enter):

    =SUMPRODUCT(IFERROR(IF(TRANSPOSE(IF($B3=$C$10:$C$15,$B$10:$B$15,""))=RIGHT($B$18:$B$36,2),C$18:C$36,0),0))

    【讨论】:

    • 太棒了,你们都是 Justyna dn Gravitate。两者都很简单。迫不及待地想试试(我会几个小时)。但是要注意 2 个“问题”:向右,x/y/z 不是 2 个字符,实际上是可变长度,但是前缀(100-等)在原始数据中正好是 8 个字符。此外,正如 Gravitate 所建议的那样,将所有数据合并到一个 xls 或“表格”中是不切实际的。但我可以在公式的每个单元格中放置对文件的不同引用(月份是 2018 年和 2019 年,所以列的数量不会过多)。
    • 并不是说“简单”来贬低回应。优雅在这里可能是一个更好的词。无论如何,希望尽快尝试这些。
    • 嘿@retd111 抱歉耽误了一点时间,圣诞节期间可以很吸引人! :) 对于 RIGHT,我认为您可以尝试使用 RIGHT($B$18:$B$36,LEN($B$18:$B$36)-9) 而不是 RIGHT($B$18:$B$36,2)(9 = 8 个字符的前缀加上“-”符号)。我想知道这个解决方案是否有用(祈祷!)。
    • 这个公式很好用。是的,我已经使用了正确的调整。多谢。一个怪癖是我有 2-4 个不相交的范围,所以有很多 SUMPRODUCTS(例如 SP() + SP() + SP ()),这是很多重复。但是,我没有抱怨。这两个公式都很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2022-06-15
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多