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. #21
    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,

    désolé, je pense juste que, comme je ne comprends pas ..., on ne s'entend pas ...

    pour faire plus simple, si je modifie en recréant 3 fois toutes les variables du code pré-cité et que je remets en dessous et en changeant le set w = worksheets ou en ajoutant un : With ActiveWorkbook.Sheets("3 - Defects") , je ne devrais pas avoir de soucis en recopiant 3 fois le codes (j'avoue ne pas avoir encore essayé et ca ne fait pas très propre.... mais tant que ca marche)

    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

  2. #22
    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
    Avec ce code, tu stockes les filtres de la feuille, tu fais le traitement que tu veux et tu remets les filtres originaux (pour une feuille), Dans le code, tu écris Set Ws = Activesheet donc la feuille affichée.

    Soit tu passes le nom de la feuille en paramètre de cette Sub et tu enlèves le Set,
    soit tu boucles les feuilles dans une autre Sub, les affiche puis appelle cette Sub,
    soit tu sépares ta Sub en 3 parties: stockage des filtres des 3 feuilles, traitement des 3 feuilles et remise des filtres des 3 feuilles.
    MPi²

  3. #23
    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
    qu'elle est la solution la plus simple à mettre en œuvre ?

  4. #24
    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
    J'irais de cette façon
    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
    Public filterArray()
     
    Sub Main()
        Dim I As Integer
        Dim arrSh As Variant
        Dim Sh As Worksheet
     
        'Les feuilles que je veux traiter
        arrSh = Array("Feuil1", "Feuil2", "Feuil3")
     
        For I = 0 To UBound(arrSh)
            Set Sh = Worksheets(arrSh(I))
            StoreFilters Sh
     
        'Traitement
            'Ici j'enlève les filtres pour fins de test
            Sh.AutoFilterMode = False
            Sh.Rows(1).AutoFilter
            Stop  'on peut vérifier l'état des filtres
     
            RestoreFilters Sh
        Next
     
        Set Sh = Nothing
    End Sub
     
    Sub StoreFilters(Sh As Worksheet)
        Dim I As Long, J As Long
        Dim currentFiltRange As String
     
        On Error GoTo Erreur
     
        With Sh.AutoFilter
            currentFiltRange = .Range.Address
            With .Filters
                ReDim filterArray(1 To .Count, 1 To 3)
                For I = 1 To .Count
                    With .Item(I)
                        If .On Then
                            If IsArray(.Criteria1) Then
                                For J = 1 To UBound(.Criteria1)
                                    filterArray(I, 1) = filterArray(I, 1) & .Criteria1(J) & "|"
                                Next
                            Else
                                filterArray(I, 1) = .Criteria1
                                If .Operator Then
                                    filterArray(I, 2) = .Operator
                                    filterArray(I, 3) = .Criteria2
                                End If
                            End If
                        End If
                    End With
                Next
            End With
        End With
     
        Exit Sub
    Erreur:
        MsgBox Err.Description
     
    End Sub
     
    Sub RestoreFilters(Sh As Worksheet)
        Dim I As Long, J As Long, Idx As Long
        Dim Tablo
        Dim arrTemp() As String
     
        On Error GoTo Erreur
     
        ReDim arrTemp(0)
     
        For I = 1 To UBound(filterArray)
            If InStr(1, filterArray(I, 1), "|") > 0 Then
                Tablo = Split(filterArray(I, 1), "|")
                For J = 0 To UBound(Tablo)
                    If Tablo(J) <> "" Then
                        ReDim Preserve arrTemp(Idx)
                        arrTemp(Idx) = Replace(Tablo(J), "=", "")
                        Idx = Idx + 1
                    End If
                Next
                Sh.Rows(1).AutoFilter Field:=I, Criteria1:=arrTemp, Operator:=xlFilterValues
            Else
                If Not IsEmpty(filterArray(I, 1)) And Not IsEmpty(filterArray(I, 2)) Then
                    Sh.Rows(1).AutoFilter Field:=I, Criteria1:=filterArray(I, 1), Operator:=filterArray(I, 2), Criteria2:=filterArray(I, 3)
                ElseIf Not IsEmpty(filterArray(I, 1)) Then
                    Sh.Rows(1).AutoFilter Field:=I, Criteria1:=filterArray(I, 1)
                End If
            End If
        Next
     
        Exit Sub
    Erreur:
        MsgBox Err.Description
     
    End Sub
    MPi²

  5. #25
    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
    ooooh =)

    je vais essayer d'ajouter le code de l'existant au niveau de la ligne 62 pour voir si ca tourne correctement

    merci beaucoup.

    Pour question : le nombre de feuille dans Array peut-être agrandie a autant d'onglet qu'on le souhaite ?

  6. #26
    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 Parcourir les feuilles d'un classeur
    Bonjour,
    Pour question : le nombre de feuille dans Array peut-être agrandie a autant d'onglet qu'on le souhaite ?
    Evidemment oui. je te suggère la lecture du chapitre VI. La fonction Array du tutoriel Utiliser les variables tableaux en VBA Excel

    Il y a plusieurs manières de parcourir les feuilles d'un classeur et répéter ainsi une ou plusieurs instructions (appeler structure répétitive) concernant ces feuilles.
    Parmi que je salue au passage, a choisi l'utilisation d'une variable tableau mais il est possible également de choisir de parcourir la collection des feuilles comme l'exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      MsgBox "La feuille nommée " & sht.Name
     Next
    End Sub
    et utiliser une structure décisionnelle comme Select Case pour ne sélectionner que les feuilles nommées Feuil2, Feuil3 et Feuil5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      Select Case sht.Name
       Case "Feuil2", "Feuil3", "Feuil5"
        MsgBox "La feuille nommée " & sht.Name
      End Select
     Next
    End Sub
    Comme il faut toujours se méfier de la façon d'encoder le nom d'une feuille (problème de casse et/ou l'encodage parasite de caractère espacé), on peut forcer la sélection en mettant tout en minuscule et en supprimant les caractères espacés avant et après la chaîne. Voir exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
     Dim sht As Worksheet
     For Each sht In ThisWorkbook.Worksheets
      Select Case Trim(LCase(sht.Name))
       Case "feuil2", "feuil3", "feuil5"
        MsgBox "La feuille nommée " & sht.Name
      End Select
     Next
    End Sub
    Petite suggestion tout de même, pour éviter tout problème il vaut mieux privilégier l'utilisation de la propriété CodeName de la feuille.

    Une autre façon encore de parcourir plusieurs feuilles avec les mêmes restrictions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
     Dim NumFeuille As Integer
     With ThisWorkbook
      For NumFeuille = 1 To .Worksheets.Count
       Select Case Trim(LCase(.Worksheets(NumFeuille).Name))
        Case "feuil2", "feuil3", "feuil5"
         MsgBox "La feuille nommée " & .Worksheets(NumFeuille).Name
       End Select
      Next
     End With
    End Sub
    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

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