Extraire la liste des valeurs filtrées d'un tableau

Bonjour,

Avec la fonction sous.total() on peut faire des opérations sur les valeurs filtrées d'un tableau mais pas récupérer la liste ainsi filtrée.

J'ai besoin de récupérer cette liste pour la mettre dans un autre onglet.

Par exemple le "tableau1" avec plusieurs colonnes : Nom, Prénom, téléphone, etc. avec plusieurs lignes

Si je fais un filtre sur le prénom "Pierre", le tableau affiche plusieurs lignes de Pierre (s'il y en a plusieurs) avec à chaque fois le nom, le téléphone, etc associés.

Je cherche à mettre dans un autre onglet la liste ainsi obtenue : donc les valeurs qui sont affichées (sélection des Pierre) et non celles qui sont masquées.

Je veux pouvoir afficher dans un autre onglet une colonne des noms ou des téléphones etc... Or si je rentre dans une cellule : Tableau1[Nom], j'obtiens la liste complète des valeurs (affichées et masquées) de cette colonne... (le filtre n'est pas pris en compte).

Comme je ne peux pas connaitre à l'avance le nombre de lignes du "tableau1", la formule - je préfère une formule mais du VBA sera possible pour moi - doit pouvoir être entrée dans une seule cellule (et afficher la liste ainsi filtrée). Elle doit être mise à jour à chaque fois que "Tableau1" sera mis à jour (MAJ valeurs ou MAJ Filtres, donc à chaque recalcul).

C'est possible ca ????? :-))))

Merci !!!!

Bonjour,

la solution la plus simple

1'439filtre-v1.xlsm (16.79 Ko)

Merci c'est super sympa.

En fait c'est presque ca... ;-)

J'ai besoin de récupérer directement la sélection du tableau, sans passer par une cellule dans laquelle je mettrais ma valeur de sélection.

Je joins ton fichier avec un peu plus d'explications. Je vais aussi regarder ce soir ta macro, peut-être que je peux la modifier...

Merci de ton aide

136filtre-v1.xlsm (17.57 Ko)

Bonjour …

Je fais « compliqué » : filtre d’un Tableau (autant en profiter) sans date ou avec.

sans date

filtre tableau 1
Private Sub Worksheet_BeforeDoubleClick(ByVal R As Range, Cancel As Boolean)
    If Intersect(R, [TB]) Is Nothing Then Exit Sub
    c = R.Column - [TB].Column + 1
    If c = 1 Then Exit Sub
    [TB].AutoFilter c, R
    If Application.CountA([TF]) > 0 Then [TF].Delete
    [TB].SpecialCells(12).Copy [TF].Item(1, 1)
    [TB].AutoFilter
    Feuil2.Select    'pour voir
End Sub
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal R As Range, Cancel As Boolean)
    If Intersect(R, [TB]) Is Nothing Then Exit Sub
    c = R.Column - [TB].Column + 1
    If c = 1 Then Exit Sub
    [TB].AutoFilter c, R
    If Application.CountA([TF]) > 0 Then [TF].Delete
    [TB].SpecialCells(12).Copy [TF].Item(1, 1)
    [TB].AutoFilter
    Feuil2.Select    'pour voir
End Sub

avec date

97filtre-tabeau.xlsm (17.90 Ko)
Option Explicit
Dim Ddate
Private Sub Worksheet_Change(ByVal R As Range)
    Dim C As Range, n As Long, m As Long
    If R.Address <> [D1].Address Then Exit Sub
    [Td].AutoFilter
    Select Case R
        Case "Par date"
            Set Ddate = CreateObject("Scripting.Dictionary")    'date sans doublon
            For Each C In [Td[Date]]: Ddate(C.Value) = "": Next
           Lst.List = Ddate.keys: Lst.Height = 180
        Case "Mensuel": Lst.List = [BM].Value: Lst.Height = 180
        Case "Trimestriel": Lst.List = Array(1, 2, 3, 4): Lst.Height = 70
        Case "Annuel": Lst.List = [BA].Value: Lst.Height = 10 & Lst.ListCount:
    End Select
    Lst.Visible = [D1] <> ""
End Sub
Private Sub Lst_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    [Td].AutoFilter
    Application.ScreenUpdating = 0
    Select Case [D1]
        Case "Par date": [Td].AutoFilter 2, Format(Lst, "[$-fr-FR]d mmmm yyyy;@")
        Case "Mensuel": [Td].AutoFilter 2, Lst.ListIndex + 21, Operator:=11
        Case "Trimestriel": [Td].AutoFilter 2, Lst + 16, Operator:=11
       Case "Annuel": [Td].AutoFilter 2, Operator:=7, Criteria2:=Array(0, "1/1/ " & Lst)
    End Select
End Sub

Les zones en jaune sont nommées

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:E2")) Is Nothing Then
    On Error GoTo tout
    ActiveSheet.ListObjects(1).Range.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A1").CurrentRegion, _
        CopyToRange:=Range("zone1").CurrentRegion.Resize(1), Unique:=False
    ActiveSheet.ListObjects(1).Range.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A1").CurrentRegion, _
        CopyToRange:=Range("zone2").CurrentRegion.Resize(1), Unique:=False
    ActiveSheet.ListObjects(1).Range.AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("A1").CurrentRegion, _
        CopyToRange:=Range("zone3").CurrentRegion.Resize(1), Unique:=False
    Exit Sub

tout:
    ActiveSheet.ShowAllData
    Range("zone1").CurrentRegion.Offset(1, 0).Clear
    Range("zone2").CurrentRegion.Offset(1, 0).Clear
    Range("zone3").CurrentRegion.Offset(1, 0).Clear
End If
End Sub

mettre un critère dans la zone orange

82filtre-v1.xlsm (16.62 Ko)

Merci à vous deux.

C'est impressionnant ce que vous arrivez à faire, mais... j'ai dû mal m'exprimer. Donc je recommence ! ;-)

Je veux extraire (colonne par colonne c'est à dire individuellement) la liste des données du tableau une fois filtrées via les boutons de filtre.
Je ne souhaite pas double cliquer sur une cellule ou entrer quelque part une valeur de sélection...
La sélection sur le tableau DOIT se faire via les boutons de filtres (ainsi j'ai toutes les possibilités de filtre), une fois le tableau filtré, alors la macro lit les données qui restent affichées et les place ailleurs (En fait la macro ne prend en compte que les données affichées, qu'il y ait un filtre ou non...)

Je veux pouvoir choisir la colonne de mon choix (et non pas toutes les colonnes) et la placer où je veux dans un autre onglet.
Si je veux extraire 2 ou 3 colonnes, je lancerai 2 ou 3 fois la macro...

Comme je placerai les données dans un autre onglet, je pourrai déclencher uniquement la ou les macros à l'ouverture de cet onglet (ca je sais faire).

qqs copies d'écran pour être plus clair...

1) Soit un tableau Excel avec ses boutons de filtres

image1

2) Je filtre le tableau... (images prises sur un Mac, mais ca tournera sur Windows uniquement)
Ici filtre sur les Prénoms Pierre (ou toute autre possibilité de filtre, peu importe...)

capture d ecran 2021 03 10 a 18 07 57

3) La macro sélectionne la colonne que je souhaite (je mettrai le nom de la colonne du tableau en dur dans la macro) puis la macro place les données de cette colonne (seulement les données, pas l'en-tête) dans un autre onglet (j'indiquerai son nom et la cellule en dur dans la macro).

En allant dans cet autre onglet, je déclencherai (Sub Worksheet_Activate()) la ou les macros pour la mise à jour des extractions.
=> Inutile de lier la mise à jour des extractions des colonnes à chaque fois que le tableau est mis à jour (valeurs ou filtres).

capture d ecran 2021 03 10 a 18 10 21

Merci de votre aide !

ok

3) La macro sélectionne la colonne que je souhaite (je mettrai le nom de la colonne du tableau en dur dans la macro) puis la macro place les données de cette colonne (seulement les données, pas l'en-tête) dans un autre onglet (j'indiquerai son nom et la cellule en dur dans la macro).

dans ce cas, la macro est simple, il suffit d'utiliser

' exemple colonne 2 du tableau à copier en F4 de la seconde feuille
Sub test()
Sheets(1).ListObjects(1).ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
Sheets(2).Select
Range("F4").Select
ActiveSheet.Paste
End Sub

tu dois pouvoir remplacer le numéro de la colonne par son nom

n'oublie pas de clore le fil de discussion en cliquant sur si ce sujet est résolu

Super !!

Ca marche nickel... J'ai adapté ta macro en fonction de mes besoins.

Un GRAND merci...
D'autant que ca m'a permis de voir comment accéder à des objets (tableau, graphique, etc.) et j'ai donc pu faire des modifications sur d'autres objets.

Juste une dernière question et après je ferme le fil de discussion :

Quand on fait un Copy d'une ou plusieurs cellules (CTRL-C ou par macro comme dans la tienne), la zone copiée est encadrée par un cadre vert en pointillé (il "tourne" autour de la zone). Il suffit de faire ESC et il disparait.

Sais-tu comment le supprimer via une macro ? (ou faire en sorte qu'il n'apparaisse pas)

Bonjour à tous

Normalement un simple copier coller suffit à récupérer es cellules visibles, manuellement ou par VBA

Pour répondre à la question CutCopyMode=false

Merci à tous, tout fonctionne parfaitement !

Quand on fait un Copy d'une ou plusieurs cellules (CTRL-C ou par macro comme dans la tienne), la zone copiée est encadrée par un cadre vert en pointillé (il "tourne" autour de la zone). Il suffit de faire ESC et il disparait.

on pourrait adopter l'écriture suivante en une ligne

' exemple colonne 2 du tableau à copier en F4 de la seconde feuille
Sheets(1).ListObjects(1).ListColumns(2).DataBodyRange.SpecialCells(xlCellTypeVisible).Copy Destination:=Sheets(2).Range("F4")
Rechercher des sujets similaires à "extraire liste valeurs filtrees tableau"