Macro de mise en forme conditionnelle

Bonjour à tous,

Je rencontre actuellement une lacune dans mes connaissances Excel-VBA (2007), c'est pour cela que je viens solliciter votre aide aujourd'hui.

Je m'explique :

Le fichier Excel permet de suivre des dossiers dans le temps.

Je souhaite faire une mise en forme de certaines cellules d'une ligne en fonction du statut de ce dossier, déterminé par un critère texte (du type : "En cours", "Terminé").

Je suis bloqué à ce stade :

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

J'ai forcément raté une étape...

Merci par avance pour votre aide et vos conseils.

Bonne journée

Bonsoir,

en VBA il y a le "texte" et les variables.

Dans Range("A3:B7"), entre guillemet c'est "du texte" si on peut dire.

Pour intégrer une variable dans du texte il faut comme vous le faites utiliser "&".

Mais il faut garder "l'orthographe" du texte d'origine...

Donc pour moi, sans regarder plus loin, il y a une erreur dans ceci :

Range("A" & Lig, "I" & Lig)

je mettrais plutôt :

Range("A" & Lig &":I" & Lig & "")

mais les deux derniers guillemets ne servent à rien donc :

Range("A" & Lig &":I" & Lig)

@ bientôt

LouReeD

Bonjour,

Ta procédure ne semble pas présenter d'anomalie particulière.

Dans quel module l'as-tu placée ?

Comment fais-tu pour la lancer ?

A+

Bonjour,

Oups, pardon, j'étais parti sur une mise en forme d'une ligne complète... Hors là vous demandez la mise en forme de la colonne A et colonne I de la ligne Lig, donc c'est bien une virgule !!!

Ca m'apprendra à "lire" trop vite les posts !!!

@ bientôt

LouReeD

Merci beaucoup pour ce support.

La macro fonctionne (nouvelle macro à partir de "Dim Lig As Byte, Etat As String")), en revanche j'ai un problème de rafraichissement des data au moment où la macro complète 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.

J'ai ajouté l'application screenupdating mais ça n'a pas l'air de changer beaucoup.

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

Merci d'avance.

Bonsoir,

si la macro de mise en forme est lancée lorsque les cellules de la colonne A sont modifiées alors il y a un exit sub de trop...

    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

Si elle doit être traitée quelque soit la cellule modifiée, alors je ne vois pas pourquoi elle ne marche pas...

@ bientôt

LouReeD

Bonjour,

La procédure évènementielle Worksheet.Change est lancée à chaque fois qu'une cellule quelconque de la feuille est modifiée.

Pour éviter que le traitement associé soit effectué quelle que soit la cellule modifiée, il faut définir une plage d'applicabilité.

C'est ce que tu fais dans la première partie du code avec l'instruction

If Target.Column = 1 And Target.Row > 3 Then ...

Cette disposition n'étant pas reprise dans la deuxième partie, la mise en forme des 131 cellules de la colonne G est systématiquement réalisée à chaque modification d'une cellule de la feuille.

A+

Merci pour ces réponses constructives qui vont m'aider à boucler ma macro.

Merci à tous d'avoir contribué à la résolution de mon problème.

Bonne après midi.

Rechercher des sujets similaires à "macro mise forme conditionnelle"