Microsoft 365 Filtrer dans une variable-tableau : possible ?

  • Initiateur de la discussion Initiateur de la discussion BenHarber
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
Une petite question de principe (…et je m’en excuse par avance si elle est complètement saugrenue 😌) :

Est-ce qu’il est « VBAment » possible, à partir d’une VARIABLE-TABLEAU (comportant x lignes et y colonnes), de « filtrer » certaines données pour les coller sur une feuille Excel ? (je sais faire la manip à partir d’un tableau Excel mais je me demandais si on pourrait le faire à partir d’une variable-tableau).

Merci d’avance pour vos idées…et votre indulgence !
 
Hello

oui bien sur ,c'est possible

ci dessous deux fonctions de filtre (sur 1 critère, ou sur plusieurs critères)
VB:
Function FiltrerTab(FullTab() As Variant, Critère As String, ColCrit As Integer) As Boolean 'filtre le FullTab selon UN critère sur UNE colonne et renvoie vrai ou faux si le tableau a été filtré
Dim b() As Variant
    Critère = "*" & UCase(Critère) & "*"
    n = 0
    NbCol = UBound(FullTab, 2)
    For i = LBound(FullTab, 1) To UBound(FullTab, 1)
        If UCase(FullTab(i, ColCrit)) Like Critère Then 'si la ligne répond au critère
            n = n + 1: ReDim Preserve b(1 To NbCol, 1 To n) 'on dimensionne le tablo résultat b
            For K = 1 To NbCol: b(K, n) = FullTab(i, K): Next K 'on remplit la nouvelle ligne
        End If
    Next i
 
    If n > 0 Then
        FullTab = Application.WorksheetFunction.Transpose(b)
        FiltrerTab = True
    Else 'aucune ligne ne répond au critère
        FiltrerTab = False 'le tableau FullTab n'a pas été modifié==> il contient toujours TOUTES les données non filtrées
    End If
End Function

Function FiltrerTabMultiCrit(FullTab() As Variant, Critère As Variant, ColCrit As Variant) As Boolean  'filtre le FullTab selon PLUSIEURS critères sur PLUSIEURS colonnes et renvoie vrai ou faux si le tableau a été filtré
'Peut remplacer la fonction FiltrerTab (à condition de déclarer les paramètres d'appel en array)
Dim b() As Variant
Dim i As Long
Dim LigToKeep As Boolean
Dim n As Long
    n = 0
    NbCol = UBound(FullTab, 2)
    For i = LBound(FullTab, 1) To UBound(FullTab, 1)
        LigToKeep = True
       
        For IndCrit = LBound(Critère) To UBound(Critère)
            Crit = "*" & UCase(Critère(IndCrit)) & "*"
            If Not (UCase(FullTab(i, ColCrit(IndCrit)))) Like Crit Then 'si la ligne répond au critère
                LigToKeep = False
                Exit For
            End If
        Next IndCrit
        If LigToKeep Then
            n = n + 1: ReDim Preserve b(1 To NbCol, 1 To n) 'on dimensionne le tablo résultat b
            For K = 1 To NbCol: b(K, n) = FullTab(i, K): Next K 'on remplit la nouvelle ligne
        End If
    Next i
 
    If n > 0 Then
        FullTab = Application.WorksheetFunction.Transpose(b)
        FiltrerTabMultiCrit = True
    Else 'aucune ligne ne répond au critère
        FiltrerTabMultiCrit = False 'le tableau FullTab n'a pas été modifié==> il contient toujours TOUTES les données non filtrées
    End If
End Function


et la sub principale qui permet de tester cette fonction
Code:
Sub TestFiltreMultiCrit()
Dim TabData() As Variant
Dim ListCritère As Variant
Dim ColCrit As Variant
    With ActiveSheet
        TabData = .ListObjects(1).DataBodyRange.Value
        ListCritère = Array("Colonne1 22", "Colonne2 33") 'changer le contenu de l'array pour les critères
        ColCrit = Array(2, 3) 'définir les numéros de colonnes à utiliser pour les critères

        If UBound(ListCritère) <> UBound(ColCrit) Then
            MsgBox "Vous devez définir autant de critères que de colonnes"
            Exit Sub
        End If
        If FiltrerTabMultiCrit(TabData, ListCritère, ColCrit) Then
            .Range("A20").Resize(UBound(TabData, 1), UBound(TabData, 2)) = TabData
        End If
    End With
End Sub
 
Bonjour BenHarber, Vgendron,
En VBA on peut faire plein de choses.
Mais avec un petit fichier test, cela permettrait de faire une réponse plus pertinente.
( en particulier qu'appelez vous une variable tableau ? un array ? )
 
Bonjour @vgendron , @sylvanu ,
Merci beaucoup pour vos réponses rapides (alors que moi, je mets toujours du temps à répondre....😥 ).
@vgendron , je vais regarder ta fonction mais je constate qu'elle nécessite d'écrire beaucoup de lignes par rapport à la macro que j'utilise actuellement (celle qui filtre directement sur un tableau d'une feuille Excel) ; cela dit, je suppose qu'on ne peut pas trop faire autrement.
@sylvanu tu as raison : je vais vous envoyer un petit exemple, histoire d'illustrer le bazar qu'il y a dans ma tête ! 😆
 
Bonjour @vgendron , @sylvanu, @klin89, le Forum,
@sylvanu : comme demandé, voici un petit fichier.
Dans le Module1, j'ai mis un 1er exemple de ce que j'avais en tête au départ (avec la variable DataRange as variant).
Mais craignant que ce soit irréalisable, j'ai commencé une 2de piste avec ce qu'a suggéré @klin89 càd : passer par la variable 'monTableau' (tableau structuré). Seulement là, j'avoue que je n'ai pas réussi à reproduire son code (avec des .Parent, .Evaluate, etc...😰 ).

Merci d'avance pour vos suggestions et vos idées, toujours les bienvenues !
 

Pièces jointes

Bonjour,
Un essai en PJ. La mise à jour se fait lors de la sélection de la feuille avec :
VB:
Sub Worksheet_Activate()
With Sheets("Pannes").ListObjects("tab_PannesTot")
    Cells.Clear
    If Not .AutoFilter Is Nothing Then .AutoFilter.ShowAllData
    .Range.AutoFilter Field:=8, Criteria1:="FABRICATION"
    .Range.SpecialCells(xlCellTypeVisible).Copy Destination:=[A1]
    .Range.AutoFilter Field:=8
    Columns.AutoFit
End With
End Sub
Macro qu'on peut dupliquer pour chaque service.
 

Pièces jointes

Dernière édition:
@sylvanu ,
Merci beaucoup pour ta réactivité ! 🚀
Effectivement ça fonctionne bien 👍.

J'ai cependant 2 questions :
1) A quoi sert la boucle de départ ?
For C = 1 To 8
.ListObjects("tab_PannesTot").Range.AutoFilter Field:=C
Next C

2) Est-il possible de ne copier-coller que les données (pas les entêtes de tableau) ?
 
Oups !!!
J'ai updaté, prenez la dernière PJ.
La boucle servait à supprimer les filtres sur les 8 colonnes qu'on pouvait simplifier avec :
Code:
If Not .AutoFilter Is Nothing Then .AutoFilter.ShowAllData
2) Est-il possible de ne copier-coller que les données (pas les entêtes de tableau) ?
Il suffit de terminer avec :
VB:
Rows("1:1").Delete Shift:=xlUp
Voir PJ.
 

Pièces jointes

OK @sylvanu, mais je n'ai pas été précis dans ma demande : cf. PJ

Je souhaite utiliser la commande :
Sheets("Pannes").ListObjects("tab_PannesTot").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy

A partir de là, comment puis-je faire pour coller la sélection définie ci-dessus dans un autre tableau structuré vide ? (càd à partir de "A2" puisque toute la ligne 1 correspond à la ligne d'entête de mon tableau-structuré) : cf. PJ

Merci d'avance pour ta suggestion.
 

Pièces jointes

Re,
VB:
Sub Worksheet_Activate()
Application.ScreenUpdating = False
With Sheets("Pannes").ListObjects("tab_PannesTot")
    If Not .AutoFilter Is Nothing Then .AutoFilter.ShowAllData
    .Range.AutoFilter Field:=8, Criteria1:="FABRICATION"
    [tableauFabrication].ListObject.DataBodyRange.Delete
    .DataBodyRange.SpecialCells(xlCellTypeVisible).Copy Destination:=[tableauFabrication[DATE]].Item(1)
    .Range.AutoFilter Field:=8
    Columns.AutoFit
End With
End Sub
 

Pièces jointes

Re,
Que signifie [Date] dans l'expression 'Destination:=[tableauConditionnement[DATE]].Item(1)' ?
La syntaxe est : [Nom du tableau [Nom de la colonne ].Item(N° de la ligne du tableau)
Quelle sera la sémantique du code quand le tableau structuré de destination NE SE TROUVE PAS SUR LE MEME FICHIER
Et c'est maintenant que vous dites ça ?
La syntaxe sera complétement différente, et tout ce qui précède devient caduque.
Il faut soit rapatrier le tableau dans une feuille, soit y faire des accès distants, ce qui change tout.
Mais dans ce cas, il faut la structure du fichier source, là où il se trouve ( même dossier ou dossier différent .... ), etc, etc

Mais on est loin, très loin du titre de ce post "Filtrer dans une variable-tableau : possible ?" 🙁
 
OK @sylvanu , merci beaucoup pour votre réponse.
Pourtant, après avoir testé votre syntaxe, elle fonctionne parfaitement càd qu'elle exporte bien les données filtrées sur un autre fichier (ouvert), dans un tableau structuré de format identique au tableau-source : donc j'achète ! 😎

Simplement, puis-je écrire différemment (càd sans crochets) la syntaxe suivante ?
[Nom du tableau de destination [Nom de la colonne ]].Item(1)

J'ai commencé à rédiger une commande du style :
Sheets("OngletDestination").ListObjects("tableauDestination")...
mais je ne sais pas comment écrire, ensuite, l'équivalent de "[Nom de la colonne ]" ?
 
Dernière édition:
Test 1 : Destination:=Sheets("OngletDestination").ListObjects("tableauDestination").ListColumns("DATE").DataBodyRange.Cells(1, 1) = ça buggue
Test 2 : Destination:=Sheets("OngletDestination").ListObjects("tableauDestination").ListColumns("DATE").DataBodyRange.Item(1) = ça buggue aussi...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

C
Réponses
41
Affichages
3 K
Réponses
5
Affichages
542
Retour