Boucle sans fin...on dirait

Konyl Messages postés 25 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 7 octobre 2010 - 13 févr. 2009 à 09:24
Konyl Messages postés 25 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 7 octobre 2010 - 14 févr. 2009 à 18:52
Bonjour a tous,

Voila, j'ai fait une mini-fonction de nettoyage de ligne et j'ai l'impression qu'elle ne s'arrête jamais.

Pourriez vous m'aider ?

Voila le code

Sub Filtering()
Do
For Each c In Range([C2:C65536].End(xlUp), [C2])
     If Not (c Like "*Façon*") Then c.EntireRow.Delete Else
    
Next c
Loop

End Sub

Par avance merci.

9 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 févr. 2009 à 09:30
c n'est pas typée ?

ajoutes systématiquement

'Option Explicit' en tête de tes modules.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 févr. 2009 à 09:34
tu prends le probleme a l'envers...

toi, tu parcoures toutes les cellules.
tu regarde chaque valeur, tu y appliques un Like, qui est lent
et tu supprime au besoin ta ligne.

le plus simple(et rapide) est de rechercher les lignes qui contiennent ton mot.
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 7
13 févr. 2009 à 09:46
Bonjour,

Je suppose que tu cherches à supprimer lorsque le mot "Façon" n'est pas présent quelque-part dans le contenu de la cellule d'une colonne connue (et pas dans toutes les cellules).
Méthode alors :
Parcourir toutes les cellules de cette seule colonne en remontant du bas vers le haut (utilisation d'une boucle For to step - 1) afin de ne pas risquer de te référer à une ligne qui n'existe plus du fait de la suppression
Pour chaque cellule examinée : utiliser Instr plutôt que Likeet supprimer toute la ligne si instr = 0
0
Konyl Messages postés 25 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 7 octobre 2010
13 févr. 2009 à 09:49
Oui c'est vrai mais le pb c'est que le filtrage ne passe pas (trop de ligne pour faire un copier coller ensuite).

et comme je ne suis pas une tronche, bah je n'y arrive pas...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 févr. 2009 à 10:14
piste à explorer:

Sub Filtering()
Dim oResult As Range
Dim oStart As Range
Dim nCount As Long
Set oStart = ActiveSheet.Range("C2")
Do
Set oResult = ActiveSheet.Range("C:C").Find("Façon", oStart, LookAt:=XlLookAt.xlPart, MatchCase:=False)
nCount = oResult.Row - oStart.Row
If nCount > 1 Then
ActiveSheet.Range(oStart.Offset(1).EntireRow, oResult.Offset(-1).EntireRow).Delete
Set oStart = oStart.Offset(1)
ElseIf nCount = 1 Then
Set oStart = oResult
Else
ActiveSheet.Range(oStart.Offset(1).EntireRow, oStart.SpecialCells(xlCellTypeLastCell).EntireRow).Delete
Exit Do
End If
Loop Until oResult Is Nothing
End Sub
0
Konyl Messages postés 25 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 7 octobre 2010
13 févr. 2009 à 11:03
Bon j'ai trouvé,

Mais merci beaucoup pour vos réponses.

Voila ce qui fonctionne :

Sub Filtering()

Application.ScreenUpdating = False

For i = 65536 To 2 Step -1
   
    If (Not (Cells(i, 3) Like "*Façon*")) Then
        Range("C" & i).EntireRow.Delete
    End If
Next i

End Sub
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 févr. 2009 à 11:07
1- tu réactives pas le ScreenUpdating
2- tu utilises Like, qui est lent. utilises au pire InStr
3- Range("C" & i) => catastrophe, d'autant que tu as déjà cherché une référence à ta cellule
4- tu parcoures des cellules certainement vierges, puisque tu pars arbitrairement de 65536
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 févr. 2009 à 11:08
ah, et tu ne déclares toujours pas tes variables (i, en l'occurrence)
0
Konyl Messages postés 25 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 7 octobre 2010
14 févr. 2009 à 18:52
1- tu réactives pas le ScreenUpdating


En fait j'ai enlevé la ligne après coup, le scrUpdt est déjà actif.
2- tu utilises Like, qui est lent. utilises au pire InStr
pour 62000 ligne ça prend environs 1,5 minutes, sur un process globale de 3 heures... alors les perf la, ça me va.
3- Range("C" & i) => catastrophe, d'autant que tu as déjà cherché une référence à ta cellule
J'ai pas comrpis la ?
4- tu parcoures des cellules certainement vierges, puisque tu pars arbitrairement de 65536
Mon fichier possède une taille variable de 40000 a 65000 lignes voila pourquoi.
Vue l'urgence opérationnelle qui était la mienne, je n'ai pas fait un excel down pour trouver la dernière ligne.
5- ah, et tu ne déclares toujours pas tes variables (i, en l'occurrence)
Le script fonctionne comme ça, je ne comprend pas ton propos ?
0