Mise en forme conditionnelle en VBA

Bonsoir au forum,

Les fichiers que je joins sont censés réaliser la même chose. L'un à partir du MFC (mise en forme conditionnelle) l'autre grâce à la couche VBA. Seule la version MFC fonctionne parfaitement, la VBA c'est la catastrophe.

Le fichier réalise ceci :

.Si la date de démarrage (C3) est < à la date du jour(B1) du dossier inscrit(B3) et la date de cloture(D3) ="" alors colorier B3 en rouge

.Si la date de démarrage (C3) <>"" et la date de cloture(D3) <>"" alors colorier dossier inscrit(B3) en vert

.Si la date de démarrage (C3) ="" et la date de cloture(D3) = "" alors ne pas colorier dossier inscrit(B3)

même chôse en ligne 13 et 23 (pour la version MFC)

Pourrier-vous jetter un coup d'oeil surtout à la version VBA où j'ai inscris ce code svp :

Car rien ne réagit en ligne 3 et vu que ca ne marche pas je n'ai pas encore commencé la boucle pour que ca se répercute sur les lignes 13 et 23.

Private Sub Worksheet_Calculate()

If Range("C3").Value < Range("B1").Value Then
Range("B3").Interior.Color = RGB(231, 191, 191)
End If

If Range("C3") <> "" And Range("D3") <> "" Then
Range("B3").Interior.Color = RGB(189, 229, 187)
End If

If Range("C3") <> "" And Range("D3") = "" Then
Range("B3").Interior.Color = RGB(240, 240, 240)
End If

End Sub

Merci :)

FIchier attaché dans ce post :
forum_26.07 MFC 
FIchier attaché dans ce post suivant :
forum_26.07 VBA 

FIchier attaché dans ce post :

forum_26.07 VBA

Bonsoir,

A mon avis, si tu mets la couleur gris clair en fond initial, inutile de la conditionner, du moins en MFC.

La condition serait donc logiquement : si C3 et D3<>""=>vert, sinon si C3<>"" et >B1 =>rose, sinon vert.

Et à priori nul besoin d'une multitude de MFC, 2 pour la plage A3:A23 suffisent.

En VBA, il suffit de mettre en code ce que j'ai exprimé logiquement ci-dessus. Ta macro s'exécute, elle parcourt 3 conditions successives et applique tour à tour le résultat prévu quand la condition est vraie. La dernière étant vraie pour les 3 cellules, la couleur gris clair est appliquée partout..

Donc : une seule instruction If et des ElseIf, en prenant soin de hiérarchiser logiquement les conditions.

Mais la MFC devrait être une solution satisfaisante.

Cordialement

Ferrand

Bonsoir MFerrand,

Merci d'avoir de ton temps.

Et à priori nul besoin d'une multitude de MFC, 2 pour la plage A3:A23 suffisent.

Je ne cible pas la plage, je saute de 3 à 13, 23, ..... et ainsi de suite pour les colorations ou alors je ne dois pas voir bien compris pour ton raisonnement pour le MFC

J'ai réussis à le refaire en VBA, je me demandais si il était possible de cibler des lignes séparées (c3, c13, c23) sans avoir à faire un for step.... je trouve que faire des boucles ca rend vite le code lourd à lire...

Dim boucle As Integer
    For boucle = 3 To 23 Step 10
        If Range("C" & boucle) <> "" And Range("D" & boucle) = "" Then

            If Range("C" & boucle) < Range("B1") Then
                Range("B" & boucle).Interior.Color = RGB(231, 191, 191)
            End If
        ElseIf Range("C" & boucle) <> "" And Range("D" & boucle) <> "" Then
            Range("B" & boucle).Interior.Color = RGB(189, 229, 187)
        ElseIf Range("C" & boucle) = "" And Range("D3") = "" Then
            Range("B" & boucle).Interior.Color = RGB(240, 240, 240)
        End If
    Next boucle

Re,

Pour cibler les lignes 3, 13 et 23, condition que le modulo de la ligne par 10 =3.

MOD(LIGNE();10)=3 s'intègre très bien dans une MFC. Tu définis l'application à l'ensemble de la plage, 3 à 23, et la MFC pour la ligne 3 en veillant que les références qui doivent s'adapter aux autres lignes soient relatives.

On peut faire aussi en VBA mais au cas particulier, la MFC est plus économique.

Bonne soirée.

Rechercher des sujets similaires à "mise forme conditionnelle vba"