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.