VBA代码基于变量删除范围 - 运行缓慢

时间:2016-11-17 14:22:21

标签: excel vba excel-vba

我使用此代码删除范围,其中该范围的最后一列(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

1 个答案:

答案 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

但是,我没有你的工作簿,所以我无法测试它。