VBA Supprimer ligne selon 2 conditions rapidement

julien91080

XLDnaute Occasionnel
Bonjour a la communauté,

J'ai un tableau de 7 colonnes et environ 80000 lignes (pouvant varié).
Je cherche une macro : Si cellule D2 <> "toto" ou "tata" alors suppression de la ligne. Le tout sur chaque ligne.
Pour le moment, j'utilise le code suivant:



Sub SupLigneOui()
Application.ScreenUpdating = False
For i = [A65000].End(xlUp).Row To 1 Step -1
If Left(Cells(i, 4), 14) <> "tata" Or Left(Cells(i, 4), 14) <> "toto" Then Rows(i).Delete
Next i
End Sub



Le problème est que du fait du nombre très important de ligne, la macro s'exécute en 10 minutes bloquant l'utilisation d'Excel en prime.

N'existe-t-il pas une autre macro pouvant aller plus vite?
Je précise également qu'il peut y avoir près de 200 autres mots que "tata" ou "toto" en colonne D.

Merci par avance pour votre aide.

Cordialement,

Julien
 

Paritec

XLDnaute Barbatruc
Re : VBA Supprimer ligne selon 2 conditions rapidement

Bonsoir Julien le forum
si il faut passer par des tableaux virtuels et là tu n'auras plus de problèmes
par contre il faut vérifier s'il n'y a pas une limite dans les tableaux tu parles de 80000 lignes
pour bien faire il faudrait ton fichier
a+
Papou:)
 

Paritec

XLDnaute Barbatruc
Re : VBA Supprimer ligne selon 2 conditions rapidement

Re Julien le forum
voilà un fichier avec 100 000 lignes à toi de tester et tu me redis
a+
Papou:)
 

Pièces jointes

  • Julien 91080 V1.zip
    467.8 KB · Affichages: 34
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : VBA Supprimer ligne selon 2 conditions rapidement

Re Eric S le forum
oui, j'avais pas vu que mon fichier était trop gros, alors le temps de le zipper et de le joindre et voilà
a+
Papou:)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA Supprimer ligne selon 2 conditions rapidement

Bonsoir à tous

Une proposition à base de filtre élaboré avec un critère "formule".
test OK sur mon PC sur 5000 lignes (exécution en moins de 30 secondes)
Code:
Sub SupprLIGNES_selon2CRITERES()
Dim AF_RNG As Range
Application.ScreenUpdating = False
Range("F2").FormulaR1C1 = "=ISERR(SEARCH(""toto"",RC[-2]))+ISERR(SEARCH(""tata"",RC[-2]))>1"
Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2"), Unique:=False
Set AF_RNG = [_FilterDataBase]
AF_RNG.Offset(1, 0).Resize(AF_RNG.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
ActiveSheet.ShowAllData: [F2] = Empty
End Sub
 

Paritec

XLDnaute Barbatruc
Re : VBA Supprimer ligne selon 2 conditions rapidement

Re Bonjour Julien JM le forum
avec mon fichier 100 000 lignes en moins de 1 seconde !! et avec 20 colonnes mais je ne peux plus passer le fichier car il fait 7,5 mo, ayant tout rempli!!
a+
Papou:)

Code:
Sub supprimer()
    Dim aa, bb, a&, i&, y&, t$
    t = Timer
    With Feuil1
        aa = .Range("A2:T" & .Range("D" & Rows.Count).End(3).Row)
    End With
    y = 1
    ReDim bb(1 To UBound(aa, 2), 1 To y)
    For i = 1 To UBound(aa)
        If aa(i, 4) = "Tata" Or aa(i, 4) = "Toto" Then
            ReDim Preserve bb(1 To UBound(aa, 2), 1 To y)
            For a = 1 To 20
                bb(a, y) = aa(i, a)
            Next a
            y = y + 1
        End If
    Next i
    With Feuil1
        .Range("A2:T" & .Range("D" & Rows.Count).End(3).Row).Clear
        aa = Application.Transpose(bb)
        .Range("A2").Resize(UBound(aa), UBound(aa, 2)) = aa
    End With
    MsgBox "Traitement Terminé en " & Format(Timer - t, "0.00s"), , "C'est Fini"
End Sub
 
Dernière édition:

julien91080

XLDnaute Occasionnel
Re : VBA Supprimer ligne selon 2 conditions rapidement

Après avoir tester vos 2 propositions celle de Papou est méga rapide.
Le seul souci que j'ai c'est que "tata" est en réalité un texte ressemblant à 099, 032, 001... Avec cette solution, il reformate le texte en nombre ce qui fait sauter les 0 devant.
Comment garder le format texte de mes cellules?

Merci par avance.

Julien
 

julien91080

XLDnaute Occasionnel
Re : VBA Supprimer ligne selon 2 conditions rapidement

Papou,

Tu trouveras ci-joint un fichier.
L'onglet Base est le résultat d'une requête que l'on colle ici. L'onglet Résultat est donc le résultat de ta Macro.
Comme tu peux le constater dans l'onglet Base, toto est une date et tata une valeur 031. Une fois la macro lancée, je voudrais concerver ce résultat sous format texte (j'en ai besoin pour des sommes.si....). Pour le format de la date, j'arrive à le formater ailleurs.

Merci pour votre aide

Julien
 

Pièces jointes

  • test.zip
    244.3 KB · Affichages: 37
  • test.zip
    244.3 KB · Affichages: 40

julien91080

XLDnaute Occasionnel
Re : VBA Supprimer ligne selon 2 conditions rapidement

Merci Papou,

En aucun cas tu n'as à te justifier.
Il est vrai que mes explications ne sont pas toujours claires....1000 excuses.
Un grand merci c'est exactement ce dont j'avais besoin.

Merci au forum également de s'être penché sur mon cas.

Bonne journée.

Julien
 

julien91080

XLDnaute Occasionnel
Re : VBA Supprimer ligne selon 2 conditions rapidement

Le forum, Papou,

Après vérification, il y a un souci dans l'affaire.
Il semble que la macro ne tient pas compte du formatage de la date.
Exemple, dans ton fichier, au lieu de transformer la date du "02-09-2015" en 02/09/2015, il transforme en 09/02/2015 alors qu'il transforme bien le 30-09-2015 en 30/09/2015.

Cordialement,

Julien
 

Discussions similaires

Réponses
0
Affichages
156

Statistiques des forums

Discussions
312 329
Messages
2 087 324
Membres
103 516
dernier inscrit
René Rivoli Monin