我想做什么。
我有两个工作表“dashboard”和“temp calc”。我正在尝试根据每个工作表中的两个不同条件删除行。
信息中心 - 如果列号15<>删除行活性
如果列号10<>删除行E& D,ESG,PLM SER,VPD,PLM Prod。
临时计算 =如果第6列为空白,则删除行
如果列号为3n1,则删除行 其中n1和n2是仪表板中范围(“n1”和“n2”)的日期。
我尝试了什么。
我的问题
这些方法非常慢,我的数据大约是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
如果问题不充分,请道歉。 任何可以加速我想要做的事情的替代方案都非常受欢迎。
答案 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