我真的很难找到这个问题的答案,因为在网上我真的只找到了这个问题的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
非常简单地从上面的数据集中,我希望重新创建此范围,但仅筛选选择 O 型血。
我的尝试
从 VLookup 表开始,但在第一次出现 O 时停止。然后尝试将 IF/THEN/ELSE 逻辑合并到 MATCH 操作数中,试图找到输出到数组的行号。 (不会发布我失败的尝试)我确实在网上发现了一个类似的问题,但是他们通过使用 ROW(A1)、ROW(A2) 等手动引用范围来解决它,这不是我所追求的。
真的很想学习如何仅使用 Excel 公式进行此类迭代选择。即使没有解决问题,我仍然会感激任何可以了解有关此类问题的更多资源的方向。
这是一个数组公式的解决方案。它的计算速度非常慢,老实说 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),"")}
“名称”的第一个单元格公式 --> 假设名称位于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),"")}
“性别”的第一个单元格公式 --> 假设性别位于工作表 1 的 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 行(从 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)。如果您的数组要更改大小,您可以使用
INDIRECT
和 COUNTA
对其进行动态引用,以便它始终包含 used 范围,如下所示:
=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”,如果找到“O”,则IF
返回行号,如果未找到“O”,则不返回任何内容。
SMALL
函数正在查找SEARCH
函数返回的结果的第n实例,其中n =
ROW()-1
。
INDEX
函数返回数组 A:A、B:B 等中的第 n值,其中 n = SMALL
函数返回的行号。
IFERROR
函数不是必需的,但它可以生成更干净的数据集,它所做的只是用空白替换没有返回任何有用内容的公式。
=过滤器(A:D,A:A=“O”) 希望它对你有用。