2012-07-23 178 views
6

我试图运行一个宏,将删除不包含在列B.特定值的行这里是我的代码:400错误Excel宏

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行和列寻找“OSR平台”和“IAM” B [这种作品(见下文)]

3.)如果找不到,则删除整行并根据需要调整计数和行号(此作品)

由于某些原因,无论代码何时到达第一个If语句,红色的X弹出,只是说“400”。据我所知,我已经在句法上写得很好,但很明显,有什么问题。

+0

不,这不是问题。我已经用If语句的其他条件测试了这个方法,它工作得很好。不过好的想法。 – jrad 2012-07-23 15:07:12

+0

@Gaffi - 来这里建议同样的事情 – LittleBobbyTables 2012-07-23 15:07:24

+0

为了以防万一,我只是尝试了什么加菲已经建议(我开始在表的底部,并向后循环),我得到了同样的错误。 – jrad 2012-07-23 15:08:54

回答

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一步。突出显示代码中的变量,右键单击,选择“添加监视...””,点击‘确定’,(Here's an excellent resource to help you with your debugging in general),并注意以下几点:?

  • 哪条线命中误差
  • 什么是i价值和count当发生这种情况(这些变量添加一个手表吗?帮助)
+0

我有几条评论。首先,第二个InStr不应该是'InStr(“IAM”,Range(“B”&i).value)= 0'?其次,依靠'Application.WorksheetFunction'有什么问题? – jrad 2012-07-23 15:20:56

+0

呃,你说的是'InStr',那是我的错字。 'Application.WorksheetFunction'需要更多的处理能力,并且取决于你要完成的任务,这可能需要相当长的时间。 – Gaffi 2012-07-23 15:22:49

+1

我明白了。不幸的是,你所建议的不起作用,但我知道为什么。没有包含“OSR平台”和“IAM”的单元格会合并到几行中,因此不是所有需要删除的行都会被删除。我试图避免这种情况,而不是删除该行,改变该单元格的颜色,所以我至少有SOMETHING经过。但是,当我做'如果InStr(...)> 0或InStr(...)> 0然后范围(“B”和i).Interior.Color = 35536',它改变了每个单元格的颜色,而不仅仅正如我所预料的那样有“OSR平台”或“IAM”的。任何想法为什么? – jrad 2012-07-23 15:33:56

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 

本准则适用AutoFilte r到B列以查看哪些行不包含B列中的“OSR平台”和“IAM”。然后,它只是删除大于21的剩余行。首先在工作簿的副本上进行测试。

this OzGrid线程的巨大点头,因为我永远不会记得过滤后选择可见单元格的正确语法。

+0

+1因为这也适用于由OP指出的合并单元格。 – Gaffi 2012-07-23 18:40:33

+1

@Gaffi LOL我不知道有合并的单元格! – JimmyPena 2012-07-23 18:44:25