Microsoft 365 Comment donner des couleurs aux lignes d'une ListView excel VBA

TCHIS

XLDnaute Occasionnel
Bonsoir à toutes et tous

C'est encore moi qui reviens à la charge, les habitués savent sur quoi porte mon problème à savoir la avoir la mise en place d'un outil pour suivi de Gammes sur Excel.

Afin de me permettre de trouver une solution à mes difficultés plus efficacement j'ai bien appris de mes erreurs.

C'est pourquoi pour une première fois je viens avec un bout de code que j'ai tenté de mettre en place après avoir recherché dans le forum et sur Youtube des cas similaires à mon problème actuel.

Alors ce qu'il y a c'est que je tente d'appliquer une des couleurs aux lignes de ma ListView en fonction du Critère Validité quise trouve dans la 13colonnes de ma ListView1.

Ce que je souhaite c'est qu'en fonction de la valeur se trouvant dans cette colonne (Validité) toute ma ligne se colore c'est-à-dire, si:
la validité est V0 la ligne se met rouge entièrement
V1 pour Noir, (C'est la couleur par défaut )
V2 pour Orange,
V3 pour Bleu,
V4 pour Vert.

Le souci c'est que quand je tente de lancer la procédure il me ressort Erreur d'exécution 1004.

En pièce jointe vous avez une capture sur là où se situe mon problème.
Etant donner que ce code se situe dans une macro(Couleur_LV) je ne sais pas trop exactement ce que je dois faire je me dis que peut être tout n'est pas jeter à l'eau mais je suis ouvert aux différentes propositions que vous pourriez me soumettre.
En passant V0, V1, V2,V3 et V4 ont été défini comme Variant je ne sais pas si j'ai mal fait ou non.
Donc s'il vous plait pourriez vous y jeter un coup d'euil et m'aider à trouver soit une nouvelle solution parce que je ne suis pas sur que mon code soit exploitable en toute sincérité
VB:
Sub Couleur_LV() 'Macro permettant de donner une couleur distincte au ligne de ma ListView en fonction de la valeur se trouvant dans la colonne Validité (V0 pour Rouge, V1 pour Noir, V2 pour Orange, V3 pour Bleu, V4 pour Vert)
       Dim V0 As Variant
       Dim V1 As Variant
       Dim V2 As Variant
       Dim V3 As Variant
       Dim V4 As Variant
       dligne = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
       'On définit la zone(La plage) sur laquelle sera appliqué Moncritère
       C = Feuil1.Range("A1:U" & dligne).Value
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With
End Sub
Capture d’écran (200).png
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Etant donner que ce code se situe dans une macro(Couleur_LV) je ne sais pas trop exactement ce que je dois faire
Le code affiché en post #1 pour Couleur_LV n'a rien à avoir avec le code en PJ.
VB:
Sub Couleur_LV()
        Dim Colonne As Integer
        Dim ligne As Integer
        Dim x As Integer
    With USF
        Colonne = .ListView1.ColumnHeaders.Count
        ligne = .ListView1.ListItems.Count
            For i = 1 To ligne    
                        If .ListView1.ListItems(i).ListSubItems(13) = "V0" Then
                           .ListView1.ListItems(i).ForeColor = RGB(220, 6, 6)
                                For x = 1 To Colonne - 1
                                .ListView1.ListItems(i).ListSubItems(x).ForeColor = RGB(220, 6, 6)
                                Next
                        End If
            Next
    End With
End Sub
Sans fichier, difficile d'être catégorique,
Mais avec le fichier ce n'est guère mieux.
Cordialement.
 

TCHIS

XLDnaute Occasionnel
Le code affiché en post #1 pour Couleur_LV n'a rien à avoir avec le code en PJ.
VB:
Sub Couleur_LV()
        Dim Colonne As Integer
        Dim ligne As Integer
        Dim x As Integer
    With USF
        Colonne = .ListView1.ColumnHeaders.Count
        ligne = .ListView1.ListItems.Count
            For i = 1 To ligne   
                        If .ListView1.ListItems(i).ListSubItems(13) = "V0" Then
                           .ListView1.ListItems(i).ForeColor = RGB(220, 6, 6)
                                For x = 1 To Colonne - 1
                                .ListView1.ListItems(i).ListSubItems(x).ForeColor = RGB(220, 6, 6)
                                Next
                        End If
            Next
    End With
End Sub

Mais avec le fichier ce n'est guère mieux.
Cordialement.
Oui je me suis trompé de fichier à envoyer désolé
Toutefois en collant le code que tu me propose dans la macro bien qu'il n'est pas d'erreur il ne se passe rien du tout les lignes ne se colorent pas je veux dire
Un truc nous échappe tu penses ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Toutefois en collant le code que tu me propose dans la macro bien qu'il n'est pas d'erreur il ne se passe rien du tout les lignes ne se colorent pas je veux dire
Un truc nous échappe tu penses ?
Vous plaisantez ?
Le code que j'ai mis est le code de votre propre PJ pour le comparer avec le code du post #1. Vous ne reconnaissez pas votre propre code ?
Je ne l'ai jamais proposé comme solution !
 

TCHIS

XLDnaute Occasionnel
Vraiment j'ai testé bien solution mais rien ne passento_O
Mais si on reste sur le tout premier que je vous est transmis à savoir celui ci
VB:
Sub Couleur_LV() 'Macro permettant de donner une couleur distincte au ligne de ma ListView en fonction de la valeur se trouvant dans la colonne Validité (V0 pour Rouge, V1 pour Noir, V2 pour Orange, V3 pour Bleu, V4 pour Vert)
    Dim V0 As Variant
       Dim V1 As Variant
       Dim V2 As Variant
       Dim V3 As Variant
       Dim V4 As Variant
       dligne = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
       'On définit la zone(La plage) sur laquelle sera appliqué Moncritère
       C = Feuil1.Range("A1:U" & dligne).Value
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With
End Sub

Y a t'il moyen de faire quelque chose ?
Là j'ai mis le bon fichier avec le code sur lequel je souhaiterai que l'on descelle le problème
 

Pièces jointes

  • TCHIS.xlsm
    67.1 KB · Affichages: 33

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Si j'ai bien compris :
Tu définis au départ, une fois pour toute, que Moncritère est Cells(i,13).Value
Donc ensuite dans ta boucle For i, il te suffit d'utiliser Moncritère pour que cette variable contienne Cells(3,13).Value au premier tour, puis qu'elle contienne Cells(4,13).Value au deuxième tour, etc.

VB:
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With

Évidemment ce serait génial si on pouvait utiliser la variable Moncritère comme étant une sorte d'alias de Cells(i,13).value, mais ça ne marche pas comme ça en VBA sous Excel. :(

D'ailleurs je pense que ce n'est pas le seul truc qui pèche ici...
Il doit aussi y avoir le Case Is = V0 qui ne doit pas s'écrire comme ça à mon avis,
et aussi Couleur = vbRed qui en soit n'est pas faux mais ne sert à rien à part affecter une valeur à la variable Couleur.


[edit]
J'ai un peu regardé ta macro UserForm_Initialize : c'est n'importe quoi... :(
Exécute-la en pas-à-pas, regarde ce qu'il se passe, rien que pour l'instruction Me.F_Année = cel
tu vas halluciner ! :eek:
[/edit]
 
Dernière édition:

TCHIS

XLDnaute Occasionnel
Bonjour TooFatBoy
C'est super que t'es pris u temps pour jeter un coup d'euil à ma problématique j'apprécie.
Toutefois quand tu dis que ma macro UserForm_Initialize : c'est n'importe quoi... je ne vois pas du tout pourquoi car celle-ci s'exécute parfaitement sans bug ou quoi d'autres je veux dire par là qu'elle marche correctement .
Bref pour ce qui nous amène à savoir la mise en couleur des lignes de ma ListView je dois donc retenir que cette macro nommée Couleur_LV n'est pas exploitable et qu'il n' y a rien à faire avec ?

Bonjour,

Si j'ai bien compris :
Tu définis au départ, une fois pour toute, que Moncritère est Cells(i,13).Value
Donc ensuite dans ta boucle For i, il te suffit d'utiliser Moncritère pour que cette variable contienne Cells(3,13).Value au premier tour, puis qu'elle contienne Cells(4,13).Value au deuxième tour, etc.

VB:
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With

Évidemment ce serait génial si on pouvait utiliser la variable Moncritère comme étant une sorte d'alias de Cells(i,13).value, mais ça ne marche pas comme ça en VBA sous Excel. :(

D'ailleurs je pense que ce n'est pas le seul truc qui pèche ici...
Il doit aussi y avoir le Case Is = V0 qui ne doit pas s'écrire comme ça à mon avis,
et aussi Couleur = vbRed qui en soit n'est pas faux mais ne sert à rien à part affecter une valeur à la variable Couleur.


[edit]
J'ai un peu regardé ta macro UserForm_Initialize : c'est n'importe quoi... :(
Exécute-la en pas-à-pas, regarde ce qu'il se passe, rien que pour l'instruction Me.F_Année = cel
tu vas halluciner ! :eek:
[/edit]
 

TooFatBoy

XLDnaute Barbatruc
Toutefois quand tu dis que ma macro UserForm_Initialize : c'est n'importe quoi... je ne vois pas du tout pourquoi car celle-ci s'exécute parfaitement sans bug ou quoi d'autres je veux dire par là qu'elle marche correctement .
Exécute-la en pas-à-pas, regarde ce qu'il se passe, rien que pour l'instruction Me.F_Année = cel
tu vas halluciner ! :eek:
 

TooFatBoy

XLDnaute Barbatruc
pour ce qui nous amène à savoir la mise en couleur des lignes de ma ListView je dois donc retenir que cette macro nommée Couleur_LV n'est pas exploitable et qu'il n' y a rien à faire avec ?
J'ai réussi, en la modifiant légèrement, à changer la couleur du texte en fonction du niveau de validation, mais je suppose que c'est la couleur du fond que tu veux modifier.

Et là, ce n'est pas faisable simplement. C'est un travail pour le gars de Toulon qui adore bidouiller et faire faire à Excel des choses qu'il n'est pas censé faire.
 

TCHIS

XLDnaute Occasionnel
J'ai réussi, en la modifiant légèrement, à changer la couleur du texte en fonction du niveau de validation, mais je suppose que c'est la couleur du fond que tu veux modifier.
Au début c'était effectivement la couleur de fond que je souhaitais modifier mais je me dis aussi si c'est le fond qui est modifié on aura trop de couleurs et en terme de visibilité ça ne sera pas pro.

Donc je pense que c'est le ForeColor au lieu du BackColor qui doit être modifier en fonction de la validité tu vois ?
Bien sur après on peut toujours voir qu'est ce qui présente mieux soit le BackColor ou Forecolor
Si tu as déjà au moins une solution pourrais me l'apprendre s'il te plait ?
 

TooFatBoy

XLDnaute Barbatruc
Pour modifier la couleur du texte, j'ai donc légèrement modifié ta macro
VB:
Sub Couleur_LV() 'Macro permettant de donner une couleur distincte au ligne de ma ListView en fonction de la valeur se trouvant dans la colonne Validité (V0 pour Rouge, V1 pour Noir, V2 pour Orange, V3 pour Bleu, V4 pour Vert)
    Dim V0 As Variant
       Dim V1 As Variant
       Dim V2 As Variant
       Dim V3 As Variant
       Dim V4 As Variant
       dligne = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
       'On définit la zone(La plage) sur laquelle sera appliqué Moncritère
       C = Feuil1.Range("A1:U" & dligne).Value
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With


End Sub

et elle est devenue ceci :
VB:
Sub Couleur_LV()
' Macro permettant de donner une couleur distincte aux lignex de ma ListView en fonction de la valeur se trouvant dans la colonne Validité
' rouge pour "V0", noir pour "V1", orange pour "V2", bleu pour "V3", vert pour "V4"
Dim LigEnCours As Long, j As Long

    With USF.ListView1
        .BackColor = RGB(191, 191, 191)
        For LigEnCours = 1 To .ListItems.Count
            Select Case .ListItems(LigEnCours).ListSubItems(12).Text
                Case "V0"
                    Couleur = vbRed
                Case "V1"
                    Couleur = vbBlack
                Case "V2"
                    Couleur = vbYellow
                Case "V3"
                    Couleur = vbBlue
                Case "V4"
                    Couleur = vbGreen
            End Select
            .ListItems(LigEnCours).ForeColor = Couleur
            For j = 1 To .ColumnHeaders.Count - 1
                .ListItems(LigEnCours).ListSubItems(j).ForeColor = Couleur
            Next j
        Next LigEnCours
    End With

End Sub
 

TCHIS

XLDnaute Occasionnel
D
Pour modifier la couleur du texte, j'ai donc légèrement modifié ta macro
VB:
Sub Couleur_LV() 'Macro permettant de donner une couleur distincte au ligne de ma ListView en fonction de la valeur se trouvant dans la colonne Validité (V0 pour Rouge, V1 pour Noir, V2 pour Orange, V3 pour Bleu, V4 pour Vert)
    Dim V0 As Variant
       Dim V1 As Variant
       Dim V2 As Variant
       Dim V3 As Variant
       Dim V4 As Variant
       dligne = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
       'On définit la zone(La plage) sur laquelle sera appliqué Moncritère
       C = Feuil1.Range("A1:U" & dligne).Value
       'On définit à quoi correspond Moncritère
       MonCritère = Cells(i, 13).Value
       With USF.ListView1
        For i = 3 To UBound(C)
            Select Case MonCritère
                   Case Is = V0
                   Couleur = vbRed
            End Select
        Next i
       End With


End Sub

et elle est devenue ceci :
VB:
Sub Couleur_LV()
' Macro permettant de donner une couleur distincte aux lignex de ma ListView en fonction de la valeur se trouvant dans la colonne Validité
' rouge pour "V0", noir pour "V1", orange pour "V2", bleu pour "V3", vert pour "V4"
Dim LigEnCours As Long, j As Long

    With USF.ListView1
        .BackColor = RGB(191, 191, 191)
        For LigEnCours = 1 To .ListItems.Count
            Select Case .ListItems(LigEnCours).ListSubItems(12).Text
                Case "V0"
                    Couleur = vbRed
                Case "V1"
                    Couleur = vbBlack
                Case "V2"
                    Couleur = vbYellow
                Case "V3"
                    Couleur = vbBlue
                Case "V4"
                    Couleur = vbGreen
            End Select
            .ListItems(LigEnCours).ForeColor = Couleur
            For j = 1 To .ColumnHeaders.Count - 1
                .ListItems(LigEnCours).ListSubItems(j).ForeColor = Couleur
            Next j
        Next LigEnCours
    End With

End Sub
D'accord je vois ça tout de suite .
Et pour ce qui concerne l'instruction Me.F_Année = cel
c'est pour qu'il ne me présente pas de doublon car quand je la retire la combobox pour les années se trouvant dans le Frame Filtre présente tous les contenus de la colonne année et donc avec des données répétitives (Des doublons) alors que lorsque cette instruction est maintenu on a pas de doublon.
Tu vois un peu son utilité ?
Ou bien encore une fois c'est moi qui n'ai pas su m'y prendre pour voir tu veux en venir
 

Discussions similaires

Réponses
49
Affichages
1 K

Statistiques des forums

Discussions
315 090
Messages
2 116 104
Membres
112 661
dernier inscrit
ceucri