Macro VBA suivi projets

6test-1.xlsm (29.50 Ko)

Bonjour,
je suis nouveau ici et je vous serais très reconnaissant si quelqu'un pouvait m'aider avec une macro que je dois développer pour mon projet.

J'ai déjà commencé à travailler sur une macro, mais elle n'est pas encore terminée et je rencontre quelques difficultés pour la finaliser. Pour vous donner un peu de contexte, ma macro doit analyser une ligne intitulée "TdB". Elle examinera les projets dans la dernière ligne en tenant compte de leur phase et de leur jalon. Le projet en phase et jalon actuels est marqué en rouge. Cependant, si la phase du projet n'est pas encore passée, elle est colorée en vert, et les phases suivantes non atteintes sont marquées en blanc.

Mon objectif est de créer un résultat similaire à celui présenté dans la seconde image sous le titre "Expectative". Si quelqu'un peut m'offrir de l'aide ou des orientations sur comment procéder, je vous en serais extrêmement reconnaissant.

Merci d'avance pour votre aide et votre temps

Macros:

Sub ApplyCombinedConditionalColors()
    Dim ws As Worksheet, wsJalons As Worksheet
    Set ws = ThisWorkbook.Sheets("Tbd")
    Set wsJalons = ThisWorkbook.Sheets("Jalons_tdb")

    Dim checkRange As Range
    Set checkRange = ws.Range("C27:Q51")

    Dim cell As Range, cellToLeft As Range, cellToRight As Range
    Dim matchedRow As Variant
    Dim phaseName As String
    Dim columnLetter As String

    ' Effacer les couleurs précédentes
    checkRange.Interior.ColorIndex = xlNone

    ' Parcourir chaque cellule dans la plage spécifiée
    For Each cell In checkRange
        columnLetter = Split(cell.Address, "$")(1)
        phaseName = DeterminePhase(columnLetter)

        ' Rechercher une correspondance dans les jalons
        matchedRow = Application.Match(ws.Cells(cell.Row, 2).Value, wsJalons.Columns("J"), 0)

        ' Si une correspondance est trouvée et que la phase correspond
        If Not IsError(matchedRow) And wsJalons.Cells(matchedRow, 11).Value = phaseName Then
            ' Définir la couleur de la cellule actuelle
            SetColor cell, wsJalons, matchedRow, phaseName, checkRange
        Else
            ' Effacer la couleur si la condition n'est pas remplie
            cell.Interior.ColorIndex = xlNone
        End If
    Next cell
End Sub

' Fonction pour déterminer la phase en fonction de la lettre de la colonne
Function DeterminePhase(columnLetter As String) As String
    Select Case columnLetter
        Case "C", "D", "E", "F", "G"
            DeterminePhase = "Cadrage & SFG"
        Case "H", "I", "J", "K", "L"
            DeterminePhase = "Fabrication"
        Case "M", "N"
            DeterminePhase = "Recette"
        Case "O", "P"
            DeterminePhase = "MEP"
        Case "Q", "R"
            DeterminePhase = "Déploiement & VSR"
        Case Else
            DeterminePhase = ""
    End Select
End Function

' Sub-procedure pour définir la couleur en fonction des cellules voisines et de la correspondance
Sub SetColor(ByRef cell As Range, wsJalons As Worksheet, matchedRow As Variant, phaseName As String, checkRange As Range)
    Dim cellToLeft As Range, cellToRight As Range

    ' Définir les cellules voisines
    If cell.Column > 1 Then
        Set cellToLeft = cell.Offset(0, -1)
    End If
    If cell.Column < checkRange.Columns.Count Then
        Set cellToRight = cell.Offset(0, 1)
    End If

    ' Appliquer la logique des couleurs
    If Not cellToLeft Is Nothing Then
        If cellToLeft.Interior.Color = RGB(255, 0, 0) Then ' rouge à gauche
            cell.Interior.Color = RGB(0, 255, 0) ' vert
        End If
    End If

    If Not cellToRight Is Nothing Then
        If cellToRight.Interior.Color = RGB(255, 0, 0) Then ' rouge à droite
            cell.Interior.Color = RGB(255, 255, 255) ' blanc
        End If
    End If

    If cell.Interior.ColorIndex = xlNone Then ' Si aucune des conditions ci-dessus n'a été appliquée
        cell.Interior.Color = RGB(255, 0, 0) ' rouge
    End If
End Sub

Bonsoir Emycc,

Pour bien comprendre, c'est ça que tu veux obtenir :

Pour chaque ligne, on colore en vert jusqu'à atteindre la cellule marquée comme rouge, passé cette cellule on laisse en blanc.

Je vois que ton tableau est divisé en 5 parties : Cadre, Fab, Rec Mep et Dév, on n'en tient pas compte ?

rouge vert

Edit : si une ligne ne contient pas le terme rouge, on laisse la ligne blanche ?

klin89

Bonsoir,
Klin89 bonsoir,

Le tableau se met à jour suite à des formules, donc vous devez lancer la macro pour mettre à jour ces couleurs ?
Je vous propose une solution par MFC où :
si = à "rouge" = rouge
s'il y a au moins un "rouge" à droite de la cellule testée et que celle-ci n'est pas égale à rouge alors vert

Le fichier :

3test-1-lrd.xlsm (28.32 Ko)

@ bientôt

LouReeD

bonjour @klin89
Merci pour votre réponse.
Je vous transmets mes précission en coleur "vert"

Pour chaque ligne, on colore en vert jusqu'à atteindre la cellule marquée comme rouge, passé cette cellule on laisse en blanc - Oui, c’est exactement cela.

Je vois que ton tableau est divisé en 5 parties : Cadre, Fab, Rec Mep et Dév, on n'en tient pas compte ? – Je dois bien tenir compte de cette division pour localiser et
marquer correctement la cellule rouge en relation avec la deuxième onglet, qui sera mis à jour chaque semaine

Edit : si une ligne ne contient pas le terme rouge, on laisse la ligne blanche ? – En général, toute la ligne contiendra le terme rouge, car toutes les
cellules vertes représentent des jalons déjà passés, et la cellule rouge indique l'état actuel.

En fait, je n'ai fait apparaître les lettres "vert" et "rouge" (dans une formule) que pour différencier les cellules et marquer où elles se situent, mais je voulais seulement que la cellule soit colorée

Merci encore pour votre temps et vos efforts.

bonne journée


Bonjour LouReeD!
c'est exactement ce que je voulais! merci beaucoup pour votre réponse!
Juste une dernière questions:
en cas je voudrais mets la première formule comme macro (ce qui cherche les valeurs de l'onglet "Jalons_tdb" vers le positionner dans le graphique "Tdb")
=SI(Jalons_tdb!$C2=Tdb!B$3;SI(Jalons_tdb!$D2="Cadre";"rouge";"vert");"vert");
=SI(Jalons_tdb!$C2=Tdb!G$3;SI(Jalons_tdb!$D2="Fab";"rouge";"vert");"vert"); =SI(Jalons_tdb!$C2=Tdb!L$3;SI(Jalons_tdb!$D2="Rec";"rouge";"vert");"vert") etc...

Serait-il possible d'utiliser la macro suivante?

Sub AppliquerFormulesEtMasquerTexte()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Tdb")

    ' Appliquer les formules et masquer le texte
    With ws
        ' Première plage de formules de B3 à F3
        .Range("B3:F3").Formula = "=IF(Jalons_tdb!$C2=Tdb!B$3, IF(Jalons_tdb!$D2=""Cadre"", ""rouge"", ""vert""), ""vert"")"
        .Range("B3:F3").Font.Color = .Range("B3:F3").Interior.Color

        ' Deuxième plage de formules de G3 à K3
        .Range("G3:K3").Formula = "=IF(Jalons_tdb!$C2=Tdb!G$3, IF(Jalons_tdb!$D2=""Fab"", ""rouge"", ""vert""), ""vert"")"
        .Range("G3:K3").Font.Color = .Range("G3:K3").Interior.Color

        ' Troisième plage de formules de L3 à N3
        .Range("L3:N3").Formula = "=IF(Jalons_tdb!$C2=Tdb!L$3, IF(Jalons_tdb!$D2=""Rec"", ""rouge"", ""vert""), ""vert"")"
        .Range("L3:N3").Font.Color = .Range("L3:N3").Interior.Color

        ' Quatrième plage de formules de O3 à P3
        .Range("O3:P3").Formula = "=IF(Jalons_tdb!$C2=Tdb!O$3, IF(Jalons_tdb!$D2=""Dév"", ""rouge"", ""vert""), ""vert"")"
        .Range("O3:P3").Font.Color = .Range("O3:P3").Interior.Color
    End With
End Sub

Merci encore pour votre réponse et vos temps

Bien cordialement.

Bonjour,

oups ! Là je ne comprend plus...

@ bientôt

LouReeD

Rechercher des sujets similaires à "macro vba suivi projets"