400错误Excel宏

jra*_*rad 6 excel vba excel-vba

我正在尝试运行一个宏来删除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
Run Code Online (Sandbox Code Playgroud)

现在它应该做的是以下内容:

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

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

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

出于某种原因,每当代码到达第一个If语句时,弹出一个带有红色X的错误窗口,只显示"400".据我所知,我已经在语法上写出了一切,但显然有些不对劲.

Gaf*_*ffi 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
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,那么你可以逐行逐步完成代码.添加断点,然后逐步执行F8.突出显示代码中的变量,右键单击,选择"添加Watch ...",单击"确定",(这是一个很好的资源,可以帮助您进行一般的调试)并注意以下事项:

  • 哪一行遇到错误?
  • 什么是价值i,并count当这种情况发生?(添加关于这些变量的监视以帮助)