Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

zephir94

XLDnaute Impliqué
Bonjour à tous,


Je sais ce que vous allez me dire... une MFC c'est le papier peint d'Excel car la couleur renvoyé si on teste seulement la Cellule va renvoyer 0.
J'ai beaucoup cherché, lu des tas de solutions qui ne fonctionnent pas, enfin du moins si je l'applique à mon projet .

Je crée ces MFD par macro avec VBA comme ceci :
Code:
Range("O" & df).Select
 With ThisWorkbook.Worksheets(1).Range("O" & df)
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, _
Formula1:="=ET(N" & df & "<=" & s & ")"
.FormatConditions(1).Interior.ColorIndex = 3
End With
  With ThisWorkbook.Worksheets(1).Range("O" & df)
.FormatConditions.Add Type:=xlExpression, _
 Formula1:="=ET(N" & df & " >= " & d & ";N" & df & "<" & X & ")"
.FormatConditions(2).Interior.ColorIndex = 46
End With
  With ThisWorkbook.Worksheets(1).Range("O" & df)
.FormatConditions.Add Type:=xlExpression, _
 Formula1:="=ET(N" & df & " >= " & X & ")"
.FormatConditions(3).Interior.ColorIndex = 4
End With
With ThisWorkbook.Worksheets(1).Range("O" & df)
.FormatConditions.Add Type:=xlExpression, _
Formula1:="=ET(N" & df & "=" & e & ")"
.FormatConditions(4).Interior.ColorIndex = 1
End With

Si un nombre en Cellule N j'affiche une MFC avec la couleur correspondante en Cellule O, je voudrais connaitre son numéro de couleur excel en Cellule P.
Non non non je ne suis pas Sadomasochisme ! car je veux tester si la couleur est rouge soit 3 ( les autres ne m’intéresse pas ) dans une ou plusieurs Cellule de la colonne P je récupère les lignes que j'incrémente dans une listebox.

Je sais mon chère Job75 que vous avez posé la question fut un temps sur ce précieux forum et que vous aviez engagé un fil trépident qui hélas ne m'a pas fait avancé ( je fais des recherches hihihi )

J'ai trouvé aussi ceci :

Code:
Option Explicit
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 = 0
End Function

en rajoutant dans la feuille ou il y a Les MFC la formule suivante :

Code:
=CouleurMFC(O17;1)

mais hélas la valeur renvoyé est 0 la tête à toto !
J'ai beaucoup cherché est j'ai vue que des solutions existent mais ne sont pas généralistes et fonctionnent que dans certains cas de MFC.
J'ai lu aussi de rechercher la formule dans O mais je n'arrive pas le synthétiser...
en gros chercher si la formule dans O est bien :
Code:
=ET(N" & df & "<=" & s & ")

faire une boucle dans la Colonne O jusqu'à la dernière Cellule remplie et faire une conditionnelle, si formule présente alors je colore en rouge la Cellule en P ( ça je sais faire ) mais tester si la formule est là et si elle correspond là j'ai du mal !

Car la valeur retourné si je cherche si il y a une formule dans la Cellule est :
Code:
=ET(N12 <= 5)
par exemple donc forcément si je compare les deux je tombe sur else et end if.

Code:
=ET(N" & df & "<=" & s & ") = =ET(N12 <= 5) ' la valeur 5 n'est pas la même sur toute les lignes elle dépend de la valeur choisie par l'utilisateur 

Sub cco()
Feuil1.Select
tz = Range("N65536").End(xlUp).Row
For t = 9 To tz
X = Feuil1.Range("O" & t).FormatConditions(1).Formula1


If Feuil1.Range("O" & t).FormatConditions(1).Formula1 = "=ET(O" & t & " <=  ??????)" Then
Range("P" & t).Interior.ColorIndex = 3
Else
End If
Next

End Sub

Car ?????? est variable et c'est à cause de cela que je n'arrive pas à valider si oui ou non la condition est vraie !

Sur cette piste je suis pas loin mais pas encore assez près du succès hélas !

Bref je suis un peu perdu et toute aide sera la bienvenue !

Merci par avance à vous tous
 
Dernière édition:

job75

XLDnaute Barbatruc

zephir94

XLDnaute Impliqué
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Bonjour Job75,

Une idée pour ce problème ?

faire une boucle dans la Colonne O jusqu'à la dernière Cellule remplie et faire une conditionnelle, si formule présente alors je colore en rouge la Cellule en P ( ça je sais faire ) mais tester si la formule est là et si elle correspond là j'ai du mal !

Car la valeur retourné si je cherche si il y a une formule dans la Cellule est :
Code:
=ET(N12 <= 5)
par exemple donc forcément si je compare les deux je tombe sur else et end if.

Code:
=ET(N" & df & "<=" & s & ") = =ET(N12 <= 5) ' la valeur 5 n'est pas la même sur toute les lignes elle dépend de la valeur choisie par l'utilisateur 

Sub cco()
Feuil1.Select
tz = Range("N65536").End(xlUp).Row
For t = 9 To tz
X = Feuil1.Range("O" & t).FormatConditions(1).Formula1


If Feuil1.Range("O" & t).FormatConditions(1).Formula1 = "=ET(O" & t & " <=  ??????)" Then
Range("P" & t).Interior.ColorIndex = 3
Else
End If
Next

End Sub

Car ?????? est variable et c'est à cause de cela que je n'arrive pas à valider si oui ou non la condition est vraie !
 

job75

XLDnaute Barbatruc
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Re,

Pas vraiment compris ce que vous voulez faire mais pour cette question :

Car ?????? est variable et c'est à cause de cela que je n'arrive pas à valider si oui ou non la condition est vraie !

il suffit d'écrire :

Code:
If X Like "=ET(O" & t & "<=*)" Then
Il faut ensuite évaluer X par cette instruction :

Code:
test =Evaluate(Replace(X, "ET", "AND"))
la variable test étant déclarée As Boolean.

Edit : attention, vous êtes sûr qu'il n'y a pas de signe $ dans la formule ?

A+
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Bonjour,

Plutôt que de chercher la couleur utilise les même tests que ta MFC.
Dans ton cas ça doit être qq chose comme :
Code:
If Cells(df, "N") <= s And Not (Cells(df, "N") = e Or Cells(df, "N") >= X Or (Cells(df, "N") >= d And Cells(df, "N") < X)) Then MsgBox "rouge"
à contrôler mais le principe est là...
eric
 

zephir94

XLDnaute Impliqué
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Merci à vous deux,

J'ai en premier testé la solution à Job75 en modifiant le code comme ceci :

Code:
Sub cco()

Dim test As Boolean

Feuil1.Select
tz = Range("N65536").End(xlUp).Row
For t = 9 To tz
X = Feuil1.Range("O" & t).FormatConditions(1).Formula1
If X Like "=ET(O" & t & "<=*)" Then
test = Evaluate(Replace(X, "ET", "AND"))
If test = True Then
Range("P" & t).Interior.ColorIndex = 3
Else
Else
End If
End If
Next

End Sub

Je viens de m’apercevoir que comme je ne teste pas la condition active de la MFC de la Cellule , forcement il va toujours trouver FormatConditions(1) avec =ET(O9 <= ?????) d'une part car il faut que je trouve la condition actuelle.

En deuxième problème

Code:
If X Like "=ET(O" & t & "<=*)" Then
test = Evaluate(Replace(X, "ET", "AND"))

en pas à pas la condition est toujours fausse malgré "=ET(O" & t & "<=*)" = ET(O9 <= 5), il n'y a pas de $ dans les formules j'ai vérifié en editant la MFC par le menu d'Excel.

Pour la solution eriiiic helas il ne trouve pas l'objet avec une erreur 91
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Re,

en pas à pas la condition est toujours fausse malgré "=ET(O" & t & "<=*)" = ET(O9 <= 5),

En effet, à partir d'Excel 2007 la formule d'une MFC est toujours la même quelle que soit la cellule où elle s'applique.

Travaillez la solution que préconise eriiiic, c'est ce qu'il y a de plus simple.

A+
 

zephir94

XLDnaute Impliqué
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Merci Job75,

Je vais donc m'orienter sur la solution de Eriiiic :
Code:
If Cells(df, "N") <= s And Not (Cells(df, "N") = e Or Cells(df, "N") >= X Or (Cells(df, "N") >= d And Cells(df, "N") < X)) Then MsgBox "rouge"

il ne trouve pas l'objet hum erreur 1004 , je vois pas à quoi correspond les variables e et d ? car je travail plus dans l'userform qui me permet de créer les MFC mais depuis la feuille avec l’événement change.

Si je comprend bien il faudrait que je stock dans une feuille les valeurs que les utilisateurs ont choisis en créant les MFC pour aller les chercher pour remplir les variables e et d ?

Le problème est que si la valeur de la Cellule avant le MFC sur la même ligne change, en fonction du chiffre la couleur va changer !
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

il ne trouve pas l'objet hum erreur 1004 , je vois pas à quoi correspond les variables e et d ?
Quel objet ???
df, s, d, X et e sont simplement les variables utilisées dans ton code. Tu devrais plus savoir que moi ce qu'elles représentent ;-)
Et tu peux conserver leurs affectations dans vba sans rien toucher à ton code. Elles avaient une valeur à ce niveau, elles restent ce qu'elles sont.
eric
 

Pièces jointes

  • Classeur2.xlsm
    24.8 KB · Affichages: 37
  • Classeur2.xlsm
    24.8 KB · Affichages: 35
Dernière édition:

zephir94

XLDnaute Impliqué
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

J'ai bien compris à quoi elles servent mais comme je crée mes Mfc depuis un userform les variables n'existent plus donc il faut que j'intègre ces dernières dans une base et que j'aille les rechercher avant pour la comparaison.
 

zephir94

XLDnaute Impliqué
Re : Trouver la couleur d'une MFC et l'afficher dans la Cellule d'à coté !

Bonsoir,

Merci à vous deux, ça marche impeccablement, j'ai écrit les données s, d , X
à la création des MFC, dans une feuille.
et la couleur rouge de la MFC est bien trouvée dans les lignes.

Code:
Sub cco()
Dim g As Integer
Dim celluletrouvee As Range
Dim test As Boolean
Application.ScreenUpdating = False
Feuil1.Unprotect Password:="go"
Feuil1.Select
dz = Range("C65536").End(xlUp).Row
For t = 9 To dz
g = Feuil1.Range("C" & t).Value
Feuil2.Select
Set celluletrouvee = Feuil2.Range("A2:A65536").Find(g, lookat:=xlWhole)
If celluletrouvee Is Nothing Then
Else
df = celluletrouvee.Row
s = Feuil2.Range("H" & df)
d = Feuil2.Range("I" & df)
X = Feuil2.Range("J" & df)
Feuil1.Select
If Cells(t, "O") <= s And Not (Cells(t, "O") = d Or Cells(t, "O") >= X Or (Cells(t, "N") >= d And Cells(t, "O") < X)) Then
Feuil1.Range("P" & t).Interior.ColorIndex = 3
Else
Feuil1.Range("P" & t).Interior.ColorIndex = xlNone
End If
End If
Next
Feuil1.Protect Password:="go"
Application.ScreenUpdating = True
End Sub

Un grand merci à vous deux
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
318

Statistiques des forums

Discussions
312 174
Messages
2 085 942
Membres
103 053
dernier inscrit
Beubax