Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…