6

我正在尝试运行一个宏,该宏将删除 B 列中不包含特定值的行。这是我的代码:

Sub deleteRows()
    Dim count As Integer
    count = Application.WorksheetFunction.CountA(Range("AF:AF"))
    Dim i As Integer
    i = 21
    Do While i <= count
        If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False) Then
            If (Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("IAM", Range("B" & i))) = False) Then
                Rows(i).EntireRow.Delete
                i = i - 1
                count = count - 1
            End If
        End If
        i = i + 1
    Loop
End Sub

现在它应该做的是:

1.)找到要通过的行数并将其设置为计数(这有效)

2.) 从第 21 行开始,在 B 列中查找“OSR 平台”和“IAM”[这种作品(见下文)]

3.)如果没有找到,删除整行并根据需要调整计数和行号(这有效)

出于某种原因,每当代码到达第一个 If 语句时,就会弹出一个带有红色 X 的错误窗口,上面只显示“400”。据我所知,我已经把所有的东西都写在语法上,但显然有问题。

4

2 回答 2

9

您可能希望以另一种方式循环开始。当您删除一行时,之前的所有行都会移动。你解释了这一点,但是反向循环比跟踪我何时偏移循环内的当前位置更容易理解(无论如何对我来说):

For i = count To 21 Step -1

此外,您过于依赖Application.WorksheetFunction

(Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search("OSR Platform", Range("B" & i))) = False)

InStr(Range("B" & i).value, "OSR Platform") > 0

Application.WorksheetFunction需要更多的处理能力,并且根据您要完成的工作,这可能需要更长的时间。同样对于这个建议的更改,代码大小会减小,并且在没有它的情况下变得更容易阅读。

count也可以在没有以下情况下获得A.WF

  • Excel 2000/03:count = Range("AF65536").End(xlUp).Row
  • Excel 2007/10:count = Range("AF1048576").End(xlUp).Row
  • 版本无关:count = Range("AF" & Rows.Count).End(xlUp).Row

另一件事是您可以做(在这种情况下应该If做)是将您的陈述合并为一个。

进行这些更改,您最终会得到:

Sub deleteRows()
    Dim count As Integer
    count = Range("AF" & Rows.Count).End(xlUp).Row
    Dim i As Integer
    For i = count To 21 Step -1
        If Len(Range("B" & i).value) > 0 Then
            If InStr(Range("B" & i).value, "OSR Platform") > 0 Or InStr(Range("B" & i).value, "IAM") > 0 Then
                Range("B" & i).Interior.Color = RGB(255, 0, 0)
            End If
        End If
    Next i
End Sub

如果这没有帮助,那么您可以逐行遍历代码。添加断点,并使用F8. 突出显示代码中的变量,右键单击,选择“添加监视...”,单击“确定”,(这是一个很好的资源,可以帮助您进行一般调试)并注意以下几点:

  • 哪一行出现错误?
  • 什么是价值i以及count何时发生?(添加对这些变量的监视以提供帮助)
于 2012-07-23T15:15:39.653 回答
3

这对我有用。它使用自动筛选,不需要循环或工作表功能。

Sub DeleteRows()

Dim currentSheet As Excel.Worksheet
Dim rngfilter As Excel.Range
Dim lastrow As Long, lastcolumn As Long

Set currentSheet = ActiveSheet

' get range
lastrow = currentSheet.Cells(Excel.Rows.Count, "AF").End(xlUp).Row
lastcolumn = currentSheet.Cells(1, Excel.Columns.Count).End(xlToLeft).Column
Set rngfilter = currentSheet.Range("A1", currentSheet.Cells(lastrow, lastcolumn))

' filter by column B criteria
rngfilter.AutoFilter Field:=2, Criteria1:="<>*OSR Platform*", Operator:= _
        xlAnd, Criteria2:="<>*IAM*"

' delete any visible row greater than row 21 which does not meet above criteria
rngfilter.Offset(21).SpecialCells(xlCellTypeVisible).EntireRow.Delete

' remove autofilter arrows
currentSheet.AutoFilterMode = False
End Sub

此代码将自动筛选应用于 B 列,以查看 B 列中哪些行既不包含“OSR 平台”也不包含“IAM”。然后它只是删除大于 21 的剩余行。首先在工作簿的副本上对其进行测试。

非常赞同这个 OzGrid线程,因为我永远记不起过滤后选择可见单元格的正确语法。

于 2012-07-23T18:16:46.823 回答