Couleur de fond selon résultat plusieurs MEFC

Tony44 -  
 Tony44 -
Bonjour,

je cherche à gérer le fond d'une cellule excel de manière automatique.

Voici ma problèmatique :
- j'ai une ligne dont plusieurs colonnes sont renseignées avec des MFEC. Ces MFEC changent le fond des cellules concernées, les conditions sont différentes selon les colonnes.

- sur chaque ligne, j'ai une cellule bilan qui doit me donner le statut général
si au moins une cellule de la ligne a un fond rouge, alors le fond de la cellule bilan est rouge
sinon si au moins une cellule de la ligne a un fond orange, alors le fond de la cellule bilan est orange
sinon le fond de la cellule bilan est vert.

Je cale sur la mise en place de cette macro étant donné mon niveau en VBA.

Merci d'avance
Anthony
Configuration: Windows XP / Internet Explorer 6.0

3 réponses

  1. Gord21 Messages postés 928 Statut Membre 289
     
    Bonsoir,
    Voici une possibilité :
    Sub Colorer()
    '
    ' Déclaration des variables
    '--------------------------
    Dim coul_Vert, coul_Orange, coul_Rouge
    Dim Plage_donnees As Range
    Dim Plage_bilan As Range
    Dim offset_ligne As Long
    Dim offset_colonne As Long
    Dim Est_orange As Boolean
    Dim Est_rouge As Boolean
    '
    ' Initialisation des variables
    '-----------------------------
    coul_Vert = 10
    coul_Orange = 46
    coul_Rouge = 3
    Set Plage_donnees = ActiveSheet.Range("A1:G10")
    Set Plage_bilan = ActiveSheet.Range("H1:H10")
    '
    ' Analyse
    '--------
    For offset_ligne = 0 To Plage_donnees.Rows.Count - 1
       Est_orange = False
       Est_rouge = False
       For offset_colonne = 0 To Plage_donnees.Columns.Count - 1
          Select Case Range(Plage_donnees.Cells(1).Address).Offset(offset_ligne, offset_colonne).Interior.ColorIndex
          Case coul_Rouge
             Est_rouge = True
          Case coul_Orange
             Est_orange = True
          Case Else
          End Select
       Next offset_colonne
       If Est_rouge Then
          With Range(Plage_bilan.Cells(1).Address).Offset(offset_ligne, 0).Interior
             .ColorIndex = coul_Rouge
             .Pattern = xlSolid
          End With
       ElseIf Est_orange Then
          With Range(Plage_bilan.Cells(1).Address).Offset(offset_ligne, 0).Interior
             .ColorIndex = coul_Orange
             .Pattern = xlSolid
          End With
       Else
          With Range(Plage_bilan.Cells(1).Address).Offset(offset_ligne, 0).Interior
             .ColorIndex = coul_Vert
             .Pattern = xlSolid
          End With
       End If
    Next offset_ligne
    '
    End Sub


    Pense à adapter les valeurs dans la partie initialisation.
    Je n'ai pas mis en place de test pour vérifier qu'il y a bien le même nombre de lignes dans les données et dans la colonne bilan, et je considère que ces deux plages commencent à la même ligne.

    N'hésite pas si tu as un soucis.
    0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    Pour compléter la réponse de gord21 j'ajouterais que sa macro travaille sur des fonds mis manuellement ou par macro mais pas sur une couleur mise par MFC.
    Récupérer une couleur mise par MFC est relativement complexe (voir ici l'excellente fonction proposée lermite222 qui a eu le courage de s'y attaquer)
    C'est sûrement plus simple, si c'est possible, que toutes tes cellules soient mises en couleur par macro (puisque tu es parti pour en mettre au moins une) et que tu utilises la proposition de gord.
    Ou sinon modifie sa proposition en utilisant la fonction proposée.

    eric
    0
    1. Gord21 Messages postés 928 Statut Membre 289
       
      Salut,
      Merci Eric, je pensais que la propriété utilisée était la même que le fond soit mis manuellement ou par MFC.
      Désolé pour ma proposition qui n'est donc pas vraiment adaptée.
      @+
      0
  3. Tony44
     
    Je vous remercie pour vos réponses.

    Vu la matière à dispo, je pense que cela devrait suffire à mon bonheur :-)

    Je teste cela dans la journée.
    0