我正在尝试运行一个宏来删除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。)找到要经过的行数并将其设置为count(这可行)
2。)从第21行开始,在B栏中寻找“OSR平台”和“IAM”[这种作品(见下文)]
3。)如果两者都找不到,则删除整行并根据需要调整计数和行号(这有效)
出于某种原因,每当代码到达第一个If语句时,弹出一个带有红色X的错误窗口,只显示“400”。据我所知,我在语法上写得很清楚,但显然有些不对劲。
答案 0 :(得分: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
的情况下获得:
count = Range("AF65536").End(xlUp).Row
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 。突出显示代码中的变量,右键单击,选择“添加监视...”,单击“确定”,(Here's an excellent resource to help you with your debugging in general)并注意以下内容:
i
和count
的价值是多少? (添加关于这些变量的监视以帮助)答案 1 :(得分:3)
这对我有用。它使用AutoFilter,不需要循环或工作表函数。
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
此代码将AutoFilter应用于B列,以查看哪些行既不包含&#34; OSR平台&#34;也不是&#34; IAM&#34;在B列中。然后它只删除大于21的剩余行。首先在工作簿的副本上测试它。
对this OzGrid线程进行了大量的认可,因为我永远无法记住在过滤后选择可见单元格的正确语法。