web-dev-qa-db-fra.com

VBA: Comment supprimer des lignes filtrées dans Excel?

J'ai un tableau Excel qui contient des données. En utilisant le code vba suivant, j'essaie de filtrer uniquement les cellules vides dans certains champs et de supprimer ces lignes

ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=7, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=8, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=9, Criteria1:= _
        "="
ActiveSheet.UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.rows.Count - 1).rows.Delete
ActiveSheet.ShowAllData

Cela ne fonctionne que si j'ai des cellules vides dans ces colonnes. Mais j'ai fait face à un problème, quand je n'ai pas de cellules vides, et en utilisant le code ci-dessus, toute ma plage est supprimée de la feuille. Comment éviter ce problème? Dois-je changer l'état de mon filtre ou autre chose?

17
mbigun

Utilisez SpecialCells pour supprimer uniquement les lignes qui sont visibles après le filtrage automatique:

ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete

Si vous avez une ligne d'en-tête dans votre plage que vous ne souhaitez pas supprimer, ajoutez un décalage à la plage pour l'exclure:

ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete
40
Jon Crowell

Au lieu d'utiliser UsedRange ou de fournir une adresse de plage explicite, la propriété AutoFilter.Range peut également spécifier la plage affectée.

ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp)

Tel qu'utilisé ici, le décalage entraîne également la suppression de la première ligne après la plage du filtre automatique. Afin d'éviter cela, j'essayerais d'utiliser .Resize () après .Offset ().

13
KeyLimePy