2017-07-27 100 views
1

感謝您的閱讀和您的幫助!VBA我的IF語句在找到一個迭代後結束

我有一個簡單的問題,我只是無法弄清楚。

在列A I具有1以下的值至20。

1. NBC997 
2. EVO463 
3. EVO426 
4. EVO420 
5. EVO826 
6. EVO820 
7. EVO863 
8. CRO001 
9. BCA915 
10. SBH121 
11. KEN500 
12. GAM201 
13. GAM1011 
14. GAM101 
15. SPR577 
16. SPR580 
17. SPR579 
18. SPR576 
19. DON201 
20. MOR101 

我的以下公式應該看塔A ..和刪除整個行,如果左2個字符<>「EV」。

無論出於何種原因,一旦它發現一個迭代..它完全停止,並不會去下一行。如果可以的話請幫忙。我知道我可能錯過了一些非常愚蠢的事情。謝謝!

Sub remove() 

Dim i As Long 

    For i = 1 To 20 
     If Left(Cells(i, "A"), 2) <> "EV" Then 
     Cells(i, "A").EntireRow.Delete 
     Else 
    End If 
    Next i 

End Sub 
+7

環向後'對於i = 20〜1步-1' –

+0

你一定要循環向後因爲集合每次重新編制了索引中刪除行。但是,這並不能解釋爲什麼你的循環顯然只會執行一次,所以你可能需要進一步的調試... –

+0

向後循環是有道理的!謝謝! –

回答

0

我不會使用刪除整行。我會將數據向上移動一行,然後清除最後一行的內容。

Sub remove() 
Dim i As Long 
Dim x As Long 
Dim lastCol As Long 
Dim lastRow As Long 
Const dataColumn As Long = 1 
Const SearchPhrase As String = "EV" 
Const firstRow As Long = 1 
lastCol = Cells(firstRow, Columns.Count).End(xlToLeft).Column 
lastRow = Cells(Rows.Count, dataColumn).End(xlUp).Row 
    x = 0 
    For i = lastRow To firstRow Step -1 

    If Left(Cells(i, dataColumn), Len(SearchPhrase)) <> SearchPhrase Then 
     If i = lastRow Then 
      Range(Cells(lastRow, dataColumn), Cells(lastRow, lastCol)).ClearContents 
     Else 
      Range(Cells(i, dataColumn), Cells(lastRow - 1 - x, lastCol)).Value = _ 
      Range(Cells(i + 1, dataColumn), Cells(lastRow - x, lastCol)).Value 
      Range(Cells(lastRow - x, dataColumn), Cells(lastRow - x, lastCol)).ClearContents 
     End If 
     x = x + 1 
    End If 
    Next i 
End Sub 
+1

這將在技術上起作用,但通常不會將其視爲改變迭代器值的最佳做法。從集合中刪除項目時,最好向後迭代:) –

+0

謝謝,下次我會記住這一點;) –

+0

非常感謝您的幫助。我確實想完全刪除該行,但這不是一個大問題。您的解決方案有效,非常感謝。 –