根据单元格的值提取所有行,无需VBA

问题描述 投票:0回答:5

我真的很难找到这个问题的答案,因为在网上我真的只找到了这个问题的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 公式进行此类迭代选择。即使没有解决问题,我仍然会感激任何可以了解有关此类问题的更多资源的方向。

excel excel-formula
5个回答
9
投票

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

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

并抄下:



O行都标记有一个简单的顺序值。这使得常用的 MATCH() / INDEX() 方法变得容易。

选择其他单元格并输入:

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

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


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),"")}

“名称”的第一个单元格公式 --> 假设名称位于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
投票

以下数组公式可以放在第 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
函数不是必需的,但它可以生成更干净的数据集,它所做的只是用空白替换没有返回任何有用内容的公式。


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


0
投票

=过滤器(A:D,A:A=“O”) 希望它对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.