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

如何用Excel VBA将E列非0的所有行复制到另一工作表?

问题原因

两段代码的核心问题是:lrowdat仅在循环开始前被赋值一次,每次找到符合条件的行时,都会把数据写入同一个行号,后续内容会覆盖之前的,最终只保留最后一条符合条件的记录。

修改后的代码

版本1(原alt1修改)

在每次写入符合条件的数据后,将lrowdat加1,确保下一条数据写入新行:

Sub alt1()
    Dim wsfrom As Worksheet
    Dim wsData As Worksheet
    
    Set wsfrom = Sheets("Alt")
    Set wsData = Sheets("Dat")
    
    Dim lrowdat As Long
    Dim lrowfrom As Long
    Dim i As Long ' 显式声明循环变量,避免隐式类型
    
    lrowdat = ThisWorkbook.Sheets("Dat").Cells(Rows.Count, 1).End(xlUp).Row + 1
    lrowfrom = ThisWorkbook.Sheets("Alt").Range("A" & Rows.Count).End(xlUp).Row
    
    For i = 10 To lrowfrom
        If wsfrom.Range("E" & i) <> 0 Then
            wsData.Range("A" & lrowdat).Value = wsfrom.Range("A" & i).Value
            wsData.Range("D" & lrowdat).Value = wsfrom.Range("D" & i).Value
            wsData.Range("E" & lrowdat).Value = wsfrom.Range("E" & i).Value
            lrowdat = lrowdat + 1 ' 关键:每次写入后行号自增
        End If
    Next i
    
End Sub

版本2(原alt2修改)

同样在粘贴后递增lrowdat,同时关闭屏幕刷新提升运行效率:

Sub alt2()
    Dim wsfrom As Worksheet
    Dim wsData As Worksheet
    
    Set wsfrom = Sheets("Alt")
    Set wsData = Sheets("Dat")
    
    Dim lrowdat As Long
    Dim lrowfrom As Long
    Dim i As Long ' 显式声明循环变量
    
    Application.ScreenUpdating = False ' 关闭屏幕刷新,加快运行速度
    lrowdat = ThisWorkbook.Sheets("Dat").Cells(Rows.Count, 1).End(xlUp).Row + 1
    lrowfrom = ThisWorkbook.Sheets("Alt").Range("A" & Rows.Count).End(xlUp).Row
    
    For i = 10 To lrowfrom
        If wsfrom.Range("E" & i) <> 0 Then
            wsfrom.Range("A" & i).EntireRow.Copy
            wsData.Range("A" & lrowdat).PasteSpecial Paste:=xlPasteValues
            lrowdat = lrowdat + 1 ' 关键:每次粘贴后行号自增
        End If
    Next i
    
    Application.CutCopyMode = False ' 清除复制模式
    Application.ScreenUpdating = True ' 恢复屏幕刷新
End Sub
更高效的批量处理方案

如果数据量较大,逐行循环效率偏低,可以用筛选功能批量复制符合条件的行:

Sub CopyFilteredRows()
    Dim wsFrom As Worksheet, wsDat As Worksheet
    Dim lastRow As Long, targetRow As Long
    
    Set wsFrom = Sheets("Alt")
    Set wsDat = Sheets("Dat")
    
    targetRow = wsDat.Cells(Rows.Count, 1).End(xlUp).Row + 1
    lastRow = wsFrom.Cells(Rows.Count, "E").End(xlUp).Row
    
    ' 筛选E列不为0的行
    wsFrom.Range("E9:E" & lastRow).AutoFilter Field:=1, Criteria1:="<>" & 0
    
    ' 复制筛选后的可见行(从第10行开始)
    wsFrom.Range("A10:E" & lastRow).SpecialCells(xlCellTypeVisible).Copy
    wsDat.Range("A" & targetRow).PasteSpecial xlPasteValues
    
    ' 取消筛选
    wsFrom.AutoFilterMode = False
    Application.CutCopyMode = False
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:26