|
原帖由 小钱不争 于 2009-4-30 09:41 发表
=INDEX('2'!O:O,SMALL(IF('2'!$D$4:$D$20=17,ROW('2'!$D$4:$D$20),""),ROW(J2)))
请问此公示如何解释,而且如果当引用的工作表(如表2)名是可变的,这里的17也要是可变的话,应该如何修改
这是把表“2”中D列等于17相对应的O列的数据提到到新区域的数组公式。建议公式改成:
=INDEX('2'!O:O,SMALL(IF('2'!$D$4:$D$20=17,ROW('2'!$D$4:$D$20),4^8),ROW(A1)))&""
公式的思思路一样,只是作了错误处理。
******************************************************************************************************************************************
解读公式,我喜欢从最里层开始看起:
=INDEX('2'!O:O,SMALL(IF('2'!$D$4:$D$20=17,ROW('2'!$D$4:$D$20),""),ROW(J2)))
IF('2'!$D$4:$D$20=17,ROW('2'!$D$4:$D$20),""):一个很简单的IF函数,很容易读懂,当表“2”的$D$4:$D$20=17时,返回所在的行号,否则返回空。
抹黑,按F9,可以看到IF生成了一个数组,得到一个结果(这是我个人举的例):
=INDEX('2'!O:O,SMALL({4;"";"";7;8;"";10;"";12;"";14;"";"";17;"";"";""},ROW(J2)))。
好了,现在该small出场了:
=INDEX('2'!O:O,SMALL({4;"";"";7;8;"";10;"";12;"";14;"";"";17;"";"";""},ROW(J2)) )
这很容易看懂,用row()函数的结果作为small函数的第二参数,当公式下拉时会承着下拉改变,于是就返回IF公式生成的数组结果的第一小值,第二小值,第三小值....也就是表2里D列=17,满足条件的记录所在的行号。),这个结果作为index的第二参数。
最后,用index函数返回表2里D列=17的相应的O列的值,这个不用讲了,直接看index的函数帮助就OK了。
****************************************************************************************************************************
至于工作表名和条件可变的问题,建议把工作表名称和条件放在辅助单元格,在公式里设置成对单元格的引用。
=INDEX(indirect(工作表在的单元格&"!O:O"),SMALL(IF('2'!$D$4:$D$20=条件单元格,ROW('2'!$D$4:$D$20),""),ROW(J2)))
表名称如果放在B1单元格,条件放在C1单元格,则公式为:
=INDEX(INDIRECT($B$1&"!O:O"),SMALL(IF('2'!$D$4:$D$20=$C$1,ROW('2'!$D$4:$D$20),""),ROW(J2)))
****************************************************************************************************************************
对于你在楼下提出的问题,我已对你的附件公式作了修改:
C4等于数组公式:=INDEX(INDIRECT($I$1&"!C"&COLUMN(),),SMALL(IF(INDIRECT($I$1& "!D4:D20")=$J$1,ROW($D$4:$D$20),4^8),ROW(A1)))&""右拉下拉。
附件:
sample.rar
(15.59 KB, 下载次数: 56)
[ 本帖最后由 ggsmart 于 2009-5-4 10:26 编辑 ] |
|