【问题标题】:Return array of all matches between two ranges返回两个范围之间所有匹配的数组
【发布时间】:2015-06-04 17:05:49
【问题描述】:

好的,我正在尝试更进一步地采用常见的教程数组公式,但无法弄清楚如何。

基本上我有一组表,其值如下:

| Sheet 1                       || Sheet 2              |
| Products(1)   | Product Group || Products(2)   | Data |
|               |               ||               |      |
| 100           | 1             || 100           | abc  |
| 200           | 2             || 200           | def  |
| 300           | 3             || 200           | ghi  |
| 400           | 3             || 500           | jkl  |
| 500           | 2             || 400           | mno  |

表 1 列出了对每个产品进行分类的所有参数,并使用这些参数将每个产品分配给一个组。 Products 本质上是一个唯一的索引键。

表 2 是产品每次运行情况的跟踪列表。因此产品编号可能会出现多次或根本不出现。

我有第三张表,其中输入了产品编号,从中计算其组号,并在表 1 中搜索具有该组号的所有产品,并使用数组公式返回列表(使用本教程 @ 987654321@ 由不同的人在线显示)。我们将在工作表 3 上将此称为“K 列”。

我现在想做的是更进一步,从工作表 2 中返回“数据”以获取“工作表 2”!“产品(2)”和“工作表 3”!“K 列”之间的所有匹配项。如果“列 K”已修复,我可以再次使用相同的公式并将 OR 语句放入 IF 表达式中,但由于 K 是动态填充的,我不知道如何找到它们。

为了澄清,我理想地展示的最终结果是这样的:

| Sheet 3                                                 |
| Product Num   | Column K    | Column L    | Column M    |
| (user enters) | (automatic) | (automatic) | (automatic) |
| 500           | 200         | 200         | def         |
|               | 500         | 200         | ghi         |
| Product Group |             | 500         | jkl         |
| (automatic)   |             |             |             |
| 2             |             |             |             |

【问题讨论】:

    标签: excel


    【解决方案1】:

    如果您将列向量与数组公式中的行向量进行比较,则它将列中的每个值与行中的每个值进行比较。所以下面的方法会起作用,因为我们在与Sheet2!$A$1:$A$10000 比较之前将Sheet3!K1:K[n] 中的值转换为行向量。

    表 1:

    表 2:

    表 3:

    Sheet3中的公式:

    A5:

    =VLOOKUP($A$2,Sheet1!$A:$B,2,FALSE)
    

    K2 下:

    {=IFERROR(INDEX(Sheet1!$A$1:$A$10000,SMALL(IF(Sheet1!$B$1:$B$10000=$A$5,ROW(Sheet1!$B$1:$B$10000)),ROW(1:1))),"")}
    

    L2 下:

    {=INDEX(Sheet2!$A$1:$A$10000,SMALL(IF(Sheet2!$A$1:$A$10000=TRANSPOSE($K$1:INDEX($K:$K,MAX(IF($K$1:$K$10000<>"",ROW($K$1:$K$10000))))),ROW(Sheet2!$A$1:$A$10000)),ROW(1:1)))}
    

    M2 下:

    {=INDEX(Sheet2!$B$1:$B$10000,SMALL(IF(Sheet2!$A$1:$A$10000=TRANSPOSE($K$1:INDEX($K:$K,MAX(IF($K$1:$K$10000<>"",ROW($K$1:$K$10000))))),ROW(Sheet2!$A$1:$A$10000)),ROW(1:1)))}
    

    K2,L2,M2 中的公式是数组公式。输入它们,不带大括号,然后按 [Ctrl]+[Shift]+[Enter]。

    Sheet3!K1:K[n] 中对K[n] 的引用是用

    计算的
    INDEX($K:$K,MAX(IF($K$1:$K$10000<>"",ROW($K$1:$K$10000))))
    

    在里面

    MAX(IF($K$1:$K$10000<>"",ROW($K$1:$K$10000)))
    

    获取内容不等于“”的K列中最大的行号。


    如果产品编号是数字,那么它更容易,也可以对结果进行排序。

    Sheet1 和 sheet2 见上文。

    表 3:

    Sheet3 中的公式:

    A5:见上文

    K2 下:

    {=IFERROR(SMALL(IF(Sheet1!$B$2:$B$10000=$A$5,Sheet1!$A$2:$A$10000),ROW(1:1)),"")}
    

    L2 下:

    {=SMALL(IF(Sheet2!$A$2:$A$10000=TRANSPOSE($K$2:INDEX($K:$K,MATCH(MAX($K:$K),$K:$K))),Sheet2!$A$2:$A$10000),ROW(1:1))}
    

    M2 下:

    {=INDEX(Sheet2!$B$1:$B$10000,SMALL(IF(Sheet2!$A$1:$A$10000=$L2,ROW(Sheet2!$A$1:$A$10000)),COUNTIF($L$2:$L2,L2)))}
    

    【讨论】:

    • 成功了!非常感谢!不知道excel中比较数组的点积类型有没有比较
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多