Macro mise en forme conditionnelle

Résolu
Bonjour,

Je bloque sur une macro VBA de mise en forme conditionnelle sur un fichier Excel 2007.

Je cherche en effet modifier le format de certaines cellules par ligne, à partir de la ligne 5 et pour les colonnes de A à I.
Le critère qui doit faire changer la couleur de ces cellules se trouve sur chaque ligne à partir de la ligne 5, et dans la colonne G. Il s'agit d'un élément texte issu d'une liste déroulante, qui peut être : Appel d'Offres, Etude de faisabilité, En cours, Perdu, Terminé.

Voici ma macro actuelle :

Private Sub FormatCondition()

Application.ScreenUpdating = False
For Each c In [G5:G135]
c.Select
Dim l As Long
l = ActiveCell.Row

If ActiveCell.Value = "Appel d'Offres" Then

Rows(4, "").Select
Selection.Font.ColorIndex = 45
Else
If ActiveCell.Value = "Etude de faisabilité" Then
If ActiveCell.Value = "En cours" Then
If ActiveCell.Value = "Perdu" Then
If ActiveCell.Value = "Terminé" Then
End If
End If

Application.ScreenUpdating = True
Range(G5:G135).Select

End Sub

Cela fait plusieurs années que je n'ai pas touché à VBA et j'avoue mes lacunes et je suis preneur de chacun de vos conseils.

Merci d'avance à tous.

5 réponses

  1. Contributeur
    Bonjour
    4 coUleurs ou 1 seule (45?) ?
    0
    1. Il me faut 4 couleurs différentes en effet :)
      0
  2. Contributeur
    Cela fait plusieurs années que je n'ai pas touché à VBA

    Réjouis toi,tu es parti pour une 2° jeunesse !

    Option Explicit
    '---------------
    Sub conditionner_format()
    Dim Lig As Byte, Etat As String

    Application.ScreenUpdating = False
    'nettoyage
    Range("G5:G135").Font.ColorIndex = -4142
    'affectation couleur
    For Lig = 5 To 135
    Etat = Cells(Lig, "G")
    Select Case Etat
    Case "Appel'd'offres"
    Cells(Lig, "G").Font.ColorIndex = 5
    Case "Etude de faisabilité"
    Cells(Lig, "G").Font.ColorIndex = 7
    'etc.....
    End Select
    Next
    End Sub


    a compléter et choisir les coluleurs

    Michel
    0
    1. Merci Michel pour cette réponse.
      En revanche, je ne souhaite pas colorer la colonne G mais les lignes à partir de la ligne 5 jusqu'à 135, sur les colonnes de A à I.

      Dans votre réponse, je ne comprends pas le "=-4142".

      Merci d'avance.
      0
    2. Contributeur
      @AnthonyCKExcuse moi j'avais mal interprété. je dois m'absenter et je regarderai au retour si OK

      en attendant pour les couleurs de cellule et non les caractères remplace partout "Font" par "interior"

      Range("G5:G135").Font.ColorIndex = -4142
      devient
      Range("G5:G135").interior.ColorIndex = -4142
      -4142 ---> aucun remplissage

      pour les colonnes A àI
      Case "Appel'd'offres"
      Range("A" & lig & ":I" & lig).Interior.ColorIndex = 3
      0
  3. Pas de problème, merci de l'aide déjà apportée :)

    Voilà où je suis désormais bloqué; Il semble que la couleur ne change pas lorsque le statut change...

    Private Sub ConditionnerFormat()

    Dim Lig As Byte, Etat As String

    Range("G5:G135").Interior.ColorIndex = -4142
    'affectation couleur
    For Lig = 5 To 135
    Etat = Cells(Lig, "G")
    Select Case Etat
    Case "Appel'd'offres"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
    Case "Etude de faisabilité"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
    Case "En cours"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 4
    Case "Perdu"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 3
    Case "Terminé"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 15

    End Select
    Next

    End Sub

    Ou ai-je faux ?

    Merci encore :)
    0
    1. Contributeur
      Bonjour

      Merci de mettre tes codes entres les balises "code" <> en haut et à droite du message

      pour ce que tu demandes il faut une macro événementielle à installer dans le module feuille concerné (feuil1 par ex)

      Option Explicit
      '--------
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim Lig As Byte, Etat As String

      If Not Intersect(Target, Range("G5:G135")) Is Nothing Then

      'le code....

      End If
      End Sub
      0
    2. Contributeur
      @michel_mERRAta

      Tu avais mis une boucle ce qui m'a mal aiguillé
      le code "à la volée"

      Option Explicit
      '-----------------------------------------------
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim Lig As Byte, Etat As String
      If Not Intersect(Target, Range("G5:G135")) Is Nothing Then
      '-----------------affectation couleur
      Etat = Target
      Lig = Target.Row
      Select Case Etat
      Case "Appel d'offres"
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
      Case "Etude de faisabilité"
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
      Case "En cours"
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 4
      Case "Perdu"
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 3
      Case "Terminé"
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 15
      Case Else
      Range("A" & Lig, "I" & Lig).Interior.ColorIndex = -4142
      End Select
      End If

      End Sub
      0
  4. Merci beaucoup pour ce support.

    La macro fonctionne (nouvelle macro en gras), en revanche j'ai un problème de rafraichissement des data au moment où la macro tourne, ce qui donne un code global :

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub

    If Target.Column = 1 And Target.Row > 3 Then
    If Target.Value = Empty Then
    Target.Offset(0, 4).Hyperlinks.Delete
    Else
    Set hy = Target.Offset(0, 4).Hyperlinks.Add(Target.Offset(0, 4), "", "'" & Me.Name & "'!" & Target.Offset(0, 4).Address)
    Target.Offset(0, 4).FormulaR1C1 = Target.Offset(-1, 4).FormulaR1C1
    Target.Offset(0, 4).Font.Name = "Wingdings"
    Target.Offset(0, 4).HorizontalAlignment = xlCenter
    Target.Offset(0, 4).BorderAround xlSolid, xlThin
    End If
    Exit Sub

    End If

    Dim Lig As Byte, Etat As String

    Application.ScreenUpdating = False

    Range("G5:G135").Interior.ColorIndex = -4142
    'affectation couleur
    For Lig = 5 To 135
    Etat = Cells(Lig, "G")
    Select Case Etat
    Case "Appel d'Offres"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
    Case "Etude de faisabilité"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 34
    Case "En cours"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 4
    Case "Perdu"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 3
    Case "Terminé"
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = 15
    Case Else
    Range("A" & Lig, "I" & Lig).Interior.ColorIndex = -4142

    End Select
    Next
    Application.ScreenUpdating = True
    End Sub


    Avant d'ajouter la macro pour la mise en forme conditionnelle, aucun problème de délai lorsque la macro tournait.

    Quelqu'un aurait-il une piste pour m'aider à réduire le temps perdu pour les utilisateurs de l'outil ? :)

    Aussi, vous remarquerez que je n'ai pas ajouté "Option Explicit" comme vous me l'aviez indiqué, car je ne comprends pas son intérêt.

    Merci d'avance.
    0
    1. Contributeur
      C'EST DU N'IMOPRTE QUOI !


      POURQUOI NE PAS EXPLIQUER LE PROBLEME EN ENTIER AU DEPART ?
      --

      je n'ai pas ajouté "Option Explicit" comme vous me l'aviez indiqué, car je ne comprends pas son intérêt.

      !!!!! ARCHI-NUL

      Essaies le macramé, ca ira peut-^tre mieux

      Michel
      0
      1. L'objectif était d'aller à l'essentiel dans la description de mon problème pour ne pas repousser les éventuels lecteurs de ce post.

        Merci de la réaction constructive, je vais essayer de me débrouiller quand même :)
        0