Je vous propose dans ce billet, une procédure qui vous permettra de supprimer les lignes d’une liste de données suivant les critères que vous aurez choisi comme par exemple toutes les personnes Célibataires, gagnant plus de 2.500€. Cette procédure est basée sur la méthode AdvancedFilter.

La méthode AdvancedFilter d’un objet Range permet d’effectuer énormément d’opération en VBA et ce avec un minimum de lignes de code.

Cette méthode est issue de la fonctionnalité des filtres avancés d’excel qui permettent une multitude d’opérations telles que l’exportation de données suivant des critères, l’extraction sans doublons, etc.

SI vous ne connaissez pas les filtres avancés d’excel, je vous suggère d’abord la lecture de ce didacticiel  Les filtres avancés ou élaborés dans Excel

Code de la procédure DeleteRowsByAdvancedFilter

Sub DeleteRowsByAdvancedFilter(ByVal areaData As Range, ByVal FormulaCriteria As String)
 ' Author : Philippe Tulliez (Http://philippe.tulliez.be
 ' Date   : 21/11/2015 (V 1.0)
 ' Arguments
 ' areaData (Objet)         - Plage des données (Etiquettes de colonnes + données
 ' FormulaCriteria (String) - Formule à placer dans la zone des critères
 ' Déclaration des variables
 Dim areaCriteria As Range
 ' Assignation de la référence des critères à la variable objet areaCriteria
 ' Les critères se trouveront à 2 colonnes à droite de la plage de données
  With areaData
   Set areaCriteria = areaData.Offset(columnoffset:=.Columns.Count + 1).Resize(2, 1) ' Zone des critères 2 colonnes à droite de la zone des données
  End With
 ' Placement des critères (Etiquettes de colonne + critère calculé)
 areaCriteria(1) = "_fn_": areaCriteria(2).Formula = FormulaCriteria
 With areaData
 ' Filtre les données
 On Error GoTo ExitSub
 .AdvancedFilter xlFilterInPlace, areaCriteria
 ' Suppression des lignes filtrées sans la première ligne (Etiquettes de colonnes)
 .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
 End With
ExitSub:
 areaData.Worksheet.ShowAllData ' Efface le filtre
 On Error GoTo 0
 areaCriteria.Clear ' Suppression de la zone des critères
 Set areaData = Nothing: Set areaCriteria = Nothing
End Sub

Comment appeler cette procédure ?

  1. Ligne de code permettant de supprimer toutes les lignes de la plage de cellules A1:M1000 dont la cellule de la colonne I contient une date de l’année 2000 et que la valeur en colonne E est supérieure à 2500
    DeleteRowsByAdvancedFilter Range("$A$1:$M$1000"), "=AND(YEAR(I2)=2000,E2>2500)"
  2. Ligne de code permettant de supprimer toutes les lignes de la plage de cellules A1:E52 dont la valeur de la cellule de la colonne D est égal à « C »
    DeleteRowsByAdvancedFilter Range("$A$1:$E$52"), "=D2=""C"""

Classeur exemple à télécharger

De nombreux exemples de suppression de lignes dans ce classeur