Filtrer en fonction des couleurs

Fermé
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 12 déc. 2016 à 11:26
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 - 15 déc. 2016 à 02:12
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

A voir également:

4 réponses

eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
12 déc. 2016 à 15:52
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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
12 déc. 2016 à 18:57
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
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
Modifié par eriiic le 12/12/2016 à 19:56
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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33 > eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024
13 déc. 2016 à 20:11
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
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
13 déc. 2016 à 22:45
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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
Modifié par julia Namor le 14/12/2016 à 10:15
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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
14 déc. 2016 à 20:29
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
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
15 déc. 2016 à 02:12
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