You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA多表合并复制循环如何处理表头下空行导致的数据遗漏问题

问题原因

原代码使用wks.Cells(Rows.Count, "A").End(xlUp).Row从A列底部向上查找最后一个非空行,若A列表头和有效数据之间存在空行,查找逻辑会在空行位置提前停止,导致空行下方的数据无法被识别。

修复后代码

利用你提到的「每个工作表最多45行、列范围到W列」的已知条件,调整查找最后一行的逻辑,完全规避中间空行的干扰:

Sub CopyPaste() 
    Dim wks As Worksheet
    Dim lastRow As Long

    ' 可选:每次运行前清空Master表原有数据,避免重复累加
    Worksheets("Master").Cells.Clear

    ' 可选:仅保留第一个工作表的表头,删除后会保留每个工作表的表头
    For Each wks In ThisWorkbook.Worksheets
        If wks.Name <> "Master" Then
            wks.Range("A1:W1").Copy Destination:=Worksheets("Master").Range("A1")
            Exit For
        End If
    Next

    For Each wks In ThisWorkbook.Worksheets
        If wks.Name <> "Master" Then
            ' 从第45行向上查找最后一个非空行,不会被中间空行截断
            lastRow = wks.Range("A45").End(xlUp).Row
            ' 若后续工作表最大行数调整,可替换为下面这句动态获取最大行
            ' lastRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row

            ' 复制当前工作表数据(A2开始为跳过表头,需要连表头一起复制改A1即可)
            wks.Range("A2:W" & lastRow).Copy _
            Destination:=Worksheets("Master").Cells(Rows.Count, "A").End(xlUp).Offset(1)
        End If
    Next 

    ' 可选:汇总完成后删除Master表中的空行
    Dim masterLastRow As Long, i As Long
    masterLastRow = Worksheets("Master").Cells(Rows.Count, "A").End(xlUp).Row
    For i = masterLastRow To 2 Step -1
        If WorksheetFunction.CountA(Worksheets("Master").Range("A" & i & ":W" & i)) = 0 Then
            Worksheets("Master").Rows(i).Delete
        End If
    Next i
End Sub

关键修改说明

  • 调整最后一行的查找逻辑:从已知的最大数据行(45行)向上查找,不管中间有没有空行,都能定位到整个工作表最后一条有效数据的位置
  • 增加了多个可选优化逻辑,可根据实际需求选择保留或删除
  • 兼容行数变动场景:如果后续工作表数据行数超过45,直接替换lastRow的赋值逻辑即可自动适配

内容的提问来源于stack exchange,提问作者Joseph Santillan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:06:03