Excel 复制粘贴VBA代码有空行

Excel 复制粘贴VBA代码有空行,excel,excel-2007,vba,Excel,Excel 2007,Vba,下面的代码将搜索、复制和粘贴找到的数据到另一个工作表中。但是,在粘贴的工作表中执行此操作时,会出现空白。例如:在单元格A1中找到“要复制”,并将整行复制到指定的工作表中。在A4中找到“待复制”,并将整行复制到指定的工作表中。但是,粘贴的纸张中A1和A4之间有两个空白行。谢谢你的帮助 Sub Deleting() Application.ScreenUpdating = False Dim wsh As Worksheet, i As Long, Endr As Long, x1

下面的代码将搜索、复制和粘贴找到的数据到另一个工作表中。但是,在粘贴的工作表中执行此操作时,会出现空白。例如:在单元格A1中找到“要复制”,并将整行复制到指定的工作表中。在A4中找到“待复制”,并将整行复制到指定的工作表中。但是,粘贴的纸张中A1和A4之间有两个空白行。谢谢你的帮助

Sub Deleting()
    Application.ScreenUpdating = False
    Dim wsh As Worksheet, i As Long, Endr As Long, x1 As Worksheet, p As Long
    Set wsh = ActiveSheet
    Worksheets.Add(Before:=Worksheets("Original Sheet")).Name = "Skipped"
    Set x1 = Worksheets("Skipped")
    Worksheets("ABC").Activate
    i = 2
    Endr = wsh.Range("A" & wsh.Rows.Count).End(xlUp).Row
    While i <= Endr
        If Cells(i, "A") = "To Be Copied" Then
            wsh.Rows(i).Copy
            x1.Rows(i).PasteSpecial
            p = p + 1
            Endr = Endr + 1
        End If
        i = i + 1
    Wend
End Sub
子删除()
Application.ScreenUpdating=False
将wsh标注为工作表,i标注为长,Endr标注为长,x1标注为工作表,p标注为长
设置wsh=ActiveSheet
工作表。添加(之前:=工作表(“原始工作表”))。Name=“跳过”
设置x1=工作表(“跳过”)
工作表(“ABC”)。激活
i=2
Endr=wsh.Range(“A”&wsh.Rows.Count).End(xlUp).Row

而i则需要两个计数器:
i
用于源行,
j
用于目标行。当复制一行时,您只能增加
j

您现有的代码需要

  • 书写行位置(切割器点)的单独计数器,或
  • 使用
    xlUp
    粘贴到上次使用的“跳过”行以查找上次使用的单元格
  • 但更好的方法是使用
    AutoFilter
    一次复制行。像下面这样

    Sub Quicker()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng1 As Range
    Application.ScreenUpdating = False
    Set ws1 = Sheets("ABC")
    Set ws2 = Worksheets.Add(Before:=Worksheets("Original Sheet"))
    'in case Skipped exists
    On Error Resume Next
    ws2.Name = "Skipped"
    On Error GoTo 0
    ws1.AutoFilterMode = False
    Set rng1 = ws1.Range(ws1.[a1], ws1.Cells(Rows.Count, "A").End(xlUp))
    rng1.AutoFilter 1, "To Be Copied"
    If rng1.SpecialCells(xlCellTypeVisible).Count > 1 Then
        Set rng1 = rng1.Offset(1, 0).Resize(rng1.Rows.Count - 1)
        rng1.EntireRow.Copy ws2.[a1]
    End If
    ws1.AutoFilterMode = False
    MsgBox "Sheet " & ws2.Name & " updated"
    End Sub
    

    正确地缩进代码将使每个人(包括你自己)都更容易阅读和理解代码。这一次我是为你做的。@Jean-FrançoisCorbett Corbett谢谢,下次我会记住这一点:)+1否则你的目的地总是与你的来源完全相关