CouleurMFC si MFC repose sur formule
Bonjour,
Je souhaite compléter la fameuse fonction CouleurMFC() pour qu'elle prenne aussi en compte la MFC par formule.
J'ai donc écrit le code suivant qui évidemment ne fonctionne pas:
Public Function CouleurMFC(RG, 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
ElseIf LoMFC.Type = xlExpression Then
LoTest = Evaluate(LoMFC.Formula1)
End If
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
Next i
CouleurMFC = xlNone
End FunctionEst-il possible d'évaluer la formule dans le cas où type=xlExpression?
Merci.
Bonjour AlainBo
Sauf erreur de ma part, cette question n'a jamais trouvée de réponse
En effet, si tu utilises une MFC exemple :
=ET($A1=1;$C1=1)et que cette MFC à une portée de A1:A10
Pour la 1ère cellule, pas de souci on peut évaluer la formule,
mais comment l'évaluer pour les cellules suivantes, sachant que la formule est toujours la même
@+
Merci pour votre réponse.
Pas de bol!
Oui mais pourtant cela fonctionne dans les autres cas; xlEqual, etc... et le problème est bien le même?
Dans ces cas Excel est bien capable de faire évoluer l'adresse de la cellule non? Une MFC s'applique généralement à une étendue.
Je pensais que c'était parce que dans ce cas, LoMFC.formula1 commence par un "=". J'ai donc tenté de l'enlever mais Evaluate() échoue tout de même.
Je trouve quand même fort que depuis plus de 10 ans que l'on cherche une solution pour retourner la couleur d'une cellule définie par MFC, Microsoft n'ait pas apporté de réponse satisfaisante.
Car le fait de pouvoir le faire dans une Sub et afficher le résultat dans une MsgBox ne présente pas le moindre intérêt.
RE,
Oui mais pourtant cela fonctionne dans les autres cas; xlEqual, etc... et le problème est bien le même?
Dans ces cas Excel est bien capable de faire évoluer l'adresse de la cellule non? Une MFC s'applique généralement à une étendue.
Non le problème n'est pas le même
Dans le cas d'une valeur la fonction évalue le résultat de la fonction par apport à cette valeur, il n'y a aucune référence
Case xlEqual
LoTest = RG = Evaluate(LoMFC.Formula1)RG = 1
LoMFC.Formula1 = "=1"
Evaluate(LoMFC.Formula1) = 1
1=1 = Vrai
Je pensais que c'était parce que dans ce cas, LoMFC.formula1 commence par un "=". J'ai donc tenté de l'enlever mais Evaluate() échoue tout de même.
Oui, mais ce n'est pas pour cette raison
Je trouve quand même fort que depuis plus de 10 ans que l'on cherche une solution pour retourner la couleur d'une cellule définie par MFC, Microsoft n'ait pas apporté de réponse satisfaisante.
Si cela existe : SOMME.SI.ENS()
Sauf qu'on utilise pas la couleur des cellules pour faire le total, mais les critères qui sont utilisés dans la MFC
La MFC, c'est du "décors"
@+
Re,
Ah, effectivement je n'avais pas pensé à cette fonction qui devrait le faire...
Donc j'ai essayé!
Et malgré la doc et quelques exemples trouvés sur le net, je n'arrive pas à la faire fonctionner.
Dans le fichier ci-joint je l'ai utilisée en N35 où je devrais retrouver 100% puisque D28 et E28 remplissent le critère.
Où ai-je donc foiré ???
Bonsoir,
S'agissant de plages de temps, on ne peut pas utiliser SOMME.SI.ENS()
Il faut utiliser un calcul matriciel
=SOMMEPROD((N$6>=$D$12:$D$34)*($E$12:$E$34>=N$6)*($H$12:$H$34))@+