Remplissage Listview, galère et hasard..

Calvus

XLDnaute Barbatruc
Bonjour le forum,

J'ai un fichier avec un Userform comprenant une Listview, fonctionnant correctement. J'avoue que je ne comprends pas tout à fait ce code, du moins ses subtilités, mais par tâtonnement, j'ai réussi à obtenir le résultat souhaité.

J'ai donc créé un autre Userform, avec Listview sur lequel j'ai repris le 1er code. (Strictement identique mis à part le nombre de colonnes)
Je n'arrive à initialiser que 4 colonnes sur 5 voulues, et je suis obligé (comme dans le 1er code) d'ajouter une colonne dans la feuille Excel pour obtenir les clés. (colonne U )

La feuille comprend le tableau que je souhaite reproduire sur ma Listview, avec les entêtes.

Par ailleurs, j'ai un problème de format pour les colonnes 2 et 4.
La colonne 5 ne s'affiche pas du tout.

Merci de l'aide que vous m'apporterez.
 

Pièces jointes

  • Listview.xlsm
    17.8 KB · Affichages: 37

Calvus

XLDnaute Barbatruc
Bonjour phlaurent55,

Je te remercie.

Alors, 2 remarques.
J'ai vu que tu as simplement ajouté cette ligne :
Code:
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , tablo(l, 1)

Or j'obtenais le même résultat avant non ?
Peux tu donc m'expliquer l’intérêt de ceci ?

En revanche, j'ai tout de même copié l'intégralité de ton code dans mon Userform original, et ça plante si je supprime les données en colonne U !
Exactement comme avant donc. Sur ton fichier aucun problème. Incompréhensible !
As tu une idée d'où cela provient ?

Dernière chose, comment éviter l'affichage de 6 colonnes dans la listview alors que je n'en veux que 5 ?

Merci
 

Calvus

XLDnaute Barbatruc
Bonjour Si :),

Ton code ne fonctionne pas si aucune donnée n'est inscrite en ligne 5.
Par ailleurs, il y a toujours colonnes affichées.
Peux tu m'expliquer, ou Phlaurent comment le remplissage est censé se faire, afin que j'essaie de corriger le problème ?

Merci
 

Si...

XLDnaute Barbatruc
re

Je t’ai gardé Tb = [V5].CurrentRegion qui est, pour moi, sujet à caution.
J’aurais dû te proposer l’outil Tableau !

Si la liste s’arrête prématurément c’est à cause de cellules vides !
Pour la procèdure :

upload_2017-2-8_20-18-18.png

C'est toujours délicat de répondre à partir d'un exemple qui reflète mal l'original ! o_O
 

Bebere

XLDnaute Barbatruc
bonsoir
Pourquoi pas comme ce code
Code:
Private Sub UserForm_Initialize()
    Dim L As Long, Tb
    Tb = [V5].CurrentRegion
    ListView1.ListItems.Clear
    With ListView1.ColumnHeaders
        .Clear
        .Add , , [V4].Value, 100
        .Add , , [W4].Value, 80, 2
        .Add , , [X4].Value, 50, 2
        .Add , , [Y4].Value, 50, 2
        .Add , , [Z4].Value, 80, 2
        .Add , , "clé", 0 'mise à 0 pour la cacher
    End With
    With ListView1
        .Width = 370    'somme des largeurs de colonne + 10
        For L = 2 To UBound(Tb)
            .ListItems.Add , "V" & L + 3, Tb(L, 1)
            .ListItems(.ListItems.Count).ListSubItems.Add , "W" & L + 3, Format(Tb(L, 2), "dd/mm/yyyy")
            .ListItems(.ListItems.Count).ListSubItems.Add , "X" & L + 3, Format(Tb(L, 3), "hh:mm")
            .ListItems(.ListItems.Count).ListSubItems.Add , "Y" & L + 3, Format(Tb(L, 4), "hh:mm")
            .ListItems(.ListItems.Count).ListSubItems.Add , "Z" & L + 3, Tb(L, 5)
            .ListItems(.ListItems.Count).ListSubItems.Add , "V" & L + 3, "clé " & L - 1
        Next
        .View = 3: .Gridlines = 1: .FullRowSelect = 1
    End With
    MsgBox ListView1.ListItems(1).Key & "=" & ListView1.ListItems(1).Text & " , " & ListView1.ListItems(1).ListSubItems(4).Key & "=" & ListView1.ListItems(1).ListSubItems(4).Text
End Sub
 

Calvus

XLDnaute Barbatruc
Re, bonsoir Bebere,

@Philippe, en effet, la ligne Z4 également. Mais j'avais fait la modif tout seul avant de voir ta réponse, je n'avais donc pas remarqué cette différence.
Du coup, je n'avais pas vu la différence.
Mais ça fonctionne, comme je te le disais plus haut. Merci donc.

MAIS : Voici maintenant le code modifié dans le fichier exemple que j'ai envoyé.
VB:
Private Sub UserForm_Initialize()

Dim l As Integer
    Dim tablo As Variant
  
    ListView1.ListItems.Clear
  
    With ListView1.ColumnHeaders
        .Clear
        .Add , , Sheets("Rdv").Range("U4").Value, 0
        .Add , , Sheets("Rdv").Range("V4").Value, 100, lvwColumnCenter
        .Add , , Sheets("Rdv").Range("W4").Value, 80, lvwColumnCenter
        .Add , , Sheets("Rdv").Range("X4").Value, 50, lvwColumnCenter
        .Add , , Sheets("Rdv").Range("Y4").Value, 50, lvwColumnCenter
        .Add , , Sheets("Rdv").Range("Z4").Value, 108, lvwColumnCenter
    End With
  
    tablo = Sheets("Rdv").Range("v4").CurrentRegion
      
    For l = 2 To UBound(tablo, 1)
        ListView1.ListItems.Add , tablo(l, 1), tablo(l, 1)
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , tablo(l, 1)
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , tablo(l, 2)
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , Format(tablo(l, 3), "dd/mm/yyyy")
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , Format(tablo(l, 4), "hh:mm")
        ListView1.ListItems(ListView1.ListItems.Count).ListSubItems.Add , , Format(tablo(l, 5), "hh:mm")
    Next l
    ListView1.View = lvwReport
    ListView1.Gridlines = True
    ListView1.FullRowSelect = True
    ListView1.ListItems(1).Selected = True

End Sub

Le même code dans mon fichier original qui a exactement le même structure, puisque je m'en suis servi pour faire mon exemple, ne fonctionne pas si la colonne U est vide !
La seule différence de ce fichier est qu'il contient d'autres feuilles et Userforms, et un tableau allant de A3 à P32 dans la feuille Rdv.
Si je laisse d1, d2, etc.. en colonne U, aucun problème. Si j'efface les données, j'obtiens irrémédiablement l'erreur 30603, clé non valide. !
Bizarre non ?

@Si; merci de tes explications, qui ne m'ont pas avancé dans le sens que c'est ce que j'avais compris, et que je ne m'explique donc toujours pas ce que je viens de faire remarquer à Philippe.

@Bebere, merci. Ton code fonctionne lui, même après suppression des données en colonne U.
J'imagine que c'est grâce à cette ligne : .ListItems.Add , "V" & L + 3, Tb(L, 1)

Dernier point, aucun de vous ne m'a dit comment supprimer la 6ème colonne inutile de la listview.

En tout cas, merci de votre aide.

A+
 
Dernière édition:

Calvus

XLDnaute Barbatruc
Re,
"t'en veux ou t'en veux pas ?"
Non je n'en veux pas. Je souhaite seulement les colonnes V à Z.

vide une ligne de la plage et dis-moi ce que tu auras dans ta liste !
Oui, ça s'arrête à la dernière ligne non vide. Ça je le sais, je connais CurrentRegion. Ce qui pose problème, c'est si la ligne 5 est vide, c'es là que ça plante. Et forcément elle peut être vide, car ce usf servira à remplir ce petit tableau justement, en ayant un oeil dessus.
 

Discussions similaires

Réponses
22
Affichages
691