Excel VBA求助:如何仅复制工作表中筛选后的数据到另一工作表?
筛选后数据复制的VBA代码修改方案
原代码直接对固定单元格范围赋值,未区分筛选后的可见行与隐藏行,因此会复制全部数据。以下是修改后的代码,实现仅复制「DRIVE input form」工作表中表格的筛选后可见数据到「Dowlex 2023」工作表:
Private Sub CommandButton1_Click() Dim sht1 As Worksheet, sht2 As Worksheet Dim tbl As ListObject Dim lastRowSht2 As Long ' 绑定目标工作表 Set sht1 = ThisWorkbook.Sheets("DRIVE input form") Set sht2 = ThisWorkbook.Sheets("Dowlex 2023") ' 原逻辑:sht2的C1为空则退出 If sht2.Range("C1").Value = "" Then Exit Sub ' 清空sht2的A2:P100区域 sht2.Range("A2:P100").ClearContents ' 获取sht1中的表格对象(若表格有名称,可改为ListObjects("你的表格名称")) Set tbl = sht1.ListObjects(1) ' 检查表格是否有数据 If Not tbl.DataBodyRange Is Nothing Then ' 获取sht2中A列的最后非空行,确定数据起始粘贴行 lastRowSht2 = sht2.Cells(sht2.Rows.Count, "A").End(xlUp).Row If lastRowSht2 < 2 Then lastRowSht2 = 2 ' 按原代码的列映射关系,复制筛选后可见行的数据 ' 注意:请将括号内的列标题替换为你表格中对应列的实际标题 ' sht1表格J列 → sht2的A列 tbl.ListColumns("J列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "A") ' sht1表格F列 → sht2的C列 tbl.ListColumns("F列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "C") ' sht1表格G列 → sht2的E列 tbl.ListColumns("G列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "E") ' sht1表格K列 → sht2的F列 tbl.ListColumns("K列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "F") ' sht1表格M列 → sht2的G列 tbl.ListColumns("M列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "G") ' sht1表格P列 → sht2的H列 tbl.ListColumns("P列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "H") ' sht1表格N列 → sht2的I列 tbl.ListColumns("N列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=sht2.Cells(lastRowSht2, "I") ' 若只需复制值(不含格式),可替换上述Copy语句为赋值形式,示例: ' sht2.Cells(lastRowSht2, "A").Resize(_ ' tbl.ListColumns("J列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count, 1).Value = _ ' tbl.ListColumns("J列标题").DataBodyRange.SpecialCells(xlCellTypeVisible).Value End If End Sub
关键修改说明
- 定位表格对象:通过
ListObject操作Excel表格,这是处理结构化表格数据的标准方式,能准确识别筛选状态。 - 筛选后可见行获取:使用
SpecialCells(xlCellTypeVisible)仅提取筛选后的可见行数据,排除隐藏行。 - 动态粘贴起始行:通过
End(xlUp)获取目标工作表的最后非空行,避免固定行号导致的数据覆盖或空白问题。 - 列映射保留原逻辑:完全沿用你原代码中列的对应关系,确保数据复制位置正确。
注意事项
- 必须将代码中的
"J列标题"等替换为你「DRIVE input form」表格中对应列的实际标题文本,或者用列索引替换(比如tbl.ListColumns(6)对应表格第6列,即F列)。 - 如果表格可能没有数据,代码中的
If Not tbl.DataBodyRange Is Nothing判断会避免运行报错。
内容的提问来源于stack exchange,提问作者Vinnies
相关产品推荐
相关产品推荐

