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 :
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 SubSi vous savez d'où peut venir l'erreur, je suis preneur.
Merci à vous ! :)
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 WithOn 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 jBonjour,
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 SubBonjour
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
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)
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 SubAlors 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.
Résultat :
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)
Le code plante quand je le lance :
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 SubCordialement
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.