数组公式以查找最后一个匹配条件

时间:2019-01-17 16:16:00

标签: excel excel-formula array-formulas

我正在尝试对数组公式做一些怪异的事情。我快要到了,但是无法完成最后一块。

假设我有这样的数据行...

 Property 1      Property 2      Property 3
 Orange          Square          Hot
 Blue            Circle          Cold
 Purple          Star            Slimy

我有一个标准表,由要检查的列和要与之匹配的值组成:

 Property Index      Value
 2                   Circle
 1                   Purple
 3                   Slimy

对于每行数据,我试图确定该行上数据所满足的最后一个条件。

即。对于上面的三行数据,我希望获得以下输出:

0 <- a hot orange square isn't slimy or purple or a circle
1 <- a cold blue circle matches (only) the circle criterion
3 <- a slimy purple star is both purple and slimy, 
     and we count the last match

到目前为止,我已经在单个单元格中尝试过此数组公式:

 {=MAX(
     IF(
        INDEX(Data[@[Property 1]:[Property 3]], Criteria[Property Index])
        = Criteria[Value],
            ROW(Criteria[Value]),
            0
     )
  )}

问题在于,当我逐步进行公式的求值时,Criteria[Property Index]的求值仅是第一个条目2的值,而不是整个列的值{2, 1, 3},因此我只是反复测试了第一个条件。

我希望使用该索引范围进行查找以分别为每行生成置换列表{Square, Orange, Hot}{Circle, Blue, Cold}{Star, Purple, Slimy},以与值范围进行比较。

我已经能够使INDEX在索引中使用一定范围的值,并在公式跨越多个单元格时返回每个索引结果的数组,但是我试图避免将工作表绑定到固定长度的条件表。我希望能够向其中添加更多行,并使该公式仍然有效。

在这种情况下,是否可以通过某种方式哄骗Excel将index参数视为一个范围,以获取所需的数组输出?还是我可以执行此计算的另一种方法,该方法仍会随着用户添加/删除条件行而按比例缩放?

1 个答案:

答案 0 :(得分:1)

这是可行的,但使用命名范围封装数据表中严格的属性列是一个好主意

=MAX(IF(
        INDEX(
              INDEX(PropertyData, 1 + ROW()-ROW($I$15), 0),
              1,
              N(IF({1}, Criteria[Property Index]))
        ) = Criteria[Value],
        ROW(Criteria[Value])-ROW(Criteria[#Headers]),
        0
))

PropertyData是“属性1”列中通过“ 命名范围”结尾的第一个单元格。

PropertyData定义为:

=INDEX(Data, 1, COLUMN(Data[Property 1])-COLUMN(Data) + 1):INDEX(Data, ROWS(Data), COLUMNS(Data))

一个硬编码的值是第一个公式所在的$ I $ 15单元格。我使表格和公式不同步,以表明它们处理得很好。

enter image description here