Macro de mise en forme conditionnelle Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
A
AnthonyCK
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 16 novembre 2015
Version d'Excel : 2007

Message par AnthonyCK » 16 novembre 2015, 10:44

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 :)
Modifié en dernier par AnthonyCK le 17 novembre 2015, 17:53, modifié 1 fois.
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 5'714
Appréciations reçues : 230
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Téléchargements : Mes applications
Contact :

Message par LouReeD » 16 novembre 2015, 22:52

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
Contributeur depuis peu ! 8-)
Quelques règles à lire ICI ;;)
_______________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
f
frangy
Passionné d'Excel
Passionné d'Excel
Messages : 4'342
Inscrit le : 19 novembre 2012
Version d'Excel : 2007 FR

Message par frangy » 16 novembre 2015, 23:18

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+
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 5'714
Appréciations reçues : 230
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Téléchargements : Mes applications
Contact :

Message par LouReeD » 17 novembre 2015, 06:03

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 !!! :mrgreen:
Ca m'apprendra à "lire" trop vite les posts !!!

@ bientôt

LouReeD
Contributeur depuis peu ! 8-)
Quelques règles à lire ICI ;;)
_______________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
A
AnthonyCK
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 16 novembre 2015
Version d'Excel : 2007

Message par AnthonyCK » 17 novembre 2015, 11:58

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.
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 5'714
Appréciations reçues : 230
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Téléchargements : Mes applications
Contact :

Message par LouReeD » 17 novembre 2015, 21:59

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
[surligner]Exit Sub[/surligner]

    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
Contributeur depuis peu ! 8-)
Quelques règles à lire ICI ;;)
_______________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
f
frangy
Passionné d'Excel
Passionné d'Excel
Messages : 4'342
Inscrit le : 19 novembre 2012
Version d'Excel : 2007 FR

Message par frangy » 18 novembre 2015, 06:36

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+
A
AnthonyCK
Nouveau venu
Nouveau venu
Messages : 3
Inscrit le : 16 novembre 2015
Version d'Excel : 2007

Message par AnthonyCK » 18 novembre 2015, 15:37

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.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message