VBA实现工作表指定区域复制至另一工作表并剔除空白行
复制计算值并剔除空白行的VBA解决方案
针对你的需求——复制Refactor区域的公式计算值到OutputSheet的E5起始位置,且剔除首列为空的空白行,同时不修改原工作表的行结构,这里提供两种实用方案:
方案一:利用AutoFilter筛选非空行(简单直观)
借助Excel的筛选功能临时过滤空白行,复制可见单元格即可,无需修改原数据:
Sub RangeRefactor_Filter() Dim wsI As Worksheet Dim wsO As Worksheet Dim rngRefactor As Range Set wsI = ThisWorkbook.Sheets("InputSheet") Set wsO = ThisWorkbook.Sheets("OutputSheet") Set rngRefactor = wsI.Range("Refactor") ' 清除原区域的筛选状态(避免干扰) If wsI.AutoFilterMode Then wsI.AutoFilterMode = False ' 基于首列计算值筛选非空行 rngRefactor.AutoFilter Field:=1, Criteria1:="<>" ' 复制可见单元格的值到目标位置 rngRefactor.SpecialCells(xlCellTypeVisible).Copy wsO.Range("E5").PasteSpecial xlPasteValues ' 恢复原区域的无筛选状态 wsI.AutoFilterMode = False ' 清除剪贴板状态 Application.CutCopyMode = False End Sub
说明
- 该方法仅临时筛选数据,不会删除或修改原工作表的任何行,完全符合你的需求;
- 依赖首列的计算值判断空白行,筛选逻辑和你要求的一致;
- 代码简洁,易理解和维护,适合小数据量场景(你的220行完全适用)。
方案二:数组内存处理(高效无交互)
如果需要更高效的处理(比如未来数据量增大),可以将区域数据加载到内存数组中,遍历筛选后直接写入目标区域:
Sub RangeRefactor_Array() Dim wsI As Worksheet Dim wsO As Worksheet Dim inputArr As Variant Dim outputArr As Variant Dim i As Long, j As Long, outputRow As Long Set wsI = ThisWorkbook.Sheets("InputSheet") Set wsO = ThisWorkbook.Sheets("OutputSheet") inputArr = wsI.Range("Refactor").Value ' 将区域数据加载到内存数组 ' 初始化输出数组(行数和输入一致,列数匹配) ReDim outputArr(1 To UBound(inputArr), 1 To UBound(inputArr, 2)) outputRow = 0 ' 遍历数组,筛选首列非空的行 For i = 1 To UBound(inputArr) If Trim(inputArr(i, 1)) <> "" Then outputRow = outputRow + 1 ' 复制当前行的所有列数据 For j = 1 To UBound(inputArr, 2) outputArr(outputRow, j) = inputArr(i, j) Next j End If Next i ' 将筛选后的数组写入目标区域 If outputRow > 0 Then wsO.Range("E5").Resize(outputRow, UBound(outputArr, 2)).Value = outputArr End If End Sub
说明
- 全程在内存中处理数据,避免多次和工作表交互,速度更快;
- 同样不会修改原工作表的任何内容;
- 适合数据量较大的场景,逻辑清晰,扩展性强。
内容的提问来源于stack exchange,提问作者Grundy
相关产品推荐
相关产品推荐

