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
相关产品推荐
相关产品推荐

