supprimer les lignes dont les cellules contiennent....

anna111

XLDnaute Junior
bonjour à tous,

je souhaite, si possible, creer un boutton de commande qui permet de supprimer des lignes dont le cellules de la colonne A contiennent un debut de valeur, j'explique :

dans la colonne A j'ai :
A1 = YX12
A2 = YX13
A3 = YX22
A4 = YX25
A5 = YX48

j'aimerai creer un boutton qui soit toujours visible en bas et me permet de supprimer des lignes de cette manniere :
taper dans une zone texte 13 25 48, une fois valider les lignes A2 A4 et A5 sont supprimées et la zone texte s'efface.
Possible ?
merci.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : supprimer les lignes dont les cellules contiennent....

Bonsoir Anna, bonsoir le forum,

En pièce jointe une proposition. Je n'ai pas pu respecter ta requête exactement. Voilà comment ça fonctionne :
Tu cliques sur le bouton Supprimer une boîte d'entrée s'ouvre.
Tu tapes une seule valeur et tu cliques sur Ok. La (ou les) ligne(s) dont la cellule en colonne A se termine par les numéros édités est (sont) effacée(s).

Cela signifie que tu ne pourras pas taper 13 25 48 en une seule fois mais
13 + [Ok]
25 + [OK]
48 + [OK]
[Annuler] (fin des entrées)

Code Commenté et gestion des erreurs... J'espère que ça te conviendra.
 

Pièces jointes

  • Anna_v02.xls
    35.5 KB · Affichages: 104
  • Anna_v02.xls
    35.5 KB · Affichages: 109
  • Anna_v02.xls
    35.5 KB · Affichages: 116

Paritec

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Re Bonsoir Robert Anna,
moi j'aurais fait (si les valeurs 13 25 48 sont toujours les mêmes)
a+
Papou :)
Code:
Private Sub CommandButton1_Click()
    Dim i%, fin&
    fin = Feuil1.Range("A65000").End(xlUp).Row
    For i = fin To 1 Step -1
        If Cells(i, 1) Like "*13*" Or Cells(i, 1) Like "*25*" Or Cells(i, 1) Like "*48*" Then Cells(i, 1).Delete shift:=xlUp
    Next i
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Bonsoir à tous


Moi j'aurai fait ceci , Paritec ;)

Code:
Sub Suppr_Avec_FiltreElabore()
Dim p As Range, pf As Range, x&
With ActiveSheet
    .[B2].FormulaLocal = _
        "=OU(1*DROITE(A2;2)=13;1*DROITE(A2;2)=25;1*DROITE(A2;2)=48)"
    Set p = _
        .Range(.[A1], .[A65536].End(xlUp))
    p.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("B1:B2"), Unique:=False
    Set pf = _
        .[_FilterDataBase]: x = pf.Rows.Count - 1
    pf.Offset(1, 0).Resize(x).SpecialCells(12).Delete Shift:=xlUp
    .ShowAllData
.[B2] = Empty
End With
End Sub
Cela évite la boucle et chez moi c'est très rapide.
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Bonjour Staple, Anna
oui ta macro est bien, sans doute, mais comme je ne sais pas faire de formule il m'est difficile de pouvoir utiliser cette méthode.
Mais la question reste: Est-ce que ma réponse et ma macro est capable de résoudre le problème posé par Anna?
Et là tu vas me dire quoi ?
C'est à mon sens cela l'important, maintenant sur une liste de 10000 lignes et plus tu auras certes un gain de temps.
Merci de m'avoir appris l'utilisation d'un filtre
a+
papou :)
 

Staple1600

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Bonjour Paritec



M'en vais tester sur 33 333 lignes pour voir ;)

Je te redis les résultats du test

EDITION: je te laisse tester la différence Paritec

Code:
Sub test()
Dim q$
Feuil1.UsedRange.Clear
q = _
    InputBox("Choix de la macro à tester ?" & _
    vbLf & vbLf & "Saisir soit : " & vbLf & vbTab & _
    "STAPLE" & vbLf & vbTab & _
    "PARITEC", "TEST", "STAPLE")
x q
End Sub
Code:
Private Sub x(choix$)
Dim f, d
Application.ScreenUpdating = False
d = Timer
With [A2]
.Offset(-1) = "ENTETE"
    With .Resize(33333)
        .FormulaLocal = "=""XYZ""&ENT(ALEA()*(30-10)+10)"
        Application.Calculation = xlCalculationManual
        .Value = .Value
        Application.Calculation = xlCalculationAutomatic
    End With
End With
Application.Run Switch(choix = "PARITEC", "PARITEC", choix = "STAPLE", "STAPLE")
f = Timer
MsgBox Format(f - d)
End Sub

Code:
Private Sub STAPLE()
Dim p As Range, pf As Range, x&
With ActiveSheet
    .[B2].FormulaLocal = _
        "=OU(1*DROITE(A2;2)=13;1*DROITE(A2;2)=25;1*DROITE(A2;2)=48)"
    Set p = _
        .Range(.[A1], .[A65536].End(xlUp))
    p.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("B1:B2"), Unique:=False
    Set pf = _
        .[_FilterDataBase]: x = pf.Rows.Count - 1
    pf.Offset(1, 0).Resize(x).SpecialCells(12).Delete shift:=xlUp
    .ShowAllData
.[B2] = Empty
End With
End Sub
Code:
Private Sub PARITEC()
    Dim i&, fin&
    fin = Feuil1.Range("A65000").End(xlUp).Row
    For i = fin To 1 Step -1
        If Cells(i, 1) Like "*13*" Or Cells(i, 1) Like "*25*" Or Cells(i, 1) Like "*48*" Then Cells(i, 1).Delete shift:=xlUp
    Next i
End Sub
 
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Bonjour Staple,
je comprend mieux pourquoi on parle de Têtu en Bretagne!!
Moi je ne t'ai jamais dit que ta version n'était pas plus rapide, mais le fond du problème n'est pas là, la question est est-ce que ma macro fait oui ou non ce qu'elle doit faire ?, et là en bon têtu, tu vas dire quoi non sans doute.

C'est drôle comme tu évites les réponses évidentes!

maintenant si Anna traite 500 lignes ta macro fera gagner 0,02 seconde oui c'est vrai le temps c'est de l'argent tu as raison
bon jeudi
a+
papou :)

PS: en plus tu as fait une bien belle macro pour me prouver que ta macro est rapide, bravo
 

JNP

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Bonjour Anna, Robert, Jean-Marie et Pascal :),
@ Anna : et bin, tu en a de la chance, que de réponses :p... Pour te gâter un peu plus, j'ai ajouté au code de Robert une sélection multiple, séparateur espace (" ").
@ Robert : une petite erreur s'est glissée, tu descends les lignes au lieu de remonter, donc si 2 lignes de suite correspondent, la 2ème n'est pas éliminée ;).
@ Pascal : bien sûr qu'elle marche ta macro, ou presque vu qu'avec "*13*", tu supprime aussi 131, donc il faut "*13" :rolleyes:. Et tant qu'à faire, tu pourrais utiliser
Code:
Like "*" & variable
pour pouvoir intégrer la variable. Mais Jean-Marie a raison, sur de petit fichier, la vitesse importe peu, mais sur un gros paquet de ligne, si en plus tu as des formules, tu as intérêt a désactiver l'affichage et le calcul automatique, sinon, tu peux aller boire 1 café tranquille :D.
@ Jean-Marie : plutôt que les filtres qui sont pas ma tasse de thé :eek:, pour accélérer, j'aurais plutôt utilisé Set Union pour augmenter ma plage avant la suppression. mais je sais pas si ça irais plus vite ou moins vite :p.
Bonne journée à toutes et à tous :)
 

Pièces jointes

  • Anna_v02(1).xls
    46 KB · Affichages: 79

anna111

XLDnaute Junior
Re : supprimer les lignes dont les cellules contiennent....

Bonjour Anna, Robert, Jean-Marie et Pascal :),
@ Anna : et bin, tu en a de la chance, que de réponses :p... Pour te gâter un peu plus, j'ai ajouté au code de Robert une sélection multiple, séparateur espace (" ").
@ Robert : une petite erreur s'est glissée, tu descends les lignes au lieu de remonter, donc si 2 lignes de suite correspondent, la 2ème n'est pas éliminée ;).
@ Pascal : bien sûr qu'elle marche ta macro, ou presque vu qu'avec "*13*", tu supprime aussi 131, donc il faut "*13" :rolleyes:. Et tant qu'à faire, tu pourrais utiliser
Code:
Like "*" & variable
pour pouvoir intégrer la variable. Mais Jean-Marie a raison, sur de petit fichier, la vitesse importe peu, mais sur un gros paquet de ligne, si en plus tu as des formules, tu as intérêt a désactiver l'affichage et le calcul automatique, sinon, tu peux aller boire 1 café tranquille :D.
@ Jean-Marie : plutôt que les filtres qui sont pas ma tasse de thé :eek:, pour accélérer, j'aurais plutôt utilisé Set Union pour augmenter ma plage avant la suppression. mais je sais pas si ça irais plus vite ou moins vite :p.
Bonne journée à toutes et à tous :)

Je viens de tester ta méthode, ben elle est parfaite mais je viens d'avoir une erreur : "erreur d'execution 13 qui reference à la ligne : If CInt(Right(Cells(li, 1), Len(Tableau(I)))) = Tableau(I) Then Rows(li).Delete
quand : j'ai ajouté YX400 et j'ai voulu supprimer 4 400
ou
j'ai ajouté YX200 et j'ai voulu supprimer 2 200
les lignes sont effaçées mais l'erreur vient comme meme

autre petit le boutton de commande, j'aimerai qu'il reste toujours visible (flottant mais sans suivre le curseur)
 

Staple1600

XLDnaute Barbatruc
Re : supprimer les lignes dont les cellules contiennent....

Re


Anna11: dans le code de JNP
Modifie ceci
Code:
Dim li As Integer '[COLOR=SeaGreen]déclare la variable li (LIgne)[/COLOR]
en
Code:
Dim li As Long [COLOR=SeaGreen]'déclare la variable li (LIgne)[/COLOR]
et ca devrait mieux marcher
 

anna111

XLDnaute Junior
Re : supprimer les lignes dont les cellules contiennent....

Re


Anna11: dans le code de JNP
Modifie ceci
Code:
Dim li As Integer '[COLOR=SeaGreen]déclare la variable li (LIgne)[/COLOR]
en
Code:
Dim li As Long [COLOR=SeaGreen]'déclare la variable li (LIgne)[/COLOR]
et ca devrait mieux marcher

je l'ai fais, maintenant quand j'ai LA meme erreur :( et là juste :
Code:
             If CInt(Right(Cells(li, 1), Len(Tableau(I)))) = Tableau(I) Then
est en jaune
peut être les n° + de 100 provoquent l'erreur.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof