在单元格F3
的内容中,我有以下公式(在当前行上取一个值并在另一个工作表中查找,根据找到的位置返回一个范围):
="'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50)
输出文本:'OBS Procedures'!$C$1:$AX$1
到目前为止一切都很好。
我有另一个单元格(输出由单元格F3
生成的最右边的填充单元格):
=LOOKUP(2,1/(INDIRECT(F3)<>""),INDIRECT(F3))
这应该是文本的输出: 5:18/07/2016
大
但我想完全摆脱单元格F3
,并将F3的公式合并到上面的第二个公式中。
只需在第二个F3
之间复制INDIRECT()
公式即可。但是将其复制到第一个F3会生成#N/A
。
具体来说:
=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50))<>""),INDIRECT(F3))
生成#N/A
甚至
=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!$C$1:$AX$1")<>""),INDIRECT(F3))
并生成我期望的
(保留中间单元格或在VBA中执行此操作,这是我通常不仅仅是简单公式的选择,在这种情况下不是一个选项)
我根本就没有看到我在这里做错了什么 - 有人可以开导我吗? :)
答案 0 :(得分:0)
正如我在评论中所暗示的那样,我不敢说你目前正在使用的建筑确实非常糟糕,而且可以用非易失性的设置代替。高效。
错误的原因是由于您使用ROW
功能的方式。实际上,为了以这种方式生成增量整数,ROW
由于多种原因而不如ROWS
(https://excelxor.com/2014/08/25/row-vs-rows-for-consecutive-integer-generation/)。
尽管在这方面有劣势,但这通常不会导致错误。在这里,你有点不幸,由于你的构造的性质,Excel期望从该部分的数组输出:
ROW()
因此,并且为了论证我们正在讨论的公式是在第1行,这部分:
ADDRESS(ROW(),1)
在不同情况下,评估为:
"$A$1"
此处评估为:
{"$A$1"}
因为LOOKUP
正在向整个结构提供必要的数组强制,因此ROW()
部分预期会传递数组输出,尽管只包含一个值。实际上,在这里(您可以通过使用评估公式功能看到这一点),此部分评估为(对于第1行),而不是1
,而是{1}
。< / p>
所以这里:
INDIRECT(ADDRESS(ROW(),1))
是:
INDIRECT({"$A$1"})
因为,一般来说,INDIRECT
无法解析值数组(虽然这可以通过进一步的操作来实现),这部分错误。
为避免这种情况,您可以使用ROWS
,例如(第1行):
ADDRESS(ROWS($1:1),1)
或者通过一些合适的附加功能将ROW
的数组输出强制转换为非数组类型,例如: SUM
,即:
ADDRESS(SUM(ROW()),1)
那就是说,我真的认为你需要在这里重新考虑你的整个方法。例如,这个:
=LOOKUP(2,1/(INDEX('OBS Procedures'!$C:$AX,MATCH(A1,'OBS Procedures'!A:A,0),)<>""),INDEX('OBS Procedures'!$C:$AX,MATCH(A1,'OBS Procedures'!A:A,0),))
假设在第1行,相当于你的:
=LOOKUP(2,1/(INDIRECT("'OBS Procedures'!" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),3) & ":" & ADDRESS(MATCH(INDIRECT(ADDRESS(ROW(),1)),'OBS Procedures'!A:A,0),50))<>""),INDIRECT(F3))
(再次假设在第1行),不仅不需要先前构造表示范围的文本字符串,而且也简洁,重要的是,非易失性。
此致