[Catégorie modifiée VB6 --> VBA] format conditionnel et macro For...Each

CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 10 juil. 2010 à 15:34
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 19 juil. 2010 à 17:42
Bonjour à tous

Petit problème:
J'ai par exemple une celle B25 de couleur initiale grise, à laquelle j'associe une couleur conditionnelle : Si valeur= 1; rouge..

J'entre la valeur 1 et la couleur passe au rouge (normal!), puis je lance une macro pour savoir si une cellule de la plage A14:M22 a une couleur conditionnelle rouge, pour la sélectionner:
Sub TestInteriorColor()
    For Each Cell In Range("A14:M32")
        If Cell.Interior.ColorIndex  = 3 Then
            Cell.Select
            MsgBox "Donnée à corriger", vbCritical
            Exit For
        End If
    Next
End Sub

Et là, surprise, la macro ne voit PAS ma cellule B25 qui est bien affichée en rouge (en fait elle prend en compte la couleur initiale...), et donc ma cellule B25 n'est pas sélectionnée...

Qui aurait une idée pour corriger ça ?

Merci beaucoup

Cordialement
Rataxes64

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 juil. 2010 à 16:06
Salut

Très mauvaise idée d'appeler une variable comme un mot réservé du système (ou proche) : Cell : préfère mCell

Oui, j'ai aussi constaté le même problème que toi.
Hélas, il faut passer par une Selection pour obtenir le bon ColorIndex :
        Cell.Select
        If Selection.Interior.ColorIndex = 6 Then

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
11 juil. 2010 à 02:04
Salut Jack,

Va pour mCell...

Si je te suis bien, la boucle For/Next va faire un "mCell.select" à chaque cellule, et le "If" analysera la couleur conditionnelle (et non pas initiale) de la "mCell" sélectionnée par le pas de la boucle...
J'ai l'impression que ça va être long!

J'ai fouillé un peu partout sur le net pour ne trouver que des non-réponses (impossible... etc)

J'ai donc de suite testé ta solution :
Sub Test2InteriorColor()
    For Each mCell In Range("A14:M32")
        mCell.Select
        If mCell.Interior.ColorIndex = 3 Then
            MsgBox "Donnée à corriger", vbCritical
            Exit For
        End If
    Next
End Sub

Désolé, man, ça marche pas, c'est toujours la couleur initiale qui est vue...et toujours PAS la Mise en Forme Conditionnelle

Je me suis donc re-pelé (ailleurs dans la feuille) toutes les formules de MFC pour les avoir en VRAI/FAUX récupérable par les macros.

Fastidieux, mais je n'ai trouvé que ça, si quelqu'un à une autre idée ???

Merci quand même de m'avoir répondu.

Cordialement
Rataxes64
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 juil. 2010 à 15:43
Tu n'as pas bien lu mon code :
La lecture de la couleur doit être faite sur Selection, pas sur la cellule.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 juil. 2010 à 15:58
Oh lala
Je viens de refaire le test et .. ça ne fonctionne plus comme hier.
J'approfondis
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 juil. 2010 à 17:15
Bon, je me casse la tête sans réponse probante.
Il semble que ce soit un réel problème.

Une manière de contourner l'obstacle est de récupérer la formule du Conditional et de tester chaque cellule, comme le fait le Conditional.
En supposant qu'il n'y ait qu'une seule condition dans ce Conditional.

Dans mon exemple, j'avais mis les lettres a à f dans les cellules 1 à 6 de ma colonne A, et ma formule conditionnelle était ="c" (égale la lettre c)
Donc, seule la cellule contenant la lettre c passe en rouge.
    Dim mCell As Range
    Dim sCondition As String
    Dim bResult As Boolean
    
    For Each mCell In Range("A1:A6")
        sCondition = mCell.FormatConditions(1).Formula1
        bResult = ExecuteExcel4Macro("""" & mCell.Value & """" & sCondition)
        If bResult Then
            Debug.Print mCell.Address, , "Oui"
        Else
            Debug.Print mCell.Address, "Non"
        End If
    Next

Il y a peut-être mieux à faire autour des évaluate et autre, mais je ne connais pas.
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
19 juil. 2010 à 17:42
Salut,

D'abord, merci Jack pour tes recherches. J'ai testé mais je souhaiterais plus d'explication sur la ligne :
bResult = ExecuteExcel4Macro("""" & mCell.Value & """" & sCondition)
(j'ai Excel2003)

Désolé pour une réaction tardive, mais j'ai mis du temps pour (je crois!) bien faire le tour de la question.

1°) Définitivement, l'état de la couleur résultant d'une condition dans le format conditionnel ne peut PAS être repris directement dans une macro, sans "déclencher" au préalable la condition par une macro (la même ou un autre); il faut donc "récupérer" la condition en question.

2°) Dans mon cas (et dans la plus part!), on n'a pas qu'une seule condition, et chacune peut se trouver en condition (1), (2) ou (3) ; de toute manière l'appel via formula dans une macro interdit tout futur déplacement ou insertion dans la plage de cellules concernées, ce qui constitue une limite innacceptable.

3°) La "solution" (lourde!) que j'ai retenue pour mon programme consiste à "copier", pour chaque format conditionnel concerné, la formule conditionnelle correspondant à une couleur à rechercher DANS DES CELLULES DE LA FEUILLE, qui prendront donc la valeur VRAI ou FAUX [ou 1 et 0 avec un "SI(...Vrai;1;0)] ; une macro peut alors facilement annalyser ces valeurs, et donc les états de la couleur recherchée dans la plage concernée (exemple : afficher un message si une cellule dans une plage définie est rouge).

Bon courage! Car ça fait du copier/coller en perspective, que je n'ai pas pu (su) automatiser par macro: Au "coller", la cellule est identifiée par les valeurs [R,C] par rapport à la cellule "copier", et non plus par ses coordonnées directes dans Excel...


Bref c'est vraiment pas terrible et la piste proposée par Jack n'en est que plus intéressante... sauf que :
Il ne peut pas y avoir de cellule "sans condition" dans la plage,
et que la couleur recherchée doit toujours être dans une condition de même rang...


Perso, je crois que je vais jetter l'éponge.

Cordialement
Rataxes64
0
Rejoignez-nous