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.