IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Sauvegarde et restitution de filtres sur 3 onglets différents


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut Sauvegarde et restitution de filtres sur 3 onglets différents
    Bonjour,

    je fais appel à vous car je ne parviens pas à utiliser ce code retrouvé et qui me semble être opportun pour ce que je souhaite faire

    Comment faire pour appeler ces méthodes et restituer correctement les informations ?

    Par avance merci à vous !

    un humble néophyte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      SaveListObjectFilters
    ' Purpose:  Save filter on worksheet
    ' Returns:  wks.AutoFilterMode when function entered
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    '
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter may reside on
    '   FilterRange O/P     Range on which filter is applied as string; "" if no filter
    '   FilterCache O/P     Variant dynamic array in which to save filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2007/03/23 PJS: Now turns off .AutoFilterMode
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to save list-object filters
     
    Function SaveListObjectFilters(lo As ListObject, FilterCache()) As Boolean
    Dim ii As Long
     
    filterRange = ""
        With lo.AutoFilter
            filterRange = .Range.Address
            With .Filters
                ReDim FilterCache(1 To .Count, 1 To 3)
                For ii = 1 To .Count
                    With .Item(ii)
                        If .On Then
    #If False Then ' XL11 code
                            FilterCache(ii, 1) = .Criteria1
                            If .Operator Then
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
                            End If
    #Else   ' first pass XL14
                            Select Case .Operator
     
                            Case 1, 2   'xlAnd, xlOr
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
     
                            Case 0, 3 To 7 ' no operator, xlTop10Items, _
    xlBottom10Items, xlTop10Percent, xlBottom10Percent, xlFilterValues
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
     
                            Case Else    ' These are not correctly restored; there's someting in Criteria1 but can't save it.
                                FilterCache(ii, 2) = .Operator
                                ' FilterCache(ii, 1) = .Criteria1   ' <-- Generates an error
                                ' No error in next statement, but couldn't do restore operation
                                ' Set FilterCache(ii, 1) = .Criteria1
     
                            End Select
    #End If
                        End If
                    End With ' .Item(ii)
                Next
            End With ' .Filters
        End With ' wks.AutoFilter
    End Function
     
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      RestoreListObjectFilters
    ' Purpose:  Restore filter on listobject
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter resides on
    '   FilterRange I/P     Range on which filter is applied
    '   FilterCache I/P     Variant dynamic array containing saved filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to restore list-object filters
    '
    ' Comments:
    '----------------------------
    Sub RestoreListObjectFilters(lo As ListObject, FilterCache())
    Dim col As Long
     
    If lo.Range.Address <> "" Then
        For col = 1 To UBound(FilterCache(), 1)
     
    #If False Then  ' XL11
            If Not IsEmpty(FilterCache(col, 1)) Then
                If FilterCache(col, 2) Then
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                            Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
                Else
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1)
                End If
            End If
    #Else
     
            If Not IsEmpty(FilterCache(col, 2)) Then
                Select Case FilterCache(col, 2)
     
                Case 0  ' no operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator'
     
                Case 1, 2   'xlAnd, xlOr
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
     
                Case 3 To 6 ' xlTop10Items, xlBottom10Items, xlTop10Percent,     xlBottom10Percent
    #If True Then
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator' , it doesn't work
                    ' wks.AutoFilter.Filters.Item(col).Operator = FilterCache(col, 2)
    #Else ' Trying to restore Operator as well as Criteria ..
                    ' Including the 'Operator:=' arguement leads to error.
                    ' Criteria1 is expressed as if for a FALSE .Operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
    #End If
     
                Case 7  'xlFilterValues
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
     
    #If False Then ' Switch on filters on cell formats
    ' These statements restore the filter, but cannot reset the pass Criteria, so the filter hides all data.
    ' Leave it off instead.
                Case Else   ' (Various filters on data format)
                    lo.RangeAutoFilter field:=col, _
                        Operator:=FilterCache(col, 2)
    #End If ' Switch on filters on cell formats
     
                End Select
            End If
     
    #End If     ' XL11 / XL14
        Next col
    End If
    End Sub

  2. #2
    Membre actif Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Points : 236
    Points
    236
    Par défaut
    Bonsoir,

    Si ton classeur ne comporte pas de tableau "Mis sous forme de tableau", pourquoi ne pas utiliser l'affichage personnalisé ? (Onglet Affichage... Affichage personnalisé, Ajouter etc...) que tu pourras appeler à la demande en conservant les paramètres de Mise en page, filtre, ligne et colonnes masquées ?

    Ce que j'en dis est peut-être à côté de la demande, mais je pose la question tout de même ?
    Joël GARBE
    Fouillez bien, vous trouverez (ou pas !)

  3. #3
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 413
    Points : 16 255
    Points
    16 255
    Par défaut
    Bonjour

    A noter que les vues prennent en compte l'ensemble des onglets : si chaque onglet doit pouvoir être filtré-défiltré indépendamment des autres, ce n'est pas facilement utilisable.

    Quand à la question de Nikimizi c'est le grand flou :"...ce code retrouvé et qui me semble être opportun pour ce que je souhaite faire" qui ne nous dit rien de ce qu'il a et de ce qu'il veut obtenir...

    A noter que ce code est destiné aux listes mises sous forme de tableaux...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    j'ai conscience que ce n'était pas forcément clair (pensant que le titre suffirait)

    J'ai un fichier qui possède 4 onglets :

    - 3 premiers des données
    - 4eme vient consolider les 3 premiers onglets en 1 seul. Cette consolidation automatisée écrase tous filtres précédemment apposés.

    Je souhaite donc intercaler la possibilité de sauvegarder le placement et les filtres appliqués (quelque soit l'onglet), laisser tourner la macro existante (qui supprime ces filtres pour diverses raisons de recopie) et réappliquer les filtres apposés sur les 3 onglets pour ne pas avoir à le refaire à chaque fois qu'une reconsolidation serait lancée.

    J'espère que c'est bien plus clair comme cela ?

    ma question pouvant également être encore plus simple et axé code :

    Comment appeler correctement : SaveListObjectFilters et RestoreListObjectFilters au vu du code trouvé ? (si vous aviez des exemples, ce serait super ^^)

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Que signifie pour toi la consolidation des trois onglets ?
    La simple copie des données des trois onglets à la suite l'une des autres dans le quatrième onglet ou bien une consolidation telle quelle est conçue dans l'outil Consolidation d'excel (Commande Consolider du groupe Outils de données) de l'onglet [Données] et dans ce dernier cas est-ce une consolidation par catégorie ou bien par position ?
    Concernant les filtres.
    Imaginons que les critères des filtres soient totalement différents dans les trois onglets, comment conçois-tu le filtre du quatrième onglet ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    une recopie basique à la suite afin de n'avoir plus qu'un seul tableau au lieu des 3 splittés des premiers onglets.

    Le but de l'onglet 4 de consolidation est d'avoir une vision complète sur lequel il existe GCD et TCD divers. Aucun besoin de filtre sur ce 4eme onglet.

    Ma problématique est vraiment de pouvoir garder les filtres apposés sur les 3 premiers (sauvegarder avant / traitement de recopie du 4eme / Ré-application des filtres des 3 premiers onglets).

    Edit : pour te répondre il s'agit bien d'une recopie par position

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ma problématique est vraiment de pouvoir garder les filtres apposés sur les 3 premiers (sauvegarder avant / traitement de recopie du 4eme / Ré-application des filtres des 3 premiers onglets).
    Maintenant c'est plus clair.
    Si tu utilises les filtres simples voir http://stackoverflow.com/questions/9...defined-filter
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    si c'est pour avoir la totalité des données tu peux passer par un tableau qui se moque totalement des filtres mis en place, plus besoin de les modifier et de les restaurer.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim tmp
        tmp = [A1].CurrentRegion.Value
        Sheets("Feuil2").[A1].Resize(UBound(tmp, 1), UBound(tmp, 2)) = tmp
    eric

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    @Philippe : oui c'est effectivement sur le principe de ce topic la que mon premier message repose.

    Pour autant il fonctionne pour le seul onglet actif.

    Je ne sais pas vraiment le dupliquer pour l'ensemble des onglets...

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    @Philippe : oui c'est effectivement sur le principe de ce topic la que mon premier message repose.
    Pour autant il fonctionne pour le seul onglet actif.
    Je n'ai pas regardé en détail ce code mais j'imagine que tu peux invoquer la procédure de lecture des propriétés avant la copie de la première feuille et l'écriture des propriétés après la copie et tu boucles ainsi sur l'ensemble des feuilles.
    Sinon je pense que la proposition de Eriiic est une excellente solution qui évite de passer par ces procédures (Si toutefois tu n'as pas besoin de conserver le format des cellules).
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    Le format est important (autant format -dates-nombre-texte etc.) que de la taille des cellules.

    sur la base du lien de Philippe : http://stackoverflow.com/questions/9...defined-filter

    comment le faire pour 3 onglets différents et à la suite sauvegarde + restitution ...

    Je vous avoue que je ne touche pas vraiment ma bille en VBA et ai tenté de faire fonctionner quelque chose tout vendredi après midi sans grande avancée

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu nous montrais le code que tu utilises pour effectuer ce copier/coller et où tu appelles les deux procédures SaveListObjectFilters et RestoreListObjectFilters ce serait nettement plus simple pour t'aider ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    pour le premier code : comment les appeler avec la "liste" des wks utilisé mais je ne parviens pas à renseigner ce qu'il faut dans l'appel de fonction pour le filter Range / FilterCache. Pour moi c'est calculé automatiquement dans la fonction selon le nombre de colonne à prendre en compte.

    Si vous pouviez me donner un exemple d'appel cela m'aiderait bcp ?

    1er code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      SaveListObjectFilters
    ' Purpose:  Save filter on worksheet
    ' Returns:  wks.AutoFilterMode when function entered
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    '
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter may reside on
    '   FilterRange O/P     Range on which filter is applied as string; "" if no filter
    '   FilterCache O/P     Variant dynamic array in which to save filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2007/03/23 PJS: Now turns off .AutoFilterMode
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to save list-object filters
     
    Function SaveListObjectFilters(lo As ListObject, FilterCache()) As Boolean
    Dim ii As Long
     
    filterRange = ""
        With lo.AutoFilter
            filterRange = .Range.Address
            With .Filters
                ReDim FilterCache(1 To .Count, 1 To 3)
                For ii = 1 To .Count
                    With .Item(ii)
                        If .On Then
    #If False Then ' XL11 code
                            FilterCache(ii, 1) = .Criteria1
                            If .Operator Then
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
                            End If
    #Else   ' first pass XL14
                            Select Case .Operator
     
                            Case 1, 2   'xlAnd, xlOr
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
                                FilterCache(ii, 3) = .Criteria2
     
                            Case 0, 3 To 7 ' no operator, xlTop10Items, _
    xlBottom10Items, xlTop10Percent, xlBottom10Percent, xlFilterValues
                                FilterCache(ii, 1) = .Criteria1
                                FilterCache(ii, 2) = .Operator
     
                            Case Else    ' These are not correctly restored; there's someting in Criteria1 but can't save it.
                                FilterCache(ii, 2) = .Operator
                                ' FilterCache(ii, 1) = .Criteria1   ' <-- Generates an error
                                ' No error in next statement, but couldn't do restore operation
                                ' Set FilterCache(ii, 1) = .Criteria1
     
                            End Select
    #End If
                        End If
                    End With ' .Item(ii)
                Next
            End With ' .Filters
        End With ' wks.AutoFilter
    End Function
     
     
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ' Sub:      RestoreListObjectFilters
    ' Purpose:  Restore filter on listobject
    ' Source: http://stackoverflow.com/questions/9489126/in-excel-vba-how-do-i-save-restore-a-user-defined-filter
    ' Arguments:
    '   [Name]      [Type]  [Description]
    '   wks         I/P     Worksheet that filter resides on
    '   FilterRange I/P     Range on which filter is applied
    '   FilterCache I/P     Variant dynamic array containing saved filter
    '
    ' Author:   Based on MS Excel AutoFilter Object help file
    '
    ' Modifications:
    ' 2006/12/11 Phil Spencer: Adapted as general purpose routine
    ' 2013/03/13 PJS: Initial mods for XL14, which has more operators
    ' 2013/05/31 P.H.: Changed to restore list-object filters
    '
    ' Comments:
    '----------------------------
    Sub RestoreListObjectFilters(lo As ListObject, FilterCache())
    Dim col As Long
     
    If lo.Range.Address <> "" Then
        For col = 1 To UBound(FilterCache(), 1)
     
    #If False Then  ' XL11
            If Not IsEmpty(FilterCache(col, 1)) Then
                If FilterCache(col, 2) Then
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                            Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
                Else
                    lo.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1)
                End If
            End If
    #Else
     
            If Not IsEmpty(FilterCache(col, 2)) Then
                Select Case FilterCache(col, 2)
     
                Case 0  ' no operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator'
     
                Case 1, 2   'xlAnd, xlOr
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2), _
                        Criteria2:=FilterCache(col, 3)
     
                Case 3 To 6 ' xlTop10Items, xlBottom10Items, xlTop10Percent,     xlBottom10Percent
    #If True Then
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1) ' Do NOT reload 'Operator' , it doesn't work
                    ' wks.AutoFilter.Filters.Item(col).Operator = FilterCache(col, 2)
    #Else ' Trying to restore Operator as well as Criteria ..
                    ' Including the 'Operator:=' arguement leads to error.
                    ' Criteria1 is expressed as if for a FALSE .Operator
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
    #End If
     
                Case 7  'xlFilterValues
                    lo.Range.AutoFilter field:=col, _
                        Criteria1:=FilterCache(col, 1), _
                        Operator:=FilterCache(col, 2)
     
    #If False Then ' Switch on filters on cell formats
    ' These statements restore the filter, but cannot reset the pass Criteria, so the filter hides all data.
    ' Leave it off instead.
                Case Else   ' (Various filters on data format)
                    lo.RangeAutoFilter field:=col, _
                        Operator:=FilterCache(col, 2)
    #End If ' Switch on filters on cell formats
     
                End Select
            End If
     
    #End If     ' XL11 / XL14
        Next col
    End If
    End Sub

    2eme code :

    Pour le deuxième code, j'ai tenté de multiplié par 3 le code en tentant de variabiliser sans grande réussite ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub ReDoAutoFilter()
        Dim w As Worksheet
        Dim filterArray()
        Dim currentFiltRange As String
        Dim col As Integer
     
        Set w = ActiveSheet
     
        ' Capture AutoFilter settings
        With w.AutoFilter
            currentFiltRange = .Range.Address
            With .Filters
                ReDim filterArray(1 To .Count, 1 To 3)
                For f = 1 To .Count
                    With .Item(f)
                        If .On Then
                            filterArray(f, 1) = .Criteria1
                            If .Operator Then
                                filterArray(f, 2) = .Operator
                                filterArray(f, 3) = .Criteria2 'simply delete this line to make it work in Excel 2010
                            End If
                        End If
                    End With
                Next f
            End With
        End With
     
        'Remove AutoFilter
        w.AutoFilterMode = False
     
        ' Your code here
     
        ' Restore Filter settings
        For col = 1 To UBound(filterArray(), 1)
            If Not IsEmpty(filterArray(col, 1)) Then
                If filterArray(col, 2) Then
                    w.Range(currentFiltRange).AutoFilter field:=col, _
                    Criteria1:=filterArray(col, 1), _
                    Operator:=filterArray(col, 2), _
                    Criteria2:=filterArray(col, 3)
                Else
                    w.Range(currentFiltRange).AutoFilter field:=col, _
                    Criteria1:=filterArray(col, 1)
                End If
            End If
        Next col
    End Sub
    merci pour ton temps philippe

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu publies le même code qu'en début de discussion il me semble.
    Je te demandais de publier le code que tu as écris pour utiliser ceux-ci puisque tu dis que tu y arrives avec la première feuille et pas avec les suivantes.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    toujours compliqué de se faire comprendre par écrit, je le conçois lol ...

    j'avais trouvé le même code que toi au préalable. Le code avec lequel ca fonctionne est le second code. Mais cela ne fonctionne que pour l'onglet actif. J'aimerais que cela fonctionne avec mes 3 onglets.

    Pour ma propre compréhension. Sur le 1er code, comment devrait être appelé la fonction et avec quelles variables dans le call ?

    d'avance merci !

  16. #16
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n'ai pas examiné le code, je n'ai fait que te transmettre le lien que j'avais trouvé mais à la lecture rapide du 2ème code, c'est normal qu'il ne fonctionne que sur une feuille puisque la variable objet w est la feuille active (ligne 9).
    Tu auras beau multiplier l'appel au code 25 fois ce sera toujours la feuille active. C'est pour cela que je t'ai indiqué de boucler sur les objets feuilles
    Ceci dit si les données présentes dans les feuilles sont des tableaux (au sens excel du termes), la copie des données même filtrées ne pose pas de problème.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  17. #17
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Re,

    Le format est important
    S'il est identique pour toutes les lignes tu peux le copier d'une ligne pour le coller sur une plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Range("A2:D2").Copy
        With Sheets("Feuil2").Range("A2:D100")
            .PasteSpecial Paste:=xlPasteFormats
            .PasteSpecial Paste:=xlPasteColumnWidths
        End With
        Application.CutCopyMode = False
    eric

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 37
    Points
    37
    Par défaut
    Bonjour à vous :

    de façon à être plus circonspect :

    Je vais avoir 3 onglets différents nommés 1-Test / 2-TestBis / 3-TestTer / 4-Consolidations

    Ce que je souhaite faire ce serait :
    1- récupérer les filtres apposés dans mon onglet 1-Test
    1bis- récupérer les filtres apposés dans mon onglet 2-TestBis
    1ter- récupérer et stocker les filtres apposés dans mon onglet 3-TestTer

    2-faire tourner ce qui existe en macro consolidation ( qui casse les filtes ) (peu importe cette macro en fin de compte, je ne peux pas y toucher et cela n'influence à mon avis pas l'algorythme)

    3- restaurer le filtre apposés dans mon onglet 1-Test et stocké de l'étape 1
    3bis- restaurer le filtre apposés dans mon onglet onglet 2-TestBis et stocké de l'étape 1bis
    3ter- restaurer le filtre apposés dans mon onglet onglet 3-TestTer et stocké de l'étape 1ter

    Cela doit provenir de moi car je ne comprends pas forcément le VBA ou ce que vous essayer de me faire comprendre ?

    Pensez-vous qu'à partir du code 2, cela puisse se faire sans trop de problème ? si oui comment ! (je me répète mais je ne connais quasiment rien VBA ... juste quelques bases très succinctement!)


    merci d'avance !

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Dans ton code #2, il y a 2 parties distinctes, la création du tableau de filtres et la restauration de ce tableau.

    Il te faudrait séparer les 2 et parcourir tes 3 feuilles pour créer 3 tableaux de filtres, faire ta manipulation et restaurer les 3 tableaux par la suite.

    Tu pourrais créer une Function pour compiler les filtres et une pour restaurer ceux-ci, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Tablo1 = LireFiltres (Feuil1)
    Tablo2 = LireFiltres (Feuil2)
    Tablo3 = LireFiltres (Feuil3)
     
    ton traitement
     
    RemettreFiltres (Feuil1, Tablo1)
    RemettreFiltres (Feuil2, Tablo2)
    RemettreFiltres (Feuil3, Tablo3)
    MPi²

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Et moi comme j'ai l'impression de parler dans le vent je vais aller voir ailleurs...

Discussions similaires

  1. Problème de lancement avec un TreeView sur un onglet différent
    Par CEREFX dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 11/02/2016, 20h39
  2. Sélection d'un filtre sur un onglet
    Par ElPibeOro dans le forum QlikView
    Réponses: 1
    Dernier message: 08/09/2015, 10h27
  3. Filtre sur onglet d'un rapport
    Par denils dans le forum Deski
    Réponses: 4
    Dernier message: 29/09/2009, 09h36
  4. Réponses: 4
    Dernier message: 23/03/2009, 11h46
  5. Réponses: 6
    Dernier message: 22/05/2008, 12h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo