如何用非VBA公式在Excel中生成无空行的工作表行子集
当然可以用纯公式实现!完全不需要用到Filter或AutoFilter功能,咱们结合你给的例子来具体说明:
这种方法最省心,公式输入后会自动“溢出”填充结果,不用手动下拉操作。
在Sheet2的A2单元格输入下面的公式:=FILTER(People!A2:B6, People!B2:B6>18)
这里我用的筛选条件是「年龄大于18」,你可以根据需求自由修改:比如想筛选叫Bob的人,就改成People!A2:A6="Bob";要多条件组合的话,用*表示“且”,+表示“或”,比如(People!B2:B6>10)*(People!B2:B6<30)就是筛选年龄在10到30之间的人。
- 效果:公式会自动把符合条件的整行数据填充到Sheet2的A、B列,绝对不会出现空行,而且Sheet1的数据更新后,Sheet2会自动同步结果。
如果你的Excel不支持动态数组,就用这个方案,操作稍繁琐但同样能满足需求:
在Sheet2的A2单元格输入下面的公式,输入完成后按Ctrl+Shift+Enter(不是普通回车),这是传统数组公式的触发方式:=INDEX(People!A$2:A$6, SMALL(IF(People!B$2:B$6>18, ROW(People!B$2:B$6)-ROW(People!B$2)+1), ROW(A1)))
然后把公式向右拖到B列,再向下拖到没有结果出现为止。如果超出筛选结果的行显示#NUM!错误值,可以用IFERROR包裹公式来隐藏错误,修改后公式如下:=IFERROR(INDEX(People!A$2:A$6, SMALL(IF(People!B$2:B$6>18, ROW(People!B$2:B$6)-ROW(People!B$2)+1), ROW(A1))), "")
- 原理:先用
IF标记出符合条件的行,再用SMALL按顺序提取这些行的位置,最后用INDEX取出对应的数据,IFERROR则把超出结果范围的行显示为空,避免出现难看的错误提示。
两种方法都能实现你的核心需求:Sheet2只保留Sheet1中符合条件的行,无空行,且全程用公式驱动,完全不依赖筛选功能。
内容的提问来源于stack exchange,提问作者theanine

