probleme lenteur suppression de ligne

smartbis

XLDnaute Nouveau
Bonjour

apres avoir recherché un bout de programme dans le forum me permettant de supprimer des lignes sous certaines conditions,je me retrouve devant un phenomene de lenteur excessive du sans doute a la formule

Auriez vous une idee pour corriger cela sachant que je traite entre 10 000 et 45 000 lignes et que cela prends enormememnt de temps( plusieurs minutes)


voici le code utilisé
Code:
Sub nettoyer()
Dim I As Integer
Dim debut1 As String, debut2 As String
For I = 21 To (Range("A65536").End(xlUp).Row - 2)



debut1 = Range("D" & I).Value

debut2 = Range("E" & I).Value


If debut1 < -5.5 Or debut1 > 8.2 Or debut2 < 42 Or debut2 > 51 Then
Rows(I).Delete Shift:=xlUp
End If
Next I
End Sub

merci pour votre aide
 

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

bonsoir smartbis

je l'aurais ecrit comme cela

Code:
Sub nettoyer()
Dim I As Integer
For I = Range("A65536").End(xlUp).Row - 2 To 21
If Range("D" & I) < -5.5 Or Range("D" & I) > 8.2 Or Range("E" & I).Value < 42 Or Range("E" & I).Value > 51 Then
Rows(I).Delete
Next I
End Sub

quant a savoir si c'est plus rapide.....
c'est toi qui nous le dira
 

bof

XLDnaute Occasionnel
Re : probleme lenteur suppression de ligne

bonsoir,
Pour aller jusqu'à 45000 integer ne convient pas.
De plus il est inutile d'évaluer la dernière ligne à chaque tour de boucle For (c'est ce qui prend le plus de temps)

Pour reprendre le code de pierrejean je mettrai :

Code:
Sub nettoyer()
Dim i As Long, k As Long
k = Range("A65536").End(xlUp).Row - 2
For i = k To 21 Step -1
If Range("D" & i) < -5.5 Or Range("D" & i) > 8.2 Or _
    Range("E" & i) < 42 Or Range("E" & i) > 51 Then Rows(i).Delete
Next i
End Sub

A+
 

smartbis

XLDnaute Nouveau
Re : probleme lenteur suppression de ligne

salut

reponse pour pierre jean

je viens de tester ton code et une erreur s'affiche disant qu'il existe un next sans un for alors que tu l'as bien mis dans ton texte

je ne comprends pas le probleme

Pour bof

il m'indique une erreur : icomppatibilté de type pour la ligne marqué en rouge.
j'ai essayé de rajouté .value apres chaque range mais cela n'arien changé

Code:
ub nettoyer2()
Dim I As Integer, k As Long
k = (Range("A65536").End(xlUp).Row - 2)
For I = k To 21 Step -1
[COLOR="Red"]If Range("D" & I).Value < -5.5 Or Range("D" & I).Value > 8.2 Or Range("E" & I).Value < 42 Or Range("E" & I).Value > 51 Then Rows(I).Delete[/COLOR]
Next I
End Sub



Pour precision

dans macolonne D et E il s'agit d'une formule qui recupere un texte que je transforme en nombre par cette formule
Code:
 Set compteurligne = Sheets(1).Range("A20:A" & Range("A65536").End(xlUp).Row)
        
    Range("A1").Value = 1
    Range("A1").Select
    Selection.Copy
    Range("D21:E" & compteurligne.Count).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, _
    SkipBlanks:=False, Transpose:=False
    Range("A1").Value = ""

ensuite je teste donc les nombres de chaque colonne qui me permettent de supprimer des lignes inutiles pour moi

Merci pour votre aide
 

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

bonjour smartbis

il y a effectivement une erreur dans le code que je t'ais donné (il manque un End if)
concernant le type , je suggere:
Sub nettoyer()
Dim I As Integer
For I = Range("A65536").End(xlUp).Row - 2 To 21
If Cdbl(Range("D" & I) )< -5.5 Or Cdbl(Range("D" & I) )> 8.2 Or Cdbl(Range("E" & I)< 42 Or Cdbl(Range("E" & I)) > 51 Then
Rows(I).Delete
End if
Next I
End Sub​

Pour plus de sureté un petit fichier exemple avec quelques données non confidentielles serait tres utile
 

smartbis

XLDnaute Nouveau
Re : probleme lenteur suppression de ligne

je viens de reinserer ton code mais une ereeur de syntaxe empeche le fonctionnement



j'essaie de t'envoyer mon fichier auquel j'ai enle vé pas mal de chose

donc l'application ne fonctionnera pas mais je voudrais que vous regardiez uniquement le probleme de conversion de ma colonne D et E ennombre puis le tri pour lequel vous m'avez repondu

comme vous pourrez le voir je debute et mon code est un peu lourd

mais bon l'essentiel est que j'apprenne

Merci pour votre aide
 

Pièces jointes

  • lolo.zip
    23.3 KB · Affichages: 36
  • lolo.zip
    23.3 KB · Affichages: 38
  • lolo.zip
    23.3 KB · Affichages: 42

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

re

premier point

Un oubli impardonnable !!

lorsque l'on parcourt des chiffres du plus grand au moins grand il faut specifier step-1

donc la sub nettoyer qui fonctionne est la suivante

Code:
Sub nettoyer1()
Dim I As Integer
For I = Range("A65536").End(xlUp).Row - 2 To 21 Step -1
If Range("D" & I).Value < -5.5 Or Range("D" & I).Value > 8.2 Or Range("E" & I).Value < 42 Or Range("E" & I).Value > 51 Then
Rows(I).Delete
End If
Next I
End Sub

pour le reste je regarde
 

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

re

pour la transformation en chiffres une proposition:

Code:
Sub chiffres()
Dim I As Integer
 For I = 21 To Range("A65536").End(xlUp).Row - 2
  Range("D" & I).Value = Val(Range("D" & I).Value)
  Range("E" & I).Value = Val(Range("E" & I).Value)
 Next I
End Sub

Attention: on perd la liaison avec la colonne A

si celle-ci devait etre conservée, le signaler et je regarderais
 

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

merci Michel_M

effectivement avec un grand nombre de lignes a traiter cela s'impose

pour la transformation en nombre 2 fonctions personnalisées qui permettent de conserver la liaison avec la colonne A

Code:
Function dernb(x As String)
If x = "" Then dernb = ""
If Len(x) = 32 Then
dernb = "Begin"
Exit Function
End If
If Len(x) = 30 Then
dernb = "End"
Exit Function
End If
dernb = Right(x, 9)
dernb = Val(dernb)
End Function

Function premnb(x As String)
If x = "" Then premnb = ""
If Len(x) = 32 Then
premnb = "Begin"
Exit Function
End If
If Len(x) = 30 Then
premnb = "End"
Exit Function
End If
premnb = Mid(x, Len(x) - 18, 9)
premnb = Val(premnb)
End Function
 

smartbis

XLDnaute Nouveau
Re : probleme lenteur suppression de ligne

salut

je viens de renter ta proposition dans mon code malheuresement un message d'erreur d'incomptibilité de type s'affiche et la ligne du IF est surligné en jaune

j'ai cherché et je ne vois pas ce qui cloche

As tu une idée
Merci d'avance

Concernat la trasnformation en nombre je n'ai pas encore essayé ta soultion que je garde sous le coude car pour l'instant ce que j'ai fait fonctionne et c'est rapide donc on verra plus tard pour essayer
merci quand mme du tuyau
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : probleme lenteur suppression de ligne

bonjour smartbis

tester:

Code:
Sub nettoyer1()
Dim I As Integer
For I = Range("A65536").End(xlUp).Row - 2 To 21 Step -1
If Cdbl(Range("D" & I).Value) < -5.5 Or Cdbl(Range("D" & I).Value) > 8.2 Or Cdbl(Range("E" & I).Value )< 42 Or Cdbl(Range("E" & I).Value) > 51 Then
Rows(I).Delete
End If
Next I
End Sub

Note: je serais absent ce WE
 

smartbis

XLDnaute Nouveau
Re : probleme lenteur suppression de ligne

Salut

me revoila

je viens de tester ton code et cela fonctionne bien maintenant
Neammoins la lenteur est toujours aussi presente
Toute les etapes de mon programme s'execute rapidement mais celle concernant le nettoyage des lignes inutiles est tres longues et ne me convient pas
je ne vois pas comment resoudre ce probleme

Si vous avez d'autres idées je suis preneur

Dans tous les cas merci de votre aide
 

Discussions similaires

Réponses
6
Affichages
304

Statistiques des forums

Discussions
312 613
Messages
2 090 234
Membres
104 463
dernier inscrit
lbo