Excel 用于查找最后一个匹配条件的数组公式

Excel 用于查找最后一个匹配条件的数组公式,excel,excel-formula,array-formulas,Excel,Excel Formula,Array Formulas,我试图用数组公式做一些有点怪异的事情。我就快到了,但最后一块还没放好 假设我有这样的数据行 Property 1 Property 2 Property 3 Orange Square Hot Blue Circle Cold Purple Star Slimy 我有一个标准表,包括要检查的列和要匹配的值: Property Index V

我试图用数组公式做一些有点怪异的事情。我就快到了,但最后一块还没放好

假设我有这样的数据行

 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
问题是,当我逐步计算公式时,
标准[Property Index]
只计算第一个条目2的值,而不是整个列,
{2,1,3}
,因此我只需要重复测试第一个标准

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

当公式跨越多个单元格时,我能够获取索引以使用索引的一系列值,并返回每个索引结果的数组,但我试图避免将我的工作表绑定到标准表的固定长度。我希望能够向其中添加更多行,并使公式仍然有效


在这种情况下,我是否有办法说服Excel将索引参数作为一个范围来处理,以获得所需的数组输出?或者,是否有一种替代方法可以执行此计算,它仍然会随着用户添加/删除标准行而扩展?

这是可行的,但最好使用命名范围来封装数据表的严格属性列

=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是Property 1列中通过命名范围到末尾的第一个单元格

PropertyData定义为:

=索引(数据,1,列(数据[属性1])-列(数据)+1):索引(数据,行(数据),列(数据))

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


不幸的是,如果您想让Excel挑逗一些您认为不可能的事情,
INDIRECT()
通常可以让它工作。“我必须考虑一下这个问题。”大卫,我会看看我是否能有效地解决这个问题。谢谢你帮我解决这个难题。:)VBA是否可以接受?这在VBAI中非常简单,我更喜欢公式解决方案。我可以管理VBA OK,但我希望最终用户打开我的工作表时,我的工作表能够开箱即用,而不需要提醒他们启用安全权限以使其正常工作。Gregory有什么运气吗?总感觉命名范围将excel的公式系统变成了一种编程语言。几乎就像命名范围的创造性合并类似于VBA Lite。同意@DavidS-它们确实可以提高效率,就像以变量的形式存储数据。。。
=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
))