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?
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
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 ().