2012-08-13 44 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

相關問題