2012-08-13 81 views
2

我是一个新手,VBA,并试图使与if语句工作的两个循环 - 按照这样的代码:脚本一遍又一遍地循环 - 为什么?

Sub Filter() 
For Count = Worksheets("STR").Range("A1").End(xlDown).Row To 1 Step -1 
    For Counter = 5 To Worksheets("Filter").Range("A5").End(xlDown).Row 
    With Worksheets("STR").Range("C" & Count) 
     If .Value Like Worksheets("Filter").Range("C" & Counter).Value _ 
      Or .Value Like Worksheets("Filter").Range("D" & Counter).Value _ 
      Or .Value Like Worksheets("Filter").Range("E" & Counter).Value _ 
      Or .Value Like Worksheets("Filter").Range("A" & Counter).Value Then 
       Worksheets("STR").Range("D" & Count) = "X" 
       'Worksheets("STR").Row("A" & Count).EntireRow.Delete 
      Next Counter 
     End If 
    End With 
Next Count 
End Sub 

在某个阶段,我想它循环一遍又一遍,直到它崩溃。调试器告诉我这是“End If”行,但我没看到有什么问题。有没有办法让这更容易?

在此先感谢!

+1

由于提供的代码不运行 - 你会得到一个Next,却没有对错误的原因是'下一个Counter'线应该在'End If'和'End With'之后,而不是在他们之前 – barrowc 2012-08-13 21:19:24

+0

Hey Barrowc,thx那个提示 - 但它仍然不起作用(或者真的很长)。有什么办法可以让这个表现更好吗? – oliver13 2012-08-13 21:31:36

回答

2

四件事情

  1. 缩进你的代码。这将确保您不会像@barrowc建议的那样犯错误。
  2. 我建议不要使用End(xlDown)来查找最后一行。关于如何查找最后一行,请参见link
  3. ScreenUpdating转为False并重新设置。
  4. 使用错误处理

您的代码将上述四点建议后,将这个样子。

Option Explicit 

Sub Filter() 
    Dim LastRowSTR As Long, LastRowFilter As Long 

    On Error GoTo Whoa 

    Application.ScreenUpdating = False 

    With Sheets("STR") 
     LastRowSTR = .Range("A" & .Rows.Count).End(xlUp).Row 
    End With 

    With Sheets("Filter") 
     LastRowFilter = .Range("A" & .Rows.Count).End(xlUp).Row 
    End With 

    For Count = LastRowSTR To 1 Step -1 
     For Counter = 5 To LastRowFilter 
      With Worksheets("STR").Range("C" & Count) 
       If .Value Like Worksheets("Filter").Range("C" & Counter).Value _ 
       Or .Value Like Worksheets("Filter").Range("D" & Counter).Value _ 
       Or .Value Like Worksheets("Filter").Range("E" & Counter).Value _ 
       Or .Value Like Worksheets("Filter").Range("A" & Counter).Value Then 
        Worksheets("STR").Range("D" & Count) = "X" 
        'Worksheets("STR").Row("A" & Count).EntireRow.Delete 
       End If 
      End With 
     Next Counter 
    Next Count 
LetsContinue: 
    Application.ScreenUpdating = True 
    Exit Sub 
Whoa: 
    MsgBox Err.Description 
    Resume LetsContinue 
End Sub 

INTERESTING READ。

TOPIC:为了 '犯错' 是人类

LINKhttp://siddharthrout.wordpress.com/2011/08/01/to-err-is-human/

+0

哇谢谢 - 完美的工作。非常感谢! – oliver13 2012-08-13 21:34:34

+1

如果高级客户服务中已经没有 – barrowc 2012-08-13 21:38:57

+1

= 1,那么+1可能希望在模块的顶部抛出一个“Option Explicit”! – 2012-08-13 21:39:04

相关问题