2016-08-24 56 views
0

在单元格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

也许是因为您指的是间接公式'$ C $ 1:$ AX $ 1'中的多个单元格? – Brian

+0

转到'Formulas' >>'评估公式'并调试它。 – Brian

+0

我能问你为什么首先要努力生成一个代表要查询的范围的文本字符串?以我的经验来看,这几乎是不必要的,当然也不是在涉及诸如INDIRECT之类的易失性函数的复杂使用时。 –

回答

0

正如我在评论中暗示的那样,我不敢说目前使用的建筑确实很差,并且可以用非易失性和远距离的设置来代替更高效。

您错误的原因是由于您使用ROW函数的方式。实际上,为了以这种方式生成增量整数,由于若干原因,ROW不如ROWShttps://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}

所以这里:

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行),而不是只做不需要事先构建代表范围的文本字符串,但也是简洁且重要的是非易失性的。

Regards