Filtrer en fonction des couleurs

julia Namor Messages postés 532 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, à toutes et tous

Je voudrais filtrer les lignes d'un tableau en fonction de la couleur des cellules du tableau .
j'arrive à le faire en utilisant la boucle for each sur un petit tableau

Sub jaune()
Application.ScreenUpdating = False
Dim MyCell As Range
Sheets("donnees").Range("$C$8:$X$76").EntireRow.Hidden = True

For Each MyCell In Sheets("donnees").Range("$C$8:$X$76")
If MyCell.Interior.ColorIndex = Sheets("donnees").Range("c1").Interior.ColorIndex Then
MyCell.EntireRow.Hidden = False
End If
Next MyCell
Application.ScreenUpdating = True
End Sub
                                                                                                                        • Sub rouge() Application.ScreenUpdating = FalseDim MyCell As RangeSheets("donnees").Range("$C$8:$X$76").EntireRow.Hidden = True For Each MyCell In Sheets("donnees").Range("$C$8:$X$76") If MyCell.Interior.ColorIndex = Sheets("donnees").Range("d1").Interior.ColorIndex Then MyCell.EntireRow.Hidden = False End If Next MyCell Application.ScreenUpdating = TrueEnd Sub************************************************************Sub vert() Application.ScreenUpdating = FalseDim MyCell As RangeSheets("donnees").Range("$C$8:$X$76").EntireRow.Hidden = True For Each MyCell In Sheets("donnees").Range("$C$8:$X$76") If MyCell.Interior.ColorIndex = Sheets("donnees").Range("e1").Interior.ColorIndex Then MyCell.EntireRow.Hidden = False End If Next MyCell Application.ScreenUpdating = TrueEnd Sub


Seulement les choses se gatent sur mon tableau d'environ 1500 colonnes et 800 lignes
C'est ultra lent.
Auriez vous une idée plus rapide pour filtrer les lignes à me proposer?

ci joint le fichier

http://www.cjoint.com/c/FLmkx65RAXA

Merci de votre aide

4 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    à voir si c'est mieux :
    Sub jaune()
        filtrer [C1].Interior.Color
    End Sub
    
    Sub rouge()
        filtrer [D1].Interior.Color
    End Sub
    
    Sub vert()
        filtrer [E1].Interior.Color
    End Sub
    
    Sub filtrer(couleur As Long)
        Dim pl As Range, lig As Long, col As Long
    
        Application.ScreenUpdating = False
        Set pl = Sheets("donnees").Range("$C$8:$X$76")
        pl.EntireRow.Hidden = True
        For lig = pl.Row To pl.Row + pl.Rows.Count
            For col = pl.Column To pl.Column + pl.Columns.Count
                If Cells(lig, col).Interior.Color = couleur Then
                    Rows(lig).EntireRow.Hidden = False
                    Exit For
                End If
            Next col
        Next lig
    End Sub 

    Le plus efficace serait d'avoir des valeurs dans ces cellules et une colonne de synthèse pour filtrer directement dessus.
    eric
    0
  2. julia Namor Messages postés 532 Statut Membre 33
     
    Bonjour Eric
    Je gagne pas mal de temps en traitement .

    Les couleurs du filtre se trouvent dans une autre feuille ("Base").
    J'ai transformé comme tel
    Sub ma_jaune()
    filtrer [Sheets(Base").Range("c1")].Interior.Color
    End Sub

    Sub ma_rouge()
    filtrer [Sheets("Base").Range("d1")].Interior.Color
    End Sub

    Sub ma_vert()
    filtrer [Sheets("Base").Range("e1")].Interior.Color
    End Sub


    j'obtiens une erreur.

    "Le plus efficace serait d'avoir des valeurs dans ces cellules et une colonne de synthèse pour filtrer directement dessus.
    En fait il ya des valeurs et des commentaires dans la majorité des cellules .Certaines sont vides . Mais j'ai vraiment besoin de filtrer en fonction de la couleur pour les affectations .

    Merci eric
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      filtrer Sheets("Base").Range("c1").Interior.Color


      edit :
      si tu peux insérer une colonne C (à masquer) sans que ça mette trop le bazar cette méthode devrait être plus rapide (à confirmer, ne sera pas plus lente de toute façon) :
      https://www.cjoint.com/c/FLms1YrRDiR
      eric
      0
      1. julia Namor Messages postés 532 Statut Membre 33 > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour eric
        Voilà une solution qui me semble efficace avec la colonne des "vrai" et "Fau"x et le filtre appliqué dessus.
        Mais je pense qu'il doit y avoir une erreur sur le fichier . Aucun filtre ne fonctionne
        Peux tu y rejeter un coup d'oeil?
        Merci de ton aide
        0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Les boutons fonctionnent bien chez moi.
      Ferme et relance excel pour voir.
      Mais j'ai chronométré. Le gain n'est pas faramineux, tu peux rester sur l'ancienne version.
      Ce qui prend du temps c'est de lire la couleur des cellules une par une.
      0
  3. julia Namor Messages postés 532 Statut Membre 33
     
    Bonjour
    --Les boutons fonctionnent bien chez moi.
    Ferme et relance excel pour voir.

    Si j'ai bien compris le fonctionnement du filtre : Il faut d'abord cliquer sur le bouton "FILTRE JAUNE " ou .... Là toutes les lignes sont masquées puis je selection le filtre "vrai" dans la colonne C.
    Le resultat s'obtient en deux temps.
    mais comme tu me le conseilles ,je vais rester sur l'ancienne version

    --Ce qui prend du temps c'est de lire la couleur des cellules une par une

    Est ce qu'au lieu de lire les cellulles une à une , ce serait possible pour la macro: Dans la plage spécifiée

    -- de touver uniquement la toute premiere cellule de la ligne contenant la couleur du filtre
    -- d'afficher cette ligne ou ne pas la masquer
    -- D'aller aussitot à la ligne suivante pour refaire la meme procédure.

    Ainsi on gagnerait en temps de traitement du fait que toutes les cellules de la plage ne sont pas lues.

    J'espere que c'est réalisable
    Merci Beaucoup
    0
  4. julia Namor Messages postés 532 Statut Membre 33
     
    En fait ma demande ci- dessus était déja satisfaite par ton code
    je viens de m'en rendre compte
    Sub filtrer1(couleur As Long)
    Dim pl As Range, lig As Long, col As Long

    Application.ScreenUpdating = False
    Set pl = Sheets("donnees").Range("$C$8:$X$76")
    pl.EntireRow.Hidden = True
    For lig = pl.Row To pl.Row + pl.Rows.Count
    For col = pl.Column To pl.Column + pl.Columns.Count
    If Cells(lig, col).Interior.Color = couleur Then
    MsgBox "J'ai trouvé une cellule jaune : " & Cells(lig, col).Address
    Rows(lig).EntireRow.Hidden = False
    Exit For
    End If
    Next col
    Next lig
    End Sub

    Merci beaucoup
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      Si j'ai bien compris le fonctionnement du filtre : Il faut d'abord cliquer sur le bouton "FILTRE JAUNE " ou .... Là toutes les lignes sont masquées puis je selection le filtre "vrai" dans la colonne C.
      Ah ben non, c'était prévu que ça s'enchaine tout seul.
      J'ai dû oublier la fin, je vois ça demain en fin d'am.

      Est ce qu'au lieu de lire les cellulles une à une , ce serait possible pour la macro...
      Pour les couleurs pas le choix.
      Ce qu'il faudrait ça serait des règles pour calculer la couleur d'après le contenu numérique ou texte des cellules.
      Si pas possible guère de possibilité d'amélioration significative.
      Ou bien si les couleurs n'évoluent pas régulièrement les mémoriser, ensuite le passage d'un filtre à l'autre serait presque instantané.
      Et ajouter un bouton pour forcer le rafraichissement de la mémorisation en cas de changements à prendre en compte.
      A voir s'il reste beaucoup de latence sur tes 900 lignes. Tu dis...
      eric
      0