我使用此代码删除范围,其中该范围的最后一列(AA)中的某个单元格等于工作表(K2)中其他位置指定的变量。
代码使用Sub UncommitSession()
Dim WHAT_TO_FIND As String
Dim ws As Excel.Worksheet
Dim FoundCell As Excel.Range
Dim iVal As Integer
iVal = Application.WorksheetFunction.CountIf(Range("AA5:AA800"), Range("K2"))
WHAT_TO_FIND = Range("K2")
For i = 1 To iVal
Set ws = ActiveSheet
Set FoundCell = ws.Range("AA:AA").Find(what:=WHAT_TO_FIND, lookat:=xlWhole)
If Not FoundCell Is Nothing Then
Range("Q" & FoundCell.Row & ":AA" & FoundCell.Row).Delete Shift:=xlUp
Else
MsgBox (WHAT_TO_FIND & " not found in session archive.")
End If
Next i
End Sub
删除该数据并向上移动其余数据。
所有这一切都是一次完成一行,直到条件不再为真。
唯一的问题是这种运行速度非常慢 - 即使是一次删除25-30行数据也是如此。我该怎么做才能加快速度?
-dNOPAUSE -dBATCH -dSAFER -dPDFSETTINGS=/screen -r300 -sDEVICE=pdfwrite
-sOutputFile=file.pdf -c .setpdfwrite -f inputfile.ps
答案 0 :(得分:1)
我认为最快的解决方案是设置自动过滤器,选择可见行并删除它们。 以下是我的一个项目的示例,该项目使用自动过滤器通过列表对象:
Dim lstTable As ListObject: Set lstTable = rngTarget.Worksheet.ListObjects.Add(xlSrcRange, rngTarget, , xlYes)
lstTable.Range.AutoFilter colFilter, varValue
lstTable.DataBodyRange.EntireRow.Delete
在上面你需要改变rngTarget来引用你的表,colFilter指的是AA的列号和varValue是WHAT_TO_FIND。
<强>更新强>
根据您的代码自定义:
Sub UncommitSession()
Dim ewsTarget As Worksheet: Set ewsTarget = ActiveSheet
Dim varValue As String: varValue = ewsTarget.Range("K2").Value
Dim rngTarget As Range: Set rngTarget = ewsTarget.Range("A5:AA800")
Dim lstTable As ListObject: Set lstTable = rngTarget.Worksheet.ListObjects.Add(xlSrcRange, rngTarget, , xlYes)
lstTable.Range.AutoFilter ewsTarget.Range("AA1") - ewsTarget.Range("A1") + 1, varValue
lstTable.TableStyle = vbNullString
lstTable.DataBodyRange.EntireRow.Delete
lstTable.Unlist
End Sub
但是,我没有你的工作簿,所以我无法测试它。