Fonction qui retourne la couleur active d'une MFC
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
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.
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+
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
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+
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.
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+
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
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+
Bonjour et bonne année à tous !
Lermite j'ai joint un fichier exemple avec mes MFC.
Merci par avance pour votre aide.
Miss_tik76
Bonjour,
J'ai continuer à chercher mais je n'ai pas encore trouvé de solution...
L'un d'entre vous a t-il une idée pour résoudre mon problème ?
Merci d'avance,
Miss_tik76
Bonjour,
Je me permets de vous relancer car malgres mes recherches je n'ai pas trouver de solutions à mon problème.
avez vous pu regarder mon problème Lermite?
Merci par avance,
Miss_tik76