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 :

Hidden = false et les filtres


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut Hidden = false et les filtres
    Bonjour,

    J'ai du faire un travail de filtrage sur les heures d'une colonne contenant des dates et heures et avec plusieurs intervalles.
    J'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rows(compteur).EntireRow.Hidden = True
    afin de cacher les lignes qui ne convenaient pas.

    J'ai aussi rajouté un bouton afin de "défiltrer" ces lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub CommandButton2_Click()
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        Application.ScreenUpdating = False
        Dim longueur_tab As Integer
        Dim compteur As Integer
        longueur_tab = Range("J" & Rows.Count).End(xlUp).Row
        For compteur = 8 To longueur_tab
            Rows(compteur).EntireRow.Hidden = False
        Next compteur
        Application.DisplayAlerts = True
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End Sub
    Cependant, cette fonction "défiltre" aussi les lignes filtrées de manière plus traditionnelle par les utilisateurs (la petite flèche vers le bas et les cases à cocher/décocher et tout ce qui va avec).

    Avez-vous une idée pour conserver ces filtres? Ou peut être pour sauvegarder ces filtres afin de les désactiver puis de les réactiver.

    J’espère avoir été assez clair

    Bonne journée et merci d'avance !

  2. #2
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Bonjour MacKay,

    Pourquoi tu n'essaye pas de sauvegarder les criterial de ton filtre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveSheet.Range("bidule").AutoFilter Field:=1, Criteria1:="=x", _
    Operator:=xlOr, Criteria2:="=y"
    ici le x et y ainsi que le xlOr ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Sinon j'ai ça en réserve (ca doit dater de 2010 il me semble ) mais il faudra l'adapter à ton problème

    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
    Sub sauve_filtre()
    Dim f As Long
    Dim col As Integer
    Dim iItem As Long
        Set w = ActiveWorkbook.ActiveSheet
        With w.AutoFilter
            currentFiltRange = .Range.Address
            With .Filters
                col = .Count
                ReDim filterArray(1 To col, 1 To 4)
                For f = 1 To col
                    With .Item(f)
                        filterArray(f, 1) = .On
                        If .On Then
                            filterArray(f, 2) = .Operator
                            If .Operator = 7 Then
                                multiSelect = ""
                                For iItem = LBound(.Criteria1) To UBound(.Criteria1)
                                    multiSelect = multiSelect & IIf(multiSelect = "", "", delim) & .Criteria1(iItem)
                                Next iItem
                                filterArray(f, 3) = multiSelect
                            Else
                                filterArray(f, 3) = .Criteria1
                                If .Operator = 1 Or .Operator = 2 Then
                                    filterArray(f, 4) = .Criteria2
                                End If
                            End If
                        End If
                    End With
                Next f
            End With
        End With
        w.AutoFilterMode = False
     
    End Sub
    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
    Sub restaure_filtre()
    Dim col As Integer
        Set w = ActiveSheet
        w.AutoFilterMode = False
        For col = 1 To UBound(filterArray(), 1)
            'On vérifie s'il y a un filtre pour chaque colonne
           If filterArray(col, 1) = True Then
                'Il y a un filtre. Est-ce un multi-selection?
               If filterArray(col, 2) = 7 Then
                    Monfiltre = Split(filterArray(col, 3), delim)
                    w.Range(currentFiltRange).AutoFilter Field:=col, Criteria1:=Monfiltre, Operator:=xlFilterValues
                Else
                    'le filtre est "classique"
                   Monfiltre = filterArray(col, 3)
                    If filterArray(col, 2) = 1 Or filterArray(col, 2) = 2 Then
                        Monfiltre2 = filterArray(col, 4)
                        w.Range(currentFiltRange).AutoFilter Field:=col, Criteria1:=Monfiltre, Operator:=filterArray(col, 2), Criteria2:=Monfiltre2
                    Else
                        w.Range(currentFiltRange).AutoFilter Field:=col, Criteria1:=Monfiltre
                    End If
                End If
            End If
        Next
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Ne serait-il pas plus simple de :
    - constituer la plage toto des lignes visibles avant le filtre
    - filtrer comme on l'entend
    - restituer la plage toto lorsque l'on veut re-rendre visibles les lignes masquées par le filtre
    ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Al_22
    Le problème c'est que je ne connais pas les filtres que les utilisateurs vont créer, sinon ce serait trop simple !
    Il faudrait pouvoir sauvegarder les filtres sans les connaitre.

    unparia
    Le problème c'est qu'entre la fonction de filtrage et celle de défiltrage, les utilisateurs peuvent être amenés à rajouter/supprimer des filtres.

    Merci à vous deux

  6. #6
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Donc si tu adaptes le code que je t'ai filé au-dessus je pense que ça peux marcher, attends un peu je m'y penche

    Je pense avoir un début de quelque chose

    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
    Sub Remetfiltre()
        Dim w As Worksheet
        Dim tabfiltre()
        Dim lignefiltre As String
        Dim col As Integer
     
        Set w = ActiveSheet
     
        With w.AutoFilter
            lignefiltre = .Range.Address
            With .Filters
                ReDim tabfiltre(1 To .Count, 1 To 3)
                For f = 1 To .Count
                    With .Item(f)
                        If .On Then
                            tabfiltre(f, 1) = .Criteria1
                            If .Operator Then
                                tabfiltre(f, 2) = .Operator
                                tabfiltre(f, 3) = .Criteria2
                            End If
                        End If
                    End With
                Next f
            End With
        End With
     
        w.AutoFilterMode = False
     
        ' Ton bout de code
     
        For col = 1 To UBound(tabfiltre(), 1)
            If Not IsEmpty(tabfiltre(col, 1)) Then
                If tabfiltre(col, 2) Then
                    w.Range(lignefiltre).AutoFilter field:=col, _
                    Criteria1:=tabfiltre(col, 1), _
                    Operator:=tabfiltre(col, 2), _
                    Criteria2:=tabfiltre(col, 3)
                Else
                    w.Range(lignefiltre).AutoFilter field:=col, _
                    Criteria1:=tabfiltre(col, 1)
                End If
            End If
        Next col
    End Sub

  7. #7
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Bon j'ai un peu bossé sur ton code et j'ai l'impression d'avoir réussi !
    J'ai fait le test avec 2 filtres manuels en plus et ça a fonctionné.
    Le code ci-dessous
    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
    Private Sub CommandButton2_Click()
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        Application.ScreenUpdating = False
     
        Dim w As Worksheet
        Dim tabfiltre()
        Dim lignefiltre As String
        Dim col As Integer
     
        Set w = ActiveSheet
     
        With w.AutoFilter
            lignefiltre = .Range.Address
            With .Filters
                ReDim tabfiltre(1 To .Count, 1 To 3)
                For f = 1 To .Count
                    With .Item(f)
                        If .On Then
                            tabfiltre(f, 1) = .Criteria1
                            If .Operator Then
                                tabfiltre(f, 2) = .Operator
                                On Error GoTo ignorer
                                If Not IsNull(.Criteria2) Then
                                    tabfiltre(f, 3) = .Criteria2
                                End If
    ignorer:
                            End If
                        End If
                    End With
                Next f
            End With
        End With
     
        w.AutoFilterMode = False
     
     
        Dim longueur_tab As Integer
        Dim compteur As Integer
        longueur_tab = Range("J" & Rows.Count).End(xlUp).Row
        For compteur = 8 To longueur_tab
            Rows(compteur).EntireRow.Hidden = False
        Next compteur
        Application.DisplayAlerts = True
        Application.EnableEvents = True
        Application.ScreenUpdating = True
     
        For col = 1 To UBound(tabfiltre(), 1)
            If Not IsEmpty(tabfiltre(col, 1)) Then
                If tabfiltre(col, 2) Then
                        w.Range(lignefiltre).AutoFilter field:=col, _
                        Criteria1:=tabfiltre(col, 1), _
                        Operator:=tabfiltre(col, 2), _
                        Criteria2:=tabfiltre(col, 3)
                Else
                    w.Range(lignefiltre).AutoFilter field:=col, _
                    Criteria1:=tabfiltre(col, 1)
                End If
            End If
        Next col
     
     
    End Sub
    Merci bien !

  8. #8
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    Tout le plaisir est pour moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Prendre en compte les espaces dans les filtres
    Par Ekinoks dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 03/11/2006, 03h57
  2. Réponses: 2
    Dernier message: 23/06/2006, 11h43
  3. Recupération d'information sur les filtres
    Par Alpha31 dans le forum Access
    Réponses: 2
    Dernier message: 16/06/2006, 23h35
  4. Mettre à false toutes les tables d'un projet
    Par tomm dans le forum Bases de données
    Réponses: 9
    Dernier message: 28/05/2006, 01h36
  5. Delphi et Interbase > TIBDataSet et les filtres
    Par AlexB59 dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/10/2005, 01h31

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