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
    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
  2. 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. 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
    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. Contributeur
      Bonjour
      4 coUleurs ou 1 seule (45?) ?
      0
      1. Il me faut 4 couleurs différentes en effet :)
        0