XL 2013 supprimer les lignes contenant un mot

belhoucine dine

XLDnaute Nouveau
Bonne soirée à vous tous

je veux un code VBA pour supprimer les lignes contenant le mot (EXPIRE) dans la colonne H

Je vous envoie le fichier pour plus de précisions
Merci pour votre aide.
 

Pièces jointes

  • CHERCHER2.xlsm
    42 KB · Affichages: 9

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir belhoucine dine,
Un essai en PJ avec :
VB:
Sub SupLigExpire()
    Application.ScreenUpdating = False
    ActiveSheet.ListObjects(1).Name = "Tablo"               ' On s'afranchit du nom du tableau en le renommant
    For L = [tablo].ListObject.ListRows.Count To 1 Step -1  ' Pour chaque ligne
        If [tablo].Item(L, 8) = "EXPIRE" Then [tablo].Item(L, 8).Delete xlUp ' On supprime la ligne si EXPIRE
    Next L
End Sub
 

Pièces jointes

  • CHERCHER2.xlsm
    50.8 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonsoir,

Sur un grand tableau ceci est plus rapide je pense mais ce sera à tester :
VB:
Sub SupprimeEXPIRE()
With ListObjects(1).Range
    .Sort .Columns(8), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(8).SpecialCells(xlCellTypeFormulas, 2).Delete xlUp
End With
End Sub
Edit : la macro est dans le code de la feuille sinon écrire ActiveSheet.ListObjects(1).Range

A+
 

Pièces jointes

  • CHERCHER2(1).xlsm
    47.3 KB · Affichages: 8
Dernière édition:

job75

XLDnaute Barbatruc
On peut mémoriser l'ordre du classement initial et le restituer à la fin :
VB:
Sub SupprimeEXPIRE()
Application.ScreenUpdating = False
With ListObjects(1).Range
    .Columns(8).Insert xlToRight 'insère une colonne auxiliaire
    .Columns(8) = "=ROW()": .Columns(8) = .Columns(8).Value 'numérotation
    .Sort .Columns(9), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(9).SpecialCells(xlCellTypeFormulas, 2).Delete xlUp
    .Sort .Columns(8), xlAscending, Header:=xlYes 'tri dans l'ordre initial
    .Columns(8).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
La durée d'exécution est un peu augmentée : 0,19 seconde sur 8200 lignes.
 

Pièces jointes

  • CHERCHER2(2).xlsm
    48.2 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Job,
Dans ce cas on peut encore accélérer en utilisant ce code, cela évite le second tri :
VB:
Sub SupprimeEXPIRE()
Application.ScreenUpdating = False
ActiveSheet.ListObjects(1).Name = "Tablo"
With ListObjects(1).Range
    .Columns(8).Insert xlToRight 'insère une colonne auxiliaire
    .Columns(8).FormulaLocal = "=SI(Tablo[[#Cette ligne];[Colonne1]]=""EXPIRE"";"""";1)": .Columns(8) = .Columns(8).Value ' 1 si non expiré
    .Sort .Columns(8), xlDescending, Header:=xlYes 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(8).SpecialCells(xlCellTypeBlanks, 2).Delete xlUp
    .Columns(8).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
 

Pièces jointes

  • CHERCHER2(V2) .xlsm
    44.6 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour sylvanu, le forum,

En effet mais on peut utiliser une formule très simple :
VB:
Sub SupprimeEXPIRE()
Application.ScreenUpdating = False
With ListObjects(1).Range
    .Columns(8).Insert xlToRight 'insère une colonne auxiliaire
    .Columns(8) = "=1/ISNUMBER(RC[1])": .Columns(8) = .Columns(8).Value
    .Sort .Columns(8), xlAscending, Header:=xlYes 'tri pour regrouper et accélérer
    On Error Resume Next 'si aucune SpecialCell
    .Columns(8).SpecialCells(xlCellTypeConstants, 16).Delete xlUp
    .Columns(8).Delete xlToLeft 'supprime la colonne auxiliaire
End With
End Sub
A+
 

Pièces jointes

  • CHERCHER2(3).xlsm
    47.1 KB · Affichages: 6

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re Job,
Encore plus rapide puisqu'il n'y a ni insertion de colonne, ni formules.
On filtre sur "EXPIRE" et on supprime les lignes visibles :
VB:
Sub SupprimeEXPIRE()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
With ActiveSheet
    .ListObjects(1).Name = "Tablo"
    If .AutoFilterMode Then .AutoFilterMode = False
    .ListObjects("Tablo").Range.AutoFilter Field:=8, Criteria1:="EXPIRE"
    .Range("Tablo").SpecialCells(xlCellTypeVisible).Delete
    .ListObjects("Tablo").Range.AutoFilter Field:=8
End With
Application.DisplayAlerts = True
End Sub
:)
 

Pièces jointes

  • CHERCHER2(V3) .xlsm
    45.5 KB · Affichages: 7

Discussions similaires

Statistiques des forums

Discussions
315 167
Messages
2 116 924
Membres
112 915
dernier inscrit
Ludof