Problème de Cnditions IF
Bonjour,
Je suis novice en VBA. Mon programme doit comparer les dates inscrites dans les cellules C3:W72 à aujourd'hui - 3mois et colorer un onglet en vert si toutes les dates sont inférieures à TODAY - 3M sinon l'onglet est rouge. Il y a deux autres conditions à vérifier.
Lorsque mon programme s’exécute, je vois l'onglet se colorier en vert ou rouge mais selon les dates inscrites l'onglet reste vert malgré des dates inférieures à TODAY -3M.
Voici mon code :
Sub CouleurOnglet()
Dim DateAgile As Date
DateAgile = DateSerial(Year(Now), Month(Now) - 3, Day(Now))
For i = 7 To 72
For j = 3 To 23
If Cells(i, j).Value >= DateAgile And Range("B74") >= 90 And Range("B75") <= 2.85 Then
'Colorer l'onglet de la feuille Cartographie en vert'
Sheets("Cartographie").Tab.ColorIndex = 4
Range("B76").Value = "Yes"
ElseIf Cells(i, j).Value < DateAgile Then
Sheets("Cartographie").Tab.ColorIndex = 3
Range("B76").Value = "No"
Cells(i, j).Font.ColorIndex = 3
ElseIf Range("B74") < 90 Or Range("B75") > 2.85 Then
'Colorer l'onglet de la feuille Cartographie en rouge'
Sheets("Cartographie").Tab.ColorIndex = 3
Range("B76").Value = "No"
End If
Next
Next
End SubMerci d'avance de votre aide
Bonjour Naimaxx, bonjour le forum,
Peut-être comme ça :
Sub CouleurOnglet()
Dim DateAgile As Date
Dim TEST As Boolean
DateAgile = DateSerial(Year(Now), Month(Now) - 3, Day(Now))
For i = 7 To 72
For j = 3 To 23
If Cells(i, j).Value >= DateAgile And Range("B74") >= 90 And Range("B75") <= 2.85 Then
Range("B76").Value = "Yes"
ElseIf Cells(i, j).Value < DateAgile Then
TEST = True
Range("B76").Value = "No"
Cells(i, j).Font.ColorIndex = 3
ElseIf Range("B74") < 90 Or Range("B75") > 2.85 Then
TEST = True
Range("B76").Value = "No"
End If
Next
Next
Sheets("Cartographie").Tab.ColorIndex = IIf(TEST = True, 3, 4)
End SubMerci de ta réponse mais ça ne marche toujours pas.
Pourtant la date inférieur à TODAY -3M se colorie bien rouge.
Je ne comprend pas cette ligne :
Sheets("Cartographie").Tab.ColorIndex = IIf(TEST = True, 3, 4)Bonjour,
Testes déjà cette simple procédure (simple comparaison de dates), vois le résultat et adaptes :
Sub Test()
Dim Tbl
Dim I As Integer
Dim J As Integer
With Worksheets("Cartographie")
'affecte à un tableau pour plus de rapidité
Tbl = .Range("C3:W72")
'mets l'onglet à vert par défaut en considérant que toutes
'les dates sont inférieure à aujourd'hui - 90 jours
.Tab.ColorIndex = 4
'boucle...
For I = 1 To UBound(Tbl, 1) '...par ligne...
For J = 1 To UBound(Tbl, 2) '...et par colonne
'si la date en cours est supérieure à aujourd'hui - 90 jours...
'...colore l'onglet en rouge et fin de procédure
If Tbl(I, J) > Date - 90 Then
.Tab.ColorIndex = 3
Exit Sub
End If
Next J, I
End With
End SubRe,
Je ne comprend pas cette ligne :
Sheets("Cartographie").Tab.ColorIndex = IIf(TEST = True, 3, 4)
la syntaxe de ce code est SI(Condition, résultat si condition est [vrai], résultat si condition est [faux]), c'est un condensé de If...Else... End If en une seule ligne.
Pour toi ça donne la couleur de l'onglet = 3 si TEST est [vrai], 4 si TEST est [faux]... Car je ne vois pas l'intérêt de changer à chaque ligne alors que tu ne veux changer que si TOUTES les lignes vérifient une condition. C'est pour cela que si la condition n'est pas vérifiée je modifie la variable TEST à [vrai], une seule ligne permet donc de faire la différence. À la fin, je modifie la couleur de l' onglet en fonction de la variable TEST. Enfin... Si j'ai bien compris...
Bonjour, merci de vos réponses. Mais je n'arrive toujours pas à faire fonctionner le code.
@ThauThème
J'ai un peu modifié le code avec la condition de test. Mon problème maintenant est la prise en compte des cases vides.
J'ai rajouté une condition lorsque la case est vide test est faux et l'onglet et vert. Mais lorsqu'une date est inférieure à celle demandée, la date se colorie bien en rouge mais l'onglet reste vert. J'ai l'impression que la condition sur les cases vides prévaut sur le reste.
VOici le code modifié :
Sub CouleurOnglet()
Dim DateAgile As Date
Dim TEST As Boolean
DateAgile = DateSerial(Year(Now), Month(Now) - 3, Day(Now))
For I = 7 To 72
For J = 3 To 23
If Cells(I, J).Value >= DateAgile And (Range("B74") >= 90) And (Range("B75") <= 2.85) Then
TEST = False
Range("B76").Value = "Yes"
ElseIf IsEmpty(Cells(I, J).Value) Then
TEST = False
ElseIf Cells(I, J).Value < DateAgile Or (Range("B74") < 90) Or (Range("B75") > 2.85) Then
TEST = True
Range("B76").Value = "No"
Cells(I, J).Font.ColorIndex = 3
End If
Next
Next
Sheets("Cartographie").Tab.ColorIndex = IIf(TEST = True, 3, 4)
End SubMerci de votre aide