Code VBA marche pas du 1er coup mais du 2ème

Résolu/Fermé
Maxi - 4 juil. 2012 à 16:56
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 19 mai 2024 - 4 juil. 2012 à 18:38
Bonjour,

J'ai écris un code VBA pour qu'à chaque fois qu'il trouve les mots suivants dans les colonnes concernés (voir code ci-dessous), il efface la ligne contenant ces mots. Ce qui est bizarre c'est que lorsque je l'exécute une fois, il n'efface pas toutes les lignes concernées directement, il faut que je le lance 3, 4 fois avant que mon nombre de lignes n'évolue plus.
Quelqu'un pourrait-il m'expliquer qu'est-ce que j'ai raté dans ce code?

Merci

Sub SuppRow()

Dim Wbk As Workbook
Dim ws As Worksheet

Set Wbk = Workbooks("!20120627 BASECARBONE - Copie.xls")

For i = 55 To 3001
Wbk.Worksheets("MasterSheet").Activate

If Cells(i, 2).Value Like "*end of life*" Then
Rows(i).Delete
ElseIf Cells(i, 6).Value Like "déchets*" Then
Rows(i).Delete
ElseIf Cells(i, 6).Value Like "immobilisations*" Then
Rows(i).Delete
End If

Next i

End Sub


A voir également:

2 réponses

eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 19 mai 2024 7 217
Modifié par eriiic le 4/07/2012 à 17:42
Bonjour,

Ben commence par le 2ème coup ! ;-)

Quand on supprimme des lignes il faut faire la boucle en partant du bas.
Sinon lorsque tu supprime la ligne 10, au next suivant tu passes à la 11. Qui est en fait l'ancienne 12 remontée d'un cran et tu as raté l'ancienne 11.

Donc :
For i = 3001 to 55 step -1

eric

PS:
derlig = Wbk.Worksheets("MasterSheet").Cells(rows.count, 2).end(xlup).row
te donne la dernière ligne utilisée de la colonne 2.
Si la colonne B est remplie jusqu'à la dernière donnée tu peux boucler que sur les lignes nécessaires et non 3000 lignes à chaque fois.
Et la méthode .find est plus rapide pour rechercher des données (voir l'aide excel)
0
Merci beaucoup pour ces éclaircissement eriiic! C'est vrai que je n'avais pas pensé aux lignes qui "remontent".
J'avais regardé pour la fonction find mais si ma cellule ne contenait pas le mot seul dans la cellule, il ne le trouvait pas...
0
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 19 mai 2024 7 217
Modifié par eriiic le 4/07/2012 à 18:41
il faut utiliser le paramètre lookat :
Set a = [A:A].Find("mot", LookIn:=xlValues, LookAt:=xlPart)
Mais comme xlPart est la valeur par défaut ça m'étonne...
Tu avais dû l'utiliser avec xlWhole avant et la valeur du paramètre est conservée...

eric
0