不能在具有动态确定的最后一行的 ARRAYFORMULA 中使用 INDEX(VLOOKUP 也不起作用)

Can't use INDEX inside an ARRAYFORMULA with dynamically determined last row (VLOOKUP not working either)

在这种情况下:没有简单的方法来指定一个范围内的最后一列,当可以添加列时,同时允许永远自动增加行数。

该设计是一个 Google 电子表格 + 表格,随后的 tabs/sheets 完成大部分繁重的工作。表单将需要随着时间的推移而改变,那些做繁重工作的选项卡需要跟上(得到一些代码来做到这一点),所以更多的列将被添加,我不希望用户必须去 -返回并根据新的最后一列查找和修改需要更新的公式。

因此,我在添加新的电子表格元素时添加到列中,最后一列包含我需要的结果。我只是无法在使用结果的其他公式中对该列的位置进行硬编码,另外,我需要处理越来越多的行。

动态确定最后一列是一个很容易找到的修复方法,它只获取所有列号的列表,返回最大的:

=max(filter(column(D1:1),len(D1:1)))

... 任何列字母都可以。因此,对于给定的行,您可以获取最后一列的数据:

    =index(E3:3,1,max(filter(column(E1:1),len(E1:1)))-4)  
// the "-4" is to offset for the 4th cell in the range.

但是,INDEXARRAYFORMULA 中不起作用。寻求帮助,有很多回复说在这些情况下使用 VLOOKUP ,包括有关动态列号的答案。也许我错过了重点,但相应的 VLOOKUP,据我所知,是:

=VLOOKUP(E3,E3:3,max(filter(column(E1:1),len(E1:1)))-4)

其中,ARRAYFORMULA(跨越所有行)看起来像:

=ARRAYFORMULA(VLOOKUP(E3:E,E3:3,max(filter(column(E1:1),len(E1:1)))-4))

... 这不起作用,因为单行范围 "E3:3" 对所有行保持静态,所以我只在每隔一行结果中获取第 3 行的结果。

但是,我发现我可以使用:

=ARRAYFORMULA(E3:E & ": " & indirect("R3C" & B1 & ":C" & B1,FALSE))
// where B1 is max(filter(column(E1:1),len(E1:1)))

这会将第 5 列中的条目与“:”连接起来,然后与最后一列中的条目连接起来。 ARRAYFORMULA 中的范围说明符 "E3:E" 对第三行之后的所有行重复,并且 R3Cn:Cn 的 INDIRECT 中的 R1C1 范围符号(其中 n 是最后一个列号)将 ARRAYFORMULA 扩展到最后一列。

对于这种行为有更好的解释吗?

我在 VLOOKUP 中做错了什么? ...我能说的最好的是,VLOOKUP 是在 ARRAYFORMULA 中执行 INDEX 的方法,但看不到那里的解决方案。

要根据 header 行(第一行)获取最后 non-empty 列的范围,您需要像这样构造它:

=INDIRECT(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4)&":"&
 SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(D1:1),LEN(D1:1))),4),1,""))

然后你可以像这样在 VLOOKUP 中使用它:

=ARRAYFORMULA(IFERROR(VLOOKUP(E3:E, 
 {Form!E3:E,INDIRECT(ADDRESS(3,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4)&":"&
  SUBSTITUTE(ADDRESS(1,MAX(FILTER(COLUMN(Form!D1:1),LEN(Form!D1:1))),4),1,""))}, 2, 0), ))

如果匹配return你最后一列的值