Bonjour,
Je souhaitedans le tableau ci-joint,créer une macro pour supprimer les lignes de la colonne L, dont les cellules sont égales à 20.
Pouvez-vous me venir en aide ?
Merci d'avance et très bonne journée
Hervé
Version imprimable
Bonjour,
Je souhaitedans le tableau ci-joint,créer une macro pour supprimer les lignes de la colonne L, dont les cellules sont égales à 20.
Pouvez-vous me venir en aide ?
Merci d'avance et très bonne journée
Hervé
Bonjour,
Voici avec le tableau convertit en tableau structuré
Pièce jointe 596577Code:
1
2
3
4
5
6
7
8 Sub Filtre() Dim NbLig As Long NbLig = ActiveSheet.ListObjects("Tableau1").ListRows.Count Range("Tableau1[#All]").Select ActiveSheet.ListObjects("Tableau1").Range.AutoFilter Field:=11, Criteria1:="20" If Err.Number = 0 Then ActiveSheet.Rows("10:" & NbLig + 9).SpecialCells(xlCellTypeVisible).Delete ActiveSheet.ShowAllData End Sub
Cdlt
Salut à vous,
Le titre fait déjà tiquer.Citation:
demande de macro VBA
Voir mon billet à ce sujet
Au demeurant, pour l'ami Arturo et les lecteurs.
Pour filtrer un tableau structuré, il est plus "parlant", selon moi, d'utiliser la propriété index d'une colonne plutôt que de l'indiquer en "dur"
Il faut savoir également que la suppression d'un corps de cellules d'un tableau structuré filtré n'entraînera QUE la suppression des enregistrements filtrés.Code:Field:=.ListColumns("nbre").Index
Il n'est donc pas utile de "s'ennuyer" à rechercher les cellules visibles pour ce faire.
Salut.
Tant qu'à travailler avec un tableau structuré, autant travailler avec un tableau structuré. Ca évite le Select, ça évite de partir de la ligne 10, ça évite le +9, ça évite le numéro de colonne en dur.. De plus, le Err.Number = 0 sans un On Error avant ne sert à rien ;)
Lorsque l'on supprime un tableau filtré, on ne supprime que les lignes visibles SI il y en a. Si le filtre ne renvoie aucune ligne, ce sont toutes les lignes qui sont supprimées. C'est pourquoi il est judicieux de tester qu'il y a des cellules visibles après le filtre. Attention que lorsque l'on supprime les cellules visibles d'un tableau filtré, on reçoit un message demandant la confirmation de la suppression des lignes entières...
Perso, je ferais ainsi, sur un tableau structuré bien sûr ;)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Sub Test() Dim r As Range Range("tableau1").AutoFilter Range("tableau1").ListObject.ListColumns("Valeurs").Index, 20 On Error Resume Next Set r = Range("tableau1").SpecialCells(xlCellTypeVisible) If Err = 0 Then Application.DisplayAlerts = False Range("tableau1").ListObject.DataBodyRange.Delete End If Application.DisplayAlerts = True On Error GoTo 0 Range("tableau1").ListObject.AutoFilter.ShowAllData End Sub
Salut Pierre,
Je n'avais pas pensé à cette précaution judicieuse, gérant l'erreur.
Avant de reporter ma réponse, j'avais codé
Il y a tout de même un paradoxe qui me titille.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Option Explicit Public Sub test_suppr() With Sht_Données 'Enlève le filtre éventuel If .FilterMode = True Then .ListObjects("T_Données").AutoFilter.ShowAllData 'Filtre sur la colonne à filtrer With .ListObjects("T_Données") .Range.AutoFilter Field:=.ListColumns("nbre").Index, Criteria1:="20" Debug.Print .DataBodyRange.Address 'Shunte l'alerte éventuelle Application.DisplayAlerts = False 'Suppression des lignes filtrées .DataBodyRange.Delete End With 'Enlève le filtre effectué .ListObjects("T_Données").AutoFilter.ShowAllData End With End Sub
La ligne insérée, après le filtre,
retourne l'adresse du corps de cellules entier.Code:Debug.Print .DataBodyRange.Address
Ce alors que, 2 lignes plus loin à peine, la suppression du même objet n'affecte que les enregistrements filtrés.
Bizarre, non?
Salut Marcel,
Oui, c'est la même chose lorsque le filtre appliqué amène à masquer toutes les lignes du tableau. L'adresse du databodyrange est alors celle de toute la zone de données du tableau. C'est en effet paradoxal. Ce n'est pas la seule bizarrerie des filtres sur le listobject, ni la seule bizarrerie du ListObject, d'ailleurs. Perso, je trouve qu'ils ont mal programmé les filtres sur Excel, et qu'ils auraient pu redresser la barre lors de la création du ListObject.