0

我想要做什么。

我有两个工作表“仪表板”和“临时计算”。我试图根据每个工作表中的两个不同条件删除行。

仪表板- 如果列号 15 <> 处于活动状态,则删除行

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

Temp calc = 如果第 6 列为空,则删除行

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

我已经尝试过。

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

我的问题

这些方法非常慢,我的数据约为 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 = 2013 年 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

如果问题不充分,请致歉。非常感谢任何可以加快我正在尝试做的事情的替代方案。

4

2 回答 2

0

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

抱歉,我没有发布工作代码 - 在 ipad 上输入...

于 2013-07-10T05:12:23.560 回答
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
于 2013-07-10T05:14:06.270 回答