Affichage Listview et interraction

Bonjour,

Je viens vous demander de l'aide concernant l'affichage d'information d'une feuille excel en listview et pouvoir intéragir avec celle-ci.

J'ai suivi ce tutoriel sur youtube (je ne peux pas mettre de lien) : comment utiliser le Contrôle listView

Mais il ne fonctionne pas sur mon fichier de gestion de stock de Pneus.

Mon fichier est joint.

Je souhaite créer une listview qui afficherais les demandes de pneus des clients et selon si la demande est en cours, nouvelle et terminée, affiche la ligne en couleur.

Après cela je souhaite aussi intéragir, c'est à dire sélectionner une ligne et modifier pour passer de "nouvelle demande" à "en cours" ou "terminé" mais ça sera après..

Mon problème c'est qu'avec mon code, j'ai une erreur :

image

C'est quand je clique sur "voir les nouvelles demandes".

voici le code :

'Procédure d'initialisation de la boite de dialogue
Private Sub UserForm_Initialize()
    With AffichageDemande
        .Gridlines = True 'Affiche les lignes
        .View = lvwReport 'Style d'affichage
        .FullRowSelect = True 'Selectionner une ligne possible avec colorisation
        'Création d'entête personnalisée
        .ColumnHeaders.Add Text:="Etat", Width:=1
        .ColumnHeaders.Add Text:="Date", Width:=50
        .ColumnHeaders.Add Text:="Nom", Width:=50
        .ColumnHeaders.Add Text:="ID", Width:=50
        .ColumnHeaders.Add Text:="CA", Width:=50
        .ColumnHeaders.Add Text:="Immat", Width:=50
        .ColumnHeaders.Add Text:="Chassis", Width:=50
        .ColumnHeaders.Add Text:="Lieu", Width:=50
        .ColumnHeaders.Add Text:="Marque", Width:=50
        .ColumnHeaders.Add Text:="Type", Width:=50
        .ColumnHeaders.Add Text:="Taille", Width:=50
        .ColumnHeaders.Add Text:="Charge", Width:=50
        .ColumnHeaders.Add Text:="Vitesse", Width:=50
        .ColumnHeaders.Add Text:="Saison", Width:=50
        .ColumnHeaders.Add Text:="Qté", Width:=50
    End With
    Call Actualisation
End Sub

Private Sub Actualisation()

    Dim Item As ListItems
    Dim DR As Integer
    Dim i As Integer
    Dim color As Variant
    Dim Critere As Variant
    Dim ws_demandes As Worksheet

    Set ws_demandes = Worksheets("DEMANDES")

    AffichageDemande.ListItems.Clear
    DR = ws_demandes.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To DR
        Critere = ws_demandes.Cells(i, 1)

        Select Case Critere
            Case Is = 0
                color = &HFF00&
            Case Is = 1
                color = &H80FF&
            Case Is = 2
                color = &HFF00&
        End Select

            Set Item = AffichageDemande.ListItems.Add(Text:=ws_demandes.Cells(i, 1))

                Item.SubItems(1) = ws_demandes.Cells(i, 2)
                Item.ListSubItems(1).ForeColor = color
                Item.SubItems(2) = ws_demandes.Cells(i, 3)
                Item.ListSubItems(2).ForeColor = color
                Item.SubItems(3) = ws_demandes.Cells(i, 4)
                Item.ListSubItems(3).ForeColor = color
                Item.SubItems(4) = ws_demandes.Cells(i, 5)
                Item.ListSubItems(4).ForeColor = color
                Item.SubItems(5) = ws_demandes.Cells(i, 6)
                Item.ListSubItems(5).ForeColor = color
                Item.SubItems(6) = ws_demandes.Cells(i, 7)
                Item.ListSubItems(6).ForeColor = color
                Item.SubItems(7) = ws_demandes.Cells(i, 8)
                Item.ListSubItems(7).ForeColor = color
                Item.SubItems(8) = ws_demandes.Cells(i, 9)
                Item.ListSubItems(8).ForeColor = color
                Item.SubItems(9) = ws_demandes.Cells(i, 10)
                Item.ListSubItems(9).ForeColor = color
                Item.SubItems(10) = ws_demandes.Cells(i, 11)
                Item.ListSubItems(10).ForeColor = color
                Item.SubItems(11) = ws_demandes.Cells(i, 12)
                Item.ListSubItems(11).ForeColor = color
                Item.SubItems(12) = ws_demandes.Cells(i, 13)
                Item.ListSubItems(12).ForeColor = color
                Item.SubItems(13) = ws_demandes.Cells(i, 14)
                Item.ListSubItems(13).ForeColor = color
                Item.SubItems(14) = ws_demandes.Cells(i, 15)
                Item.ListSubItems(14).ForeColor = color
    Next i

End Sub

Si vous savez d'où peut venir l'erreur, je suis preneur.

Merci à vous ! :)

35pneu.xlsm (135.16 Ko)

BOnjour

Dans votre code Actualisation, juste entre le END SELECT et NEXT i, remplacez vos lignes de code par celles-ci

With Me.AffichageDemande
    .ListItems.Add , , ws_demandes.Cells(i, 1)
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 2)
    .ListItems(i - 1).ListSubItems(1).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 3)
    .ListItems(i - 1).ListSubItems(2).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 4)
    .ListItems(i - 1).ListSubItems(3).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 5)
    .ListItems(i - 1).ListSubItems(4).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 6)
    .ListItems(i - 1).ListSubItems(5).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 7)
    .ListItems(i - 1).ListSubItems(6).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 8)
    .ListItems(i - 1).ListSubItems(7).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 9)
    .ListItems(i - 1).ListSubItems(8).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 10)
    .ListItems(i - 1).ListSubItems(9).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 11)
    .ListItems(i - 1).ListSubItems(10).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 12)
    .ListItems(i - 1).ListSubItems(11).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 13)
    .ListItems(i - 1).ListSubItems(12).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 14)
    .ListItems(i - 1).ListSubItems(13).ForeColor = color
    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 15)
    .ListItems(i - 1).ListSubItems(14).ForeColor = color
End With

On pourrait certainement réduire le nombre de lignes mais testez déjà comme cela

Cordialement

Si ok....

Edit : avec code réduit et variable à déclarer --> Dim J as byte

        For j = 1 To 15
            With Me.AffichageDemande
                .ListItems.Add , , ws_demandes.Cells(i, 1)
                .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, j + 1)
                .ListItems(i - 1).ListSubItems(j).ForeColor = color
            End With
        Next j

Bonjour,

désolé de la réponse tardive. C'est parfait, la première proposition fonctionne (mais pas la deuxième, tempis).

J'ai juste une autre question :

Dans ma ListView, je voudrais afficher seulement les lignes où, la première colonne est égale à 1 ou 2.

Donc dans mon select case, Si Critere = 0, je continue la boucle for avec i = 3, jusqu'à que Critere = 1 ou 2.

Avez-vous une idée ? (Autrement dit, je n'affiche que les demandes en cours ou nouvelle demande (d'après les commentaires de mon Select Case)).

Private Sub Actualisation()

    Dim Item As ListItems
    Dim DR As Integer
    Dim i As Integer
    Dim color As Variant
    Dim Critere As Variant
    Dim ws_demandes As Worksheet

    Set ws_demandes = Worksheets("DEMANDES")

    AffichageDemande.ListItems.Clear
    DR = ws_demandes.Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To DR
        Critere = ws_demandes.Cells(i, 1)

            Select Case Critere
                Case Is = 0 'Demande soldée
                    color = &HFF00&
                Case Is = 1 'Demande en commande au fournisseur
                    color = &HFF0000
                Case Is = 2 'Nouvelle demande
                    color = &HFF&
            End Select
                With Me.AffichageDemande
                    .ListItems.Add , , ws_demandes.Cells(i, 1)
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 2)
                    .ListItems(i - 1).ListSubItems(1).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 3)
                    .ListItems(i - 1).ListSubItems(2).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 4)
                    .ListItems(i - 1).ListSubItems(3).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 5)
                    .ListItems(i - 1).ListSubItems(4).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 6)
                    .ListItems(i - 1).ListSubItems(5).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 7)
                    .ListItems(i - 1).ListSubItems(6).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 8)
                    .ListItems(i - 1).ListSubItems(7).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 9)
                    .ListItems(i - 1).ListSubItems(8).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 10)
                    .ListItems(i - 1).ListSubItems(9).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 11)
                    .ListItems(i - 1).ListSubItems(10).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 12)
                    .ListItems(i - 1).ListSubItems(11).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 13)
                    .ListItems(i - 1).ListSubItems(12).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 14)
                    .ListItems(i - 1).ListSubItems(13).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 15)
                    .ListItems(i - 1).ListSubItems(14).ForeColor = color
                End With
    Next i
End Sub

Bonjour

C'est parfait, la première proposition fonctionne (mais pas la deuxième, tempis).

Si la deuxième fonctionne très bien. testée sur votre fichier
Qu'est-ce qui n'est pas bon ?

Donc dans mon select case, Si Critere = 0, je continue la boucle for avec i = 3, jusqu'à que Critere = 1 ou 2.

Quelle boucle I= 3 ?

Dans mon code, dans la boucle FOR, la première valeur de I = 2. Du coup la prochaine valeur que prend I c'est 3.

Regarde la 3eme lignes. J'ai précisé.

For i = 2 To DR
        Critere = ws_demandes.Cells(i, 1)
        (exemple) If Critere = 0 Then (retourner à la boucle for pour tester la ligne ci-dessus jusqu'à ce que Critere = 1 ou 2 et dans ce cas, continuer le programme ci-dessous)
            Select Case Critere
                Case Is = 0 'Demande soldée
                    color = &HFF00&
                Case Is = 1 'Demande en commande au fournisseur
                    color = &HFF0000
                Case Is = 2 'Nouvelle demande
                    color = &HFF&
            End Select
                With Me.AffichageDemande
                    .ListItems.Add , , ws_demandes.Cells(i, 1)
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 2)
                    .ListItems(i - 1).ListSubItems(1).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 3)
                    .ListItems(i - 1).ListSubItems(2).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 4)
                    .ListItems(i - 1).ListSubItems(3).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 5)
                    .ListItems(i - 1).ListSubItems(4).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 6)
                    .ListItems(i - 1).ListSubItems(5).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 7)
                    .ListItems(i - 1).ListSubItems(6).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 8)
                    .ListItems(i - 1).ListSubItems(7).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 9)
                    .ListItems(i - 1).ListSubItems(8).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 10)
                    .ListItems(i - 1).ListSubItems(9).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 11)
                    .ListItems(i - 1).ListSubItems(10).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 12)
                    .ListItems(i - 1).ListSubItems(11).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 13)
                    .ListItems(i - 1).ListSubItems(12).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 14)
                    .ListItems(i - 1).ListSubItems(13).ForeColor = color
                    .ListItems(i - 1).ListSubItems.Add , , ws_demandes.Cells(i, 15)
                    .ListItems(i - 1).ListSubItems(14).ForeColor = color
                End With
    Next i
image

Ma boucle for regarde la valeur de la première colonne et "Critere" prend la valeur de cette cellule et je veux afficher dans mon ListView, uniquement les lignes où la valeur est = 1 ou 2. (dans mon context, j'affiche uniquement les demande en cours ou nouvelle demande)

31pneu.xlsm (138.86 Ko)

essayez ceci

Private Sub Actualisation()
Dim DR As Integer
Dim i As Integer, k As Integer
Dim j As Byte
Dim color As Variant
Dim Critere As Variant
Dim ws_demandes As Worksheet

Set ws_demandes = Worksheets("DEMANDES")

AffichageDemande.ListItems.Clear
DR = ws_demandes.Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To DR
    Critere = ws_demandes.Cells(i, 1)
    If Critere > 0 Then
        Select Case Critere
            Case Is = 1
                color = &H80FF&
            Case Is = 2
                color = &HFF00&
        End Select

        k = i - 1

        With AffichageDemande
            .ListItems.Add , , ws_demandes.Cells(i, 1)
            For j = 1 To 15
                .ListItems(k - 1).ListSubItems.Add , , ws_demandes.Cells(k, j + 1)
                .ListItems(k - 1).ListSubItems(j).ForeColor = color
            Next j
        End With
    End If
Next i
End Sub

Alors génial ça fonctionne à un détail près :

mon listview m'affiche bien que plus 3 lignes, mais ce sont les 3 premières. Hors, la première est une "commande soldée" (dans mon contexte).

Je veux afficher seulement les lignes où la valeur de la colonne A est > 0.

image

Résultat :

image

Il n'affiche pas le 0 dans la première colonne mais affiche quand même la ligne. En somme, il aurait dû m'afficher les 3 dernières lignes et non les 3 premières.

Autre problème que je viens de voir : si j'ajoute 2 lignes comme ceci : (Avec un 0 entre deux lignes)

image

Le code plante quand je le lance :

image

On dirait qu'il n'aime pas avoir un 0 entre 2 lignes ...

Il n'affiche pas le 0 dans la première colonne mais affiche quand même la ligne. En somme, il aurait dû m'afficher les 3 dernières lignes et non les 3 premières.

Ok désolé je n'avais pas vu.
remplacez votre code par celui-ci

Private Sub Actualisation()
Dim DR As Integer
Dim i As Integer, k As Integer
Dim j As Byte
Dim color As Variant, Critere As Variant
Dim ws_demandes As Worksheet

Set ws_demandes = Worksheets("DEMANDES")

AffichageDemande.ListItems.Clear
DR = ws_demandes.Cells(Rows.Count, "A").End(xlUp).Row

k = 1
For i = 2 To DR
    Critere = ws_demandes.Cells(i, 1)
    If Critere > 0 Then
        Select Case Critere
            Case Is = 1
                color = &H80FF&
            Case Is = 2
                color = &HFF00&
        End Select

        With AffichageDemande
            .ListItems.Add , , ws_demandes.Cells(i, 1)

            For j = 1 To 15
                .ListItems(k).ListSubItems.Add , , ws_demandes.Cells(i, j + 1)
                .ListItems(k).ListSubItems(j).ForeColor = color
            Next j
        End With
      k = k + 1
    End If

Next i
End Sub

Cordialement

Génial merci beaucoup ça fonctionne !!!! :D :D

Je vais tester le code sous plusieurs contextes mais ça me semble réglé ;) vous m'enlevez une épine.

Rechercher des sujets similaires à "affichage listview interraction"