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 !!!!
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
Bonjour …
Je fais « compliqué » : filtre d’un Tableau (autant en profiter) sans date ou avec.
sans date
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 Subavec date
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 SubLes 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 Submettre un critère dans la zone orange
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
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...)
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).
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 Subtu dois pouvoir remplacer le numéro de la colonne par son nom
n'oublie pas de clore le fil de discussion en cliquant sur
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")