2017-10-20 16 views
0

Excel VBAPour supprimer toutes les lignes lorsque la condition appliquer VBA avec pour et IF

Je voudrais supprimer toutes les lignes basées sur cond voir si la déclaration mais le code ne supprime pas toutes les lignes qui ont ws.Cells(i, 6).Value = 0

Sub Clean() 

For Each ws In Worksheets 
    ' find Last Row 
    LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row 

    ' loop over all rows 
    For i = 2 To LastRow ' start of the for loop 

     If ws.Cells(i, 6).Value = 0 Then 

      Rows(i).Delete 

     End If 

    Next i 

Next ws 

End Sub 
+2

Regardez ces réponses et commentaires, ils vous disent pourquoi et comment l'éviter. Ils donnent également des options pour l'accélérer. https://stackoverflow.com/questions/33744149/code-in-vba-loops-and-never-ends-how-to-fix-this –

+1

Vous devez utiliser un index 'For/Next' et une boucle vers l'arrière à la place: 'Pour nIndex = LastRow To 1 Step -1' – braX

Répondre

1

remplacer

For i = 2 To LastRow 

avec

For i = LastRow to 2 step -1 

devrait fonctionner beaucoup mieux.

+0

Cela devrait en effet faire l'affaire mais je pensais que cela pourrait aider à expliquer pourquoi. Lorsque vous itérez de haut en bas, si une ligne correspond aux critères et est supprimée, toutes les lignes situées en dessous seront décalées d'une ligne, ce qui signifie que la rangée 30 est maintenant la ligne 29, etc. Si vous aviez deux lignes d'affilée correspondant aux critères (disons les lignes 29 et 30) et que la ligne 29 était supprimée, la ligne 30 deviendrait la ligne 29 après que la ligne 29 ait déjà été vérifiée, elle serait donc entièrement ignorée. En itérant à l'envers comme cette réponse le suggère, aucune ligne n'est ignorée, donc vous ne devriez pas avoir de lignes manquées. –

0

J'ai trouvé qu'il vous manquait quelque chose d'important dans votre code. Lorsque vous supprimez une ligne, votre variable i ignore automatiquement 1 ligne et la ligne en cours après la suppression de la ligne n'est pas validée.

Sub Clean() 
    For Each ws In Worksheets 
    ' find Last Row 
    LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row 
    ' loop over all rows 
    For i = 2 To LastRow ' start of the for loop 
     If ws.Cells(i, 6).Value = 0 Then 
      Rows(i).Delete 
      i = i - 1 ' force your code to review the same line again 
     End If 
    Next i 
    Next ws 
End Sub 

Espérons que cela aide.