VBA复制指定区域非空行至另一工作表首空行问题求助
解决VBA复制粘贴时带入空行的问题
核心问题是你的代码复制了固定区域AG4:AS13的所有行,包括空行,这些空行粘贴到目标工作表后会被End(xlUp)识别为已占用的单元格,导致后续粘贴位置错误。下面是两种高效的解决方法:
方法一:仅复制源区域中的非空行
直接定位源区域内有实际值的行范围,从根源避免空行被粘贴:
Private Sub test() Application.ScreenUpdating = False Dim copySheet As Worksheet Dim pasteSheet As Worksheet Dim lastDataRow As Long Dim copyRange As Range Set copySheet = Worksheets("Blad1") Set pasteSheet = Worksheets("Games") ' 找到AG列从第4行开始的最后一个非空行,限制在13行以内(对应原区域的AS13) lastDataRow = Application.Max(copySheet.Range("AG4").End(xlDown).Row, 4) lastDataRow = Application.Min(lastDataRow, 13) ' 定义要复制的非空范围 Set copyRange = copySheet.Range("AG4:AS" & lastDataRow) ' 粘贴到目标工作表的第一个空行 copyRange.Copy pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues Application.CutCopyMode = False Application.ScreenUpdating = True End Sub
说明:
End(xlDown)从AG4向下定位连续非空行的末尾,Max确保至少取到第4行(即使AG4为空),Min保证不超出原区域的AS13行。- 复制范围仅包含有值的行,后续粘贴时
End(xlUp)会准确找到真正的最后一行数据。
方法二:粘贴后删除目标区域的空行
如果需要保留原区域结构但去除空行,可在粘贴后删除目标工作表中的空行:
Private Sub test() Application.ScreenUpdating = False Dim copySheet As Worksheet Dim pasteSheet As Worksheet Dim pasteStartRow As Long Dim pasteEndRow As Long Dim i As Long Set copySheet = Worksheets("Blad1") Set pasteSheet = Worksheets("Games") ' 获取粘贴起始行 pasteStartRow = pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Row ' 粘贴所有内容 copySheet.Range("AG4:AS13").Copy pasteSheet.Cells(pasteStartRow, 1).PasteSpecial xlPasteValues ' 计算粘贴的结束行(原区域共10行:4到13) pasteEndRow = pasteStartRow + 9 ' 从下往上删除空行,避免行号变动导致漏删 For i = pasteEndRow To pasteStartRow Step -1 If WorksheetFunction.CountA(pasteSheet.Rows(i)) = 0 Then pasteSheet.Rows(i).Delete End If Next i Application.CutCopyMode = False Application.ScreenUpdating = True End Sub
说明:
- 先粘贴所有内容,再从粘贴区域的最后一行往上遍历,删除完全为空的行。
CountA(pasteSheet.Rows(i)) = 0判断整行是否无任何值,确保只删除真正的空行。
推荐使用方法一,它更高效,无需额外删除操作,直接复制有效数据。
内容的提问来源于stack exchange,提问作者Anthony Struelens
相关产品推荐
相关产品推荐

