基于没有VBA的单元格值提取所有行

我真的很努力地find一个答案在线我真的只findVBA解决这个问题,这不是我想学习如何做。

问题

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 

从上面的数据集非常简单,我希望重新创build此范围,但只筛选select血型O.

我的尝试

然后尝试将IF / THEN / ELSE逻辑合并到MATCH操作数中,试图找出输出到数组的行号。 (不会发布我的失败尝试)我在网上find了一个类似的问题,但他们通过手动引用范围使用行(A1),行(A2)等解决了它不是我之后。

真的想要学习如何使用Excel公式只做这种types的迭代select。 即使没有解决问题的任何方向的资源,我可以更多地了解这种types的问题,仍然将不胜感激。

这不使用数组公式,但使用辅助列 。 假设列AD中的数据,在E2中input:

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

并抄下来:

在这里输入图像说明
每个O行都标有一个简单的顺序值。 这使得通常的MATCH()/ INDEX()方法变得很容易。

select其他单元格,然后input:

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

并跨越和往下复制这个单元格:

在这里输入图像描述

这是数组公式的解决scheme。 它会计算得非常慢,老实说,VBA是一个更好的解决scheme。 input公式后,您需要通过点击“Ctrl + Shift + Enter”来告诉excel这些是数组公式,这会在公式中加上{}。 最后,拖动数组公式来查看血型为“O”的第一个“X”结果:

“Blood”的第一个单元格公式 – >假设血液位于sheet1的A列中{=IFERROR(INDEX(Sheet1!$A:$D,SMALL(IF(Sheet1!$A:$A="O",ROW(Sheet1!$A:$A)),ROW(1:1)),1,1),"")}

第一个单元格为“名称”的单元格 – >假设名称位于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),"")}

第一个单元格公式为“性别” – >假定性别位于第一列d中的sheet1 {=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行(从E列开始的任何位置),并在3列之间复制,

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

这是使用Ctrl + Shift + Enterinput并使用固定数组(A2:A11)。 如果你的数组要改变大小,你可以通过使用INDIRECTCOUNTA使其对它的引用是dynamic的,这样它总是包含使用的范围,如下所示:

=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函数查找“O”,然后IFfind“O”,则IF返回行号,如果没有find“O”,则返回任何值。

SMALL函数正在查找由SEARCH函数返回的结果的第n个实例,其中n = ROW()-1

INDEX函数返回数组A中的第n个值:A,B:B等,其中n = SMALL函数返回的行号。

IFERROR函数并不是必需的,但是它使得数据集更加清晰,只需要replace那些没有返回空白的公式就可以了。