如何在Excel中筛选已填写值并在另一工作表无空白行展示?
两种简单方法实现你的需求
方法一:纯Excel函数实现(无需编程)
假设你的原始数据工作表名叫参数列表,数据结构为:A列=参数名称,B列=参数值,C列=单位;目标工作表名叫已填参数。
操作步骤:
- 在
已填参数的A1单元格输入公式:=IFERROR(INDEX(参数列表!A:A,SMALL(IF(参数列表!B:B<>"",ROW(参数列表!B:B)),ROW(A1))),"") - 输入完成后,Excel 2019及更早版本需按
Ctrl+Shift+Enter确认(数组公式要求);Excel 365/2021直接回车即可。 - 把A1的公式拖动到B1,修改B1公式中的
参数列表!A:A为参数列表!C:C,让B列显示对应单位。 - 选中A1和B1,一起向下拖动公式,直到出现空白单元格停止——此时显示的都是B列有填写值的参数名和单位,无空白行。
公式逻辑:用IF筛选出B列非空的行号,SMALL按顺序取出这些行号,INDEX匹配对应参数名和单位,IFERROR避免超出范围时显示错误值。
方法二:一键VBA宏(适合批量更新)
如果需要频繁更新数据,宏的效率更高:
- 打开Excel,按
Alt+F11打开VBA编辑器。 - 右键左侧的工作簿名称,选择
插入→模块,粘贴以下代码:Sub 提取已填参数() Dim 源表 As Worksheet, 目标表 As Worksheet Dim 源行 As Integer, 目标行 As Integer ' 修改为你的实际工作表名称 Set 源表 = ThisWorkbook.Worksheets("参数列表") Set 目标表 = ThisWorkbook.Worksheets("已填参数") ' 清空目标表现有内容(需保留表头可删除此行) 目标表.Cells.Clear 目标行 = 1 ' 从第2行开始遍历(源表第1行是表头),无表头则改为1 For 源行 = 2 To 源表.Cells(源表.Rows.Count, "B").End(xlUp).Row If 源表.Cells(源行, "B").Value <> "" Then 目标表.Cells(目标行, "A") = 源表.Cells(源行, "A") 目标表.Cells(目标行, "B") = 源表.Cells(源行, "C") 目标行 = 目标行 + 1 End If Next 源行 MsgBox "提取完成!" End Sub - 修改代码中的
"参数列表"和"已填参数"为你的实际工作表名,无表头则把源行=2改为源行=1。 - 按
F5运行宏,或回到Excel点击开发工具→宏,选择提取已填参数执行。 - 保存文件时需选择
.xlsm格式(启用宏的工作簿),否则宏会丢失。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

