Fonction qui retourne la couleur active d'une MFC

Pour écrire et partager des tutoriels et des astuces (Excel, Calc et Google Sheets uniquement)
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1'599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 19 mars 2012, 13:07

Cette fonction retourne la valeur du format actif d'une mise en forme conditionnelle.
Avec la fonction de la démo, deux valeurs peuvent êtres retournées.
Mode = 0 : retourne la valeur de Interior.ColorIndex
Mode = 1 : retourne la valeur de Interior.Color

Mais avec quelque modifications toutes les autres propriétés peuvent êtres renvoyées.
Public Function CouleurMFC(RG As Range, Optional Mode As Byte = 0) As Variant
Dim e As Long, i As Byte, LoTest As Boolean
Dim LoMFC As FormatCondition
    Application.Volatile
    'boucle sur le nombre de condition(s)
    'Si pas de MFC .FormatConditions.Count renvoi 0
    For i = 1 To RG.FormatConditions.Count
        Set LoMFC = RG.FormatConditions(i)
        If LoMFC.Type = xlCellValue Then
        'tester le type de la formule entrée
            Select Case LoMFC.Operator
            Case xlEqual
                LoTest = RG = Evaluate(LoMFC.Formula1)
            Case xlNotEqual
                LoTest = RG <> Evaluate(LoMFC.Formula1)
            Case xlGreater
                LoTest = RG > Evaluate(LoMFC.Formula1)
            Case xlGreaterEqual
                LoTest = RG >= Evaluate(LoMFC.Formula1)
            Case xlLess
                LoTest = RG < Evaluate(LoMFC.Formula1)
            Case xlLessEqual
                LoTest = RG <= Evaluate(LoMFC.Formula1)
            Case xlNotBetween
                LoTest = (RG < Evaluate(LoMFC.Formula1) Or RG > Evaluate(LoMFC.Formula2))
            Case xlBetween
                LoTest = (RG >= Evaluate(LoMFC.Formula1)) And (RG <= Evaluate(LoMFC.Formula2))
            End Select
            If LoTest Then
                'Peu ajouter d'autre format si nécessaire,
                'comme la bordure, la police etc..
                Select Case Mode
                Case 0
                    CouleurMFC = LoMFC.Interior.ColorIndex
                Case 1
                    CouleurMFC = LoMFC.Interior.Color
                End Select
                Exit Function
            End If
        End If
    Next i
    CouleurMFC = xlNone
End Function
La formule dans le tableur
=CouleurMFC(A2)

La MFC peut être avec une valeur directe ou une valeur indirecte (le contenu d'une autre cellule)
Ex 1 : >1 and <10
Ex 2 : >=D10 and <=E10


La fonction peu servir en VBA
Sur Excel =>2007, fonctionne uniquement avec les formules disponible sur Excel 97 - 2003
Report MFC.xls
(91 Kio) Téléchargé 1005 fois
Modifié en dernier par lermite le 8 juin 2012, 11:44, modifié 1 fois.
Tout problème a une solution, le vrai problème... c'est de la trouver.
d
dblyc15
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 5 juin 2012
Version d'Excel : 2007 FR

Message par dblyc15 » 5 juin 2012, 21:16

Bonsoir,
Il me semblait que cette fonction correspondait exactement à ce que je cherche à faire: colorer une cellule de la même couleur que la cellule adjacente, qui elle est soumise à une MFC (dans laquelle il y a 5 ou 6 règles)

Dans un premier temps (je n'ai que peu de connaissances), j'ai créé une nouvelle fonction en recopiant le code, mais l'utilisation de cette fonction n'a rien donné.

En creusant un peu et en travaillant sur le fichier Report MFC, j'ai d'une part l'impression de faire fausse route, et d'autre part je me perds un peu...

-dans le fichier Report MFC, je constate que les formules =CouleurMFC(---) qui sont dans les tableaux 2 et 4 renvoient les valeurs des couleurs (ou des index des couleurs et ne colorient pas le fonds de la cellule comme je le pensais: est-ce donc le rôle de cette fonction? (question naïve mais bon...)
-mais dans mon classeur, je n'arrive pas à faire afficher ces valeurs: je n'obtiens que des 0 (sauf pour quelques cellules). Quelles peuvent en être les raisons ? (présence de plusieurs règles? méthode inadaptée ?

-Du coup pour assurer le coloriage du troisième tableau, dois-je utiliser obligatoirement le code que l'on peut lire dans le classeur?
Je l'ai essayé dans une colonne, j'obtiens bien une couleur mais elle est la même pour toutes les cellules de la colonne alors que les cellules sources n'ont pas toutes la même couleur.

-La ligne Application volatile doit-elle être laissée ou enlevée? dans quel cas?

merci d'avance pour les réponses, même si je suis conscient que cela fait beaucoup à la fois.
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1'599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 6 juin 2012, 11:18

Bonjour,
Sans avoir ton classeur ce n'est pas facile de te répondre, mais quelque réponses quand même.
Il n'est pas nécessaire de passer par une fonction de feuille pour faire ce que tu veux.
Dans le corps de la feuille changer la sub Worksheet_Calculate() par
Private Sub Worksheet_Calculate()
Dim cel As Range, Plage As Range
    Set Plage = [J3:K16]
    For Each cel In Plage
        'cel.Interior.Color = cel.Offset(0, -3).Value
'Adapter l'offset
        cel.Interior.Color = CouleurMFC(cel.Offset(0, -7), 1)
    Next cel
End Sub
Tu peu laisser la ligne Application volatile. Dans un premier temps je pensais que ça gênerait par appel VBA mais ça ne pose pas de problème et cela laisse la fonction de feuille disponible.

Le nombre de règles est totalement pris en compte

Utilité de Application volatile dans une fonction personnelle,
Exemple 1,
En A1 la somme 10
En B1 =MaFonction(A1)
La fonction fait directement appel à la cellule cible.
Application volatile n'est pas nécessaire et même à déconseiller (ralentissement inutile du système )
Exemple 2
En A1 la somme 10
En D1 =MaFonction(B1.Offset(0,-1))
La fonction ne fait pas directement appel à la cellule cible.
Application volatile indispensable.

Si des truc pas claire hésite pas.
Si encore des problèmes dans ton classeur poste un exemple.

A+
.
Tout problème a une solution, le vrai problème... c'est de la trouver.
d
dblyc15
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 5 juin 2012
Version d'Excel : 2007 FR

Message par dblyc15 » 6 juin 2012, 16:52

lermite a écrit :Bonjour, Bonsoir,
Sans avoir ton classeur ce n'est pas facile de te répondre, mais quelque réponses quand même.
Il n'est pas nécessaire de passer par une fonction de feuille pour faire ce que tu veux.
Dans le corps de la feuille changer la sub Worksheet_Calculate()
J'ai copié ce code, mais en fait je ne suis pas sûr de maîtriser l'endroit où placer ce code, et celui de la fonction CouleurMFC. Peux-tu préciser ? les deux au même endroit?

Tu peu laisser la ligne Application volatile. Dans un premier temps je pensais que ça gênerait par appel VBA mais ça ne pose pas de problème et cela laisse la fonction de feuille disponible.
Je n'ai aucune idée de ce qu'est cette ligne, mais j'ai compris ce que tu as expliqué dans les exemples.

Le nombre de règles est totalement pris en compte Est-ce que le type de règles est-important ?


.

Si des truc pas claire hésite pas. c'est vraiment sympa
Si encore des problèmes dans ton classeur poste un exemple.
OK, mais je vais d'abord essayer de résoudre seul car cela me permettra de progresser.
A+ Merci encore et à bientôt
.
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1'599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 7 juin 2012, 08:47

Re,
La fonction CouleurMFC DOIT être mise dans un module général (Module1 par xemple)
Le code de la Sub Worksheet_Calculate() DOIT être positionner dans le module de la feuille où sont situées tes MFC.
Pour être sûre que tu ne te trompe pas... cliquer droit sur l'onfglet de la feuille --> Visualiser le code, c'est dans cette fenêtre qu'il faut coller la sub.

Est-ce que le type de règles est-important ?
A première vue je ne pense pas, si des conditions ne réponde pas convenablement tu dis, et précise le type de condition appliquer.
A+
Tout problème a une solution, le vrai problème... c'est de la trouver.
d
dblyc15
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 5 juin 2012
Version d'Excel : 2007 FR

Message par dblyc15 » 8 juin 2012, 06:54

bonjour,
Je n'étais pas très loin, mais je n'y étais pas tout à fait.
Avec cette configuration, le programme me renvoie une couleur...noire dans toutes les cellules.
Du coup j'ai travaillé en modifiant le code de la Sub Worksheet_Calculate(), pour intégrer ce que tu disais plus haut (pour ne pas avoir de noir avec la valeur 0)
Cela entraîne la disparition du noir, donc je fais l'hypothèse qu'avec mes MFC, la valeur trouvée par ta fonction est 0. Qu'en penses-tu? Vois-tu d'autres pistes?
Je continue mes essais, je vais tenter de mettre un MFC simple pour voir si cela fonctionne.

Merci pour la rapidité de tes réponses.
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1'599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 8 juin 2012, 11:41

Re,
Pour la couleur noir quand c'est zéro, tu à bien vu pour la modif, mais il y a plus simple.
Modifier dans la fonction CouleurMFC() ;(je viens seulement d'y penser)
    CouleurMFC = 0
'Par
    CouleurMFC = xlNone
Montre un ou deux exemples des formules dans les règles de la MFC.
A+
Tout problème a une solution, le vrai problème... c'est de la trouver.
M
Miss_tik76
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 30 décembre 2013
Version d'Excel : 2007 FR

Message par Miss_tik76 » 30 décembre 2013, 09:24

Bonjour à tous,

Le code ci dessous m'a bien aidé pour réccupérer les couleurs de mes MFC. Cependant j'ai des MFC dont la formule est la suivante =COUNTIF($A$16:$A$41;OFFSET(B5;-MOD(ROW()-1;29)+1;0))>0
et =WEEKDAY(OFFSET(B5;-MOD(ROW()-1;29)+1;0);2)>5
les couleurs de ces MFC ne sont pas réccupérées et restent à 0. Je pense que c'est parce que ces formules ne sont pas tester dans la boucle et je ne sais pas comment les inclure...

Pourriez vous m'aider ?

Merci par avance et bonnes fêtes de fin d'année ;)

Miss_tik76
Avatar du membre
lermite
Membre impliqué
Membre impliqué
Messages : 1'599
Inscrit le : 5 février 2012
Version d'Excel : 2000/2007FR

Message par lermite » 31 décembre 2013, 11:41

Bonjour,
Difficile de te répondre comme ça.
Tu peu déposer un classeur qui reprendrait quelque cellules avec tes MFC ?

Bonne fin d'année à toi également.
A+
Tout problème a une solution, le vrai problème... c'est de la trouver.
M
Miss_tik76
Nouveau venu
Nouveau venu
Messages : 6
Inscrit le : 30 décembre 2013
Version d'Excel : 2007 FR

Message par Miss_tik76 » 6 janvier 2014, 12:23

Bonjour et bonne année à tous !

Lermite j'ai joint un fichier exemple avec mes MFC.

Merci par avance pour votre aide.

Miss_tik76
TEST_MFC.xlsm
(58.16 Kio) Téléchargé 423 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message