根据没有VBA的单元格值提取所有行

时间:2016-04-08 17:50:13

标签: excel excel-formula

我真的很难找到答案,因为网上我真的只找到了解决这个问题的VBA解决方案,而这并不是我想要学习的方法。

问题

BLOOD NAME  AGE GENDER
A   David   18  Male
B   Sarah   22  Female
O   Lucy    32  Female
AB  Steven  23  Male
O   John    11  Male
B   Mike    25  Male
AB  Paul    24  Male
O   Amy 23  Female
B   Drake   22  Female
O   Linda   11  Female

非常简单地从上面的数据集中我希望重新创建此范围,但仅过滤选择BLOOD TYPE O.

MY ATTEMPTS

从VLookup表开始,但是在第一次出现O时停止。然后尝试将IF / THEN / ELSE逻辑合并到MATCH操作数中,试图找到输出到数组的行号。 (不会发布我失败的尝试)我确实在网上发现了一个类似的问题,但是他们通过手动使用ROW(A1),ROW(A2)等手动参考范围来解决它并不是我所追求的。

真的想学习如何仅使用Excel公式进行此类迭代选择。即使没有解决问题的任何方向,我可以了解更多关于这种类型问题的资源,仍然会受到赞赏。

4 个答案:

答案 0 :(得分:7)

这不使用数组公式,但使用帮助列。假设cols A D 的数据,在 E2 中输入:

=IF(A2="O",1+MAX($E$1:E1),"")

并复制下来:

enter image description here
每个 O 行都标有简单的顺序值。这使得通常的 MATCH()/ INDEX()方法变得容易。

选择其他一些单元格并输入:

=IFERROR(INDEX(A:A,MATCH(ROWS($1:1),$E:$E,0)),"")

并向下和向下复制此单元格:

enter image description here

答案 1 :(得分:2)

这是一个包含数组公式的解决方案。它的计算速度非常慢,老实说VBA是一个更好的解决方案。您需要在输入公式后按“Ctrl + Shift + Enter”告诉excel这些是数组公式,这将在方程式周围添加{}。最后,向下拖动数组公式以查看血型为“O”的第一个“X”结果:

“血液”的第一个细胞配方 - >假设血液在sheet1的A列中 {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),1,1),"")}

“名称”的第一个单元格公式 - >假设name在sheet1的B列中 {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),2,1),"")}

“年龄”的第一个单元格公式 - >假设年龄在sheet1的c列中 {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),3,1),"")}

“性别”的第一个单元格公式 - >假设性别在sheet1的d列中 {=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),4,1),"")}

结果:

BLOOD   NAME    AGE GENDER
O       Lucy    32  Female
O       John    11  Male
O       Amy     23  Female
O       Linda   11  Female

答案 2 :(得分:2)

以下数组公式可放在第2行(从E列开始的任何位置),并在必要时向下复制3列并向下:

=IFERROR(INDEX(A:A,SMALL(IF(ISNUMBER(SEARCH("O",$A$2:$A$11)),ROW($A$2:$A$11),""),ROW()-1)),"")

使用 Ctrl + Shift + Enter 输入并使用固定数组(A2:A11)。如果您的数组要更改大小,您可以使用INDIRECTCOUNTA动态引用它,以便它始终包含使用的范围,如下所示:< / p>

=IFERROR(INDEX(A:A,SMALL(IF(ISNUMBER(SEARCH("O",INDIRECT("$A2:$A"&COUNTA(A:A)))),ROW(INDIRECT("$A2:$A"&COUNTA(A:A))),""),ROW()-1)),"")

发生了什么:

SEARCH函数正在查找&#34; O&#34; s,然后IF返回行号,如果&#34; O&#34;被发现,没有,如果没有&#34; O&#34;被发现了。

SMALL函数正在查找SEARCH函数返回的 n 结果实例,其中 n = {{1 }}

ROW()-1函数返回数组A:A,B:B等中的 n 值,其中 n =返回的行号INDEX函数。

SMALL函数不是必需的,但它可以创建一个更干净的数据集,它所做的只是替换那些没有用空白返回任何有用的公式。

答案 3 :(得分:0)

尝试以下标准公式:

= IFERROR( INDEX( A$2:A$11, AGGREGATE( 15, 6,
ROW($A:$A) / ( $A$2:$A$11 = "O" ), ROWS( $A$2:$A2 ) ) ), "" )

或者如果您想限制列A的大小

= IFERROR( INDEX( A$2:A$11, AGGREGATE( 15, 6,
ROW($A$1:$A$11) / ( $A$2:$A$11 = "O" ), ROWS( $A$2:$A2 ) ) ), "" )

G2中输入公式,然后将其复制到G2:J10

enter image description here