代码之家  ›  专栏  ›  技术社区  ›  bd528

在VBA Excel中不使用复制粘贴将数据从一张图纸移动到另一张图纸

  •  0
  • bd528  · 技术社区  · 7 年前

    我有一个宏在后台运行,大约需要30分钟才能完成。

    它使用如下代码将数据从一个工作表移动到另一个工作表:

                .AutoFilter Field:=19, Criteria1:=Array("Rejected", "Withdrawn"), Operator:=7
                If xlapp.WorksheetFunction.Subtotal(3, .Range("A2:A500000")) <> 0 Then
                    Set wsNew = xlapp.Sheets.Add(After:=xlapp.Sheets(xlapp.Sheets.Count))
                    wsNew.Name = "Rejected & Withdrawn"
                    wsNew.Tab.Color = RGB(255, 125, 125)
                    .SpecialCells(12).Copy Destination:=wsNew.Range("A1")
                    wsNew.Cells.EntireColumn.AutoFit
                End If
    

    剪贴板一直在使用,这意味着当宏运行时,我不能可靠地使用剪贴板。

    有没有不使用剪贴板移动(或复制)一行数据的方法?

    理想情况下,我希望避免在行的列中循环,因为这可能会增加运行宏所需的时间。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jkpieterse    7 年前

    一种方法是使用高级过滤器(修改“Sheet1”,使其与工作表名称匹配):

    Set wsNew = xlApp.Sheets.Add(After:=xlApp.Sheets(xlApp.Sheets.Count))
    wsNew.Name = "Rejected & Withdrawn"
    wsNew.Tab.Color = RGB(255, 125, 125)
    With Worksheets("Sheet1")
        wsNew.Range("A1").Value = .Cells(1, 19).Value
        wsNew.Range("A2").Value = "Withdrawn"
        wsNew.Range("A3").Value = "Rejected"
        .UsedRange.AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=wsNew.Range("A1:A3"), CopyToRange:=wsNew.Range("C1"), Unique:=False
    End With
    wsNew.Range("A:B").EntireColumn.Delete
    wsNew.UsedRange.Columns.AutoFit
    
    推荐文章