更快更有效的删除行的方法

时间:2013-07-10 04:57:56

标签: excel excel-vba excel-2010 vba

我想做什么。

我有两个工作表“dashboard”和“temp calc”。我正在尝试根据每个工作表中的两个不同条件删除行。

信息中心 - 如果列号15<>删除行活性

如果列号10<>删除行E& D,ESG,PLM SER,VPD,PLM Prod。

临时计算 =如果第6列为空白,则删除行

如果列号为3n1,则删除行 其中n1和n2是仪表板中范围(“n1”和“n2”)的日期。

我尝试了什么。

  1. 使用for循环
  2. 使用过滤器
  3. 数组(我无法使用数组
  4. 实际执行此操作

    我的问题

    这些方法非常慢,我的数据大约是1,68,000(每周增长)。所以我正在寻找替代我尝试过的方法。基本上可以快速做到这一点。

    我的代码我试过了。 以下代码有效但根据数据需要6-10分钟

                        Worksheets("Dashboard").Activate
                        Range("A4").Select
                        lastrow = Cells(Rows.Count, 1).End(xlUp).Row
                        For x = lastrow To 4 Step -1
                         If Cells(x, 15).Value <> "Active" Or (Cells(x, 10).Value <> "E&D" And Cells(x, 10).Value <> "ESG" _
                         And Cells(x, 10).Value <> "PLM SER" And Cells(x, 10).Value <> "VPD" And Cells(x, 10).Value <> "PLM PROD") Then
                        Rows(x).Delete
                        End If
                        Next x
    

    下面的代码使用自动过滤方法。问题是过滤后不会留在我的比较范围内的数据(即如果我的n1 = 1月1日和n2 = 2013年1月30日。过滤器仍会留下数据,不在n1和n2范围内。

    Set ws = ThisWorkbook.Worksheets("Temp Calc")
    
    
    
       '~~> Start Date and End Date
       Sheets("Dashboard").Select
    N1 = Range("n1").Value
    N2 = Range("n2").Value
    Sheets("Temp Calc").Select
    
    With ws
    
    '~~> Remove any filters
    .AutoFilterMode = False
    
    '~~> Get the last row
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
    '~~> Identify your data range
    Set FltrRng = .Range("A1:F" & lRow)
    
    '~~> Filter the data as per your criteria
    With FltrRng
    '~~> First filter on blanks
    .AutoFilter Field:=6, Criteria1:="="
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '~~> Delete the filtered blank rows
    .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    
    ws.ShowAllData
    
    '~~> Next filter on Start Date
    .AutoFilter Field:=3, Criteria1:="<" & N1, Operator:=xlAnd
    '~~> Finally filter on End Date
    .AutoFilter Field:=4, Criteria1:=">" & N2, Operator:=xlAnd
    
    '~~> Filter on col 6 for CNF
    '.AutoFilter Field:=6, Criteria1:="CNF"
    
    '~~> Delete the filtered rows
    .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
    '~~> Remove any filters
    .AutoFilterMode = False
    End With
    

    如果问题不充分,请道歉。 任何可以加速我想要做的事情的替代方案都非常受欢迎。

2 个答案:

答案 0 :(得分:0)

自动过滤器很快 - 绝对是可行的方法 - 但它隐藏数据行并且不会删除它们。由于您的代码在最后关闭了过滤器,因此隐藏的行会返回。相反,您应该应用过滤器,全选,复制,粘贴到新工作表,然后删除旧工作表。这将非常快 - 并且完全符合您的要求。

道歉我没有发布工作代码 - 在ipad上打字......

答案 1 :(得分:0)

尝试以下代码

Sub DeleteRows()

    Dim x As Long
    Dim Rng As Range
    Dim lastRow As Long

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    With Sheets("Dashboard")
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Range("A1:A" & lastRow)


        For x = Rng.Rows.Count To 1 Step -1
            If .Cells(x, 15).Value <> "Active" Or (.Cells(x, 10).Value <> "E&D" And .Cells(x, 10).Value <> "ESG" _
             And .Cells(x, 10).Value <> "PLM SER" And .Cells(x, 10).Value <> "VPD" And .Cells(x, 10).Value <> "PLM PROD") Then
                Rng.Rows(x).Delete
            End If
        Next

    End With

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

End Sub