【问题标题】:Excel - Recursive VLookupExcel - 递归 VLookup
【发布时间】:2011-07-26 16:47:43
【问题描述】:

我最近了解了 Excel 的 Ctrl+Shift+Enter 数组公式,目前还在学习。来解决我的问题,

SheetA:
Product        Code
S1             19875
S2             19834
S1             13575
S1             35675
S2             47875   



SheetB:
Code           Indent
19875          40  
19834          15
13575          22
35675          25
47875          20

我需要对给定产品名称的所有缩进求和。

例如:我需要 S1 的总缩进,

  • 在 SheetA 上查找 Vlookup,获取代码 19875
  • 在 SheetB 上执行 vlookup,得到 40 的缩进
  • 在工作表 A 上进行下一个 Vlookup,获取代码 13575
  • 使用 13575 在 SheetB 上进行 Vlookup,获得 22 的缩进
  • 在工作表 A 上进行下一个 Vlookup,获取代码 35675
  • 使用 35675 在 SheetB 上进行 Vlookup,得到 25 的缩进
  • 40+22+25之和,返回87

我可以通过 VBA 实现这一点,但我想知道这是否可以在使用 CSE/数组公式的 excel 函数中实现。

编辑:

我在 Sheet2 中没有与 Sheet1 相同顺序的值。它们是完全随机的。我的 SheetB 将随机如下所示:

SheetB:
Code           Indent
19834          40  
19875          15
47875          22
13575          25
35675          20

【问题讨论】:

    标签: excel excel-2007 worksheet-function vlookup


    【解决方案1】:
    {=SUM(NOT(ISNA(MATCH((($A$2:$A$6="S1")*(B2:B6)),Sheet2!$A$2:$A$6,FALSE)))*(Sheet2!$B$2:$B$6))}
    

    MATCH 的第一个参数解析为

    {19875;0;13575;35675;0}
    

    MATCH 解析为

    {1;#N/A;3;4;#N/A}
    

    您必须确保 SheetB 中没有零。 NOT ISNA 将它们转换为 TRUE 和 FALSE 并解析为

    {TRUE;FALSE;TRUE;TRUE;FALSE}
    

    最终的 SUM 看起来像这样

    =SUM({TRUE;FALSE;TRUE;TRUE;FALSE}*{40;15;22;25;20})
    

    更新

    当列表的顺序不同时,我无法找出单数组解决方案。我对 OFFSET 和 TRANSPOSE 的尝试要么给出了错误的答案,要么导致 Excel 崩溃。如果您可以使用辅助列,则可以将此公式放在第一张表的第三列中

    =VLOOKUP(B2,Sheet2!$A$2:$B$6,2,FALSE)
    

    然后用这个数组公式求和

    {=SUM(($A$2:$A$6=A2)*($C$2:$C$6))}
    

    【讨论】:

    • @Kusleika,感谢您抽出宝贵时间。当我在 Sheet2 中的代码与 Sheet1 的顺序相同时,您的解决方案工作正常......但我的实际数据并非如此......在这里输入示例时我没有考虑到这一点,只是随机输入了一些例子。当您不确定Sheet2的顺序时,有没有办法计算?
    • 是的,我最后也是这么做的。我不想要这种方式,但我在 SheetA 本身中插入了额外的列并使用了 SUM(IF('Data-SKUs'!$B:$B=$A9,'Data-SKUs'!$G:$G*' Data-SKUs'!J:J,0)。再次感谢您抽出宝贵时间 D.
    【解决方案2】:

    如果 SheetA 和 SheetB 上的 Code 列相同(相同顺序),则可以使用简单的 SUMIF 函数。同样,如果 INDENT 数据在 SheetA 上,您也可以使用数据透视表快速计算总和。

    我猜你的工作簿的设计不允许这样做。在这种情况下,我没有任何简单的解决方案,但我会再看一下。

    【讨论】:

      【解决方案3】:

      您可以使用以下内容: //Ola.S

      表 1 Col:A B C 产品代码意图

      C 列:=SUMIF($E$4:$E$8;B4;$F$4:$F$8)

      表 2 Col:E F 代码意图

      表 3 可旋转(Col:A 和 C)

      【讨论】:

        【解决方案4】:

        在工作表C 如果 A1 有 S1,那么在单元格 B1 中输入

        =SUM((IF((Product=A1),Code1)=TRANSPOSE(Code2))*TRANSPOSE(Amt))
        

        输入数组 在哪里 Code1 = SheetA 上从 Row2 开始的代码的动态范围 Code2 = SheetB 上从 Row2 开始的代码的动态范围

        【讨论】:

          【解决方案5】:

          不需要TRANSPOSE 呼叫。

          试试数组公式

          =SUM(SUMIF(SheetB!A2:A6,IF(SheetA!A2:A6="S1",SheetA!B2:B6),SheetB!B2:B6))
          

          假设SheetB!A2:A6 中没有单元格,它的计算结果为 FALSE。如果代码列都是数字的(可能是一个有问题的假设),这可以在没有数组条目的情况下使用:

          =SUMPRODUCT(SUMIF(SheetB!A2:A6,SheetA!B2:B6/(SheetA!A2:A6="S1"),SheetB!B2:B6))
          

          假设SheetB!A2:A6 中没有单元格计算为#DIV/0!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多