Colorer des cellules selon la couleur des shapes (Formes)

Bonjour tout le monde,

J'ai vraiment besoin d'aide. En fait je me suis inspiré d'un code trouvé sur le net qui fonctionne très bien. Il me permet de colorer la cellule selon son contenu (Pas de mise en forme conditionnelle). L'utilisateur dispose d'un classeur avec deux feuilles(Barre et Couleur). Dans la feuille "Couleur", il est libre de créer des événements matérialisé par des formes (shapes) avec des couleurs différentes. Dans la feuille "Barre", il lui suffit de faire un clic pour voir apparaître un menu lui présentant tous les événements avec leurs couleurs. il peut cliquer sur l’événement souhaité pour que celui-ci se colle sur la cellule active qui sera colorée avec la couleur associée à la forme.

Jusqu'ici tout va bien.

Seulement, après un tri, les couleurs peuvent se retrouver dans des cellules vides et les cellules non vides se retrouvent sans couleur.

Je voudrais pouvoir parcourir ma plage et colorer les cellules non vides à l'aide des couleurs dans la feuille "Couleur".

J'aimerais aussi pouvoir utiliser cette solution pour recolorer toutes les cellules non vides de ma plage si l’utilisateur décide à un moment donné de changer certaines couleurs associées à certains événements.

Je vous remercie par avance.

Ci-après le fichier:

Bonjour,

Avant d'aller trop loin, pourquoi passer par cette excellente solution en lieu et place d'une MFC ?

Pour le code,

il faudrait commenter :

    'On Error GoTo 0

et finir

    Barre.ShowPopup
    Set Barre = Nothing

et à la fin de coloriage :

    Application.ScreenUpdating = True

Je n'arrive pas à comprendre ton histoire de tri... peux-tu détailler ou reformuler ?

Merci

Bonjour oxydum,

En réalité, j'ai pris le code tel quel sur la toile. JE ne comprends pas tout non plus. J'ai apporté une petite modification pour que la valeur de la cellule dans la feuille Barre soit égale aux 4 premiers caractères du texte inscrit dans les formes mises dans la feuille "Couleur".

J'ai choisi cette méthode en lieu et place des MFC pour que l'utilisateur de mon fichier n'ait pas à mettre lui même des MFC.Il n'en est pas capable et refuse de l'apprendre. Il dit qu'il veut une solution simple. Et donc pour lui, c'est de rentrer dans la feuille "Couleur" pour rajouter une forme (rectangle) lui affecter un texte et une couleur.

Seulement dans la feuille "Barre", à un moment donné, il fait un tri sur la colonne C, qui contient les noms des personnes, si bien que des cellules non vides se retrouvent sans couleurs et des cellules vides avec des couleur (Plage D2:L4).

La solution serait de faire une procédure qui permet de parcourir ma plage de cellule et de colorer toutes les cellules non vide selon leur contenu que je compare au texte dans les formes (feuille "Coueur").

Merci pour votre aide

Bonjour,

Avant d'aller trop loin, pourquoi passer par cette excellente solution en lieu et place d'une MFC ?

Pour le code,

il faudrait commenter :

    'On Error GoTo 0

et finir

    Barre.ShowPopup
    Set Barre = Nothing

et à la fin de coloriage :

    Application.ScreenUpdating = True

Je n'arrive pas à comprendre ton histoire de tri... peux-tu détailler ou reformuler ?

Merci

J'ai fait une triple boucle,

Sub Recolorier()
    k = 1 ' index des couleurs
    For i = 2 To Range("Tableau1").Columns.Count ' 2 : sauf les Noms
        For j = 1 To Range("Tableau1").Rows.Count
            For Each s In Sheets("couleurs").Shapes
                'Debug.Print s.Name
                If Range("Tableau1").Cells(j, i).Value = s.DrawingObject.Caption Then ' Pour chaque destination
                    Range("Tableau1").Cells(j, i).Interior.Color = s.Fill.ForeColor ' affecte la bonne couleur
                    k = k + 1 ' la suite
                    'Debug.Print Range("Tableau1").Cells(j, i).Value
                End If
            Next s
        Next j
    Next i
End Sub

Je te joins ma proposition

Il faut cliquer sur le feu rouge pour recolorer

Je vous remercie infiniment. Votre solution fonctionnement parfaitement. MErci beaucoup.

J'ai juste un dernier souhait si vous me le permettez.

J'ai crée une fonction personnalisée mais elle est un peu lente surtout quand je l'utilise dans une autre feuille que celle où se trouve les éléments lui servant dans son calcul. Les éléments de calcul sont dans la feuille "Barre".

Cette fonction permet de totaliser la durée passée par une personne dans une ville. Attention, une personne peut avoir plusieurs ligne dans le tableau. Et puis, à la place des villes, je jeux mettre Absence, Maladies ou Congés, des événements que je ne prends pas en compte pour le totale durée passée dans les villes.

Autre chose : Souvent, je remarque que les codes se mettent à s'exécuter quand je je suis sur l'éditeur (il est marqué excécution en cours) sans que je n'ai rien fait. Est-ce dû aux évènementielles ou Appication.volatile

Vous trouverez le code commenté dans le fichier joint

Merci pour votre aide précieuse pour une deuxième fois.

J'ai fait une triple boucle,

Sub Recolorier()
    k = 1 ' index des couleurs
    For i = 2 To Range("Tableau1").Columns.Count ' 2 : sauf les Noms
        For j = 1 To Range("Tableau1").Rows.Count
            For Each s In Sheets("couleurs").Shapes
                'Debug.Print s.Name
                If Range("Tableau1").Cells(j, i).Value = s.DrawingObject.Caption Then ' Pour chaque destination
                    Range("Tableau1").Cells(j, i).Interior.Color = s.Fill.ForeColor ' affecte la bonne couleur
                    k = k + 1 ' la suite
                    'Debug.Print Range("Tableau1").Cells(j, i).Value
                End If
            Next s
        Next j
    Next i
End Sub

Je te joins ma proposition

Il faut cliquer sur le feu rouge pour recolorer

Une petite rectif :

la durée passée par une personne dans les villes et non dans une ville uniquement. Vous avez peut être repéré cette erreur par ce que dans ma fonction personnalisée, j'essaie bien de totaliser la durée passée dans toutes les villes confondues.

MErci

Je vous remercie infiniment. Votre solution fonctionnement parfaitement. MErci beaucoup.

J'ai juste un dernier souhait si vous me le permettez.

J'ai crée une fonction personnalisée mais elle est un peu lente surtout quand je l'utilise dans une autre feuille que celle où se trouve les éléments lui servant dans son calcul. Les éléments de calcul sont dans la feuille "Barre".

Cette fonction permet de totaliser la durée passée par une personne dans une ville. Attention, une personne peut avoir plusieurs ligne dans le tableau. Et puis, à la place des villes, je jeux mettre Absence, Maladies ou Congés, des événements que je ne prends pas en compte pour le totale durée passée dans les villes.

Autre chose : Souvent, je remarque que les codes se mettent à s'exécuter quand je je suis sur l'éditeur (il est marqué excécution en cours) sans que je n'ai rien fait. Est-ce dû aux évènementielles ou Appication.volatile

Vous trouverez le code commenté dans le fichier joint

BarreBoutonsColoriageCoul Vba Excel2.xlsm

Merci pour votre aide précieuse pour une deuxième fois.

J'ai fait une triple boucle,

Sub Recolorier()
    k = 1 ' index des couleurs
    For i = 2 To Range("Tableau1").Columns.Count ' 2 : sauf les Noms
        For j = 1 To Range("Tableau1").Rows.Count
            For Each s In Sheets("couleurs").Shapes
                'Debug.Print s.Name
                If Range("Tableau1").Cells(j, i).Value = s.DrawingObject.Caption Then ' Pour chaque destination
                    Range("Tableau1").Cells(j, i).Interior.Color = s.Fill.ForeColor ' affecte la bonne couleur
                    k = k + 1 ' la suite
                    'Debug.Print Range("Tableau1").Cells(j, i).Value
                End If
            Next s
        Next j
    Next i
End Sub

Je te joins ma proposition

Il faut cliquer sur le feu rouge pour recolorer

Je t'invite à découvrir la fonction SOMMEPROD qui fait le produit cartésien pour additionner des choux et des carottes.

Pour l'optimisation, j'ai ajouté sur la feuille un exemple, mais je n'ai pas compris entièrement la logique de ta fonction.

Re,

MErci

Votre méthode focntionne quand il y a pas de doublons dans la Colonne C (les Personnes) . Et dans la réalitité, (il y a en aura. Le tableau changera un peu de forme, je vais introduire une notion de plage horaire si bien que l'on peut mettre deux fois martin pour un même jour mais à des plages horaires différente, de 10 h 12h puis de 13h à 18h ).

C 'est pour cette raison que j'avais pensé à une formule personnalisée.

MErci

Je t'invite à découvrir la fonction SOMMEPROD qui fait le produit cartésien pour additionner des choux et des carottes.

Pour l'optimisation, j'ai ajouté sur la feuille un exemple, mais je n'ai pas compris entièrement la logique de ta fonction.

Rechercher des sujets similaires à "colorer couleur shapes formes"