ListView - Utilisation

Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010 - 22 sept. 2010 à 11:24
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010 - 23 sept. 2010 à 23:31
Bonjour, je voudrais savoir comment utiliser la fonction "ListView" pour les UserFOrm.

Je désire afficher un tableau d'une feuille Excel dans un UserFOrm1 à l'aide de l'outil "ListView"

Une fois mon tableau affiché dans le Userform, je souhaiterais pouvoir modifier / supprimer les lignes désirées.
Pour cela j'ai créé un bouton "Modif/Suppr" qui amène vers un autre UserFOrm2. Ce UserFOrm2 dresse, dans des textbox, les libellés modifiables.

Comment afficher la ListView dans la UserFOrm1 ?
Comment faire le lien des textbox avec la sélection de la ListView ?
Comment dans la UserForm2, une fois la touiche "Valider Modi", aller réécrire les modifications dans la ligne adéquate ?

Merci d'avance !!

15 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 13:20
Salut

"Comment afficher la ListView dans la UserFOrm1 ?"
Une fois qu'il est dessiné sur ta forme, il est visible.
Quel est ton problème ?

"Comment faire le lien des textbox avec la sélection de la ListView ?"
C'est à ton programme de l'écrire, genre :
UserForm2.maTextBox1.Text =  maListView1.ListView1.ListItems(2).Text
UserForm2.maTextBox2.Text = maListView1.ListView1.ListItems(2).SubItems(1)
A toi de définir le n° de l'item sélectionné et de lister les SubItems présents

" Comment dans la UserForm2, une fois la touiche "Valider Modi", aller réécrire les modifications dans la ligne adéquate ? "
Par la méthode inverse :
maListView1.ListView1.ListItems(2).Text  = UserForm2.maTextBox1.Text
maListView1.ListView1.ListItems(2).SubItems(1) = UserForm2.maTextBox2.Text

Pour cela, il faut savoir charger les formes proprement et comprendre comment cela fonctionne :
Pour charger ta UserForm2 :
    Dim frmParam As UserForm2
    Load frmParams
    With frmParams
        .maTextBox1.Text = ListView1.ListItems...
        .maTextBox2.Text = ListView1.ListItems...
        ' Affiche et attend que la forme soit rendue "Hide"
        .Show
        ' La forme est Hide : on mémorise
        ListView1.ListItems... = .maTextBox1.Text
        ListView1.ListItems... = .maTextBox2.Text
    End With
    Unload frmParams

Dans la UserForm2, dans le code du bouton de validation :
Me.Hide
Cela suffit à rendre la main à la procédure appelante ET surtout, conserver les composants et leurs valeurs jusqu'au UnLoad

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
22 sept. 2010 à 16:29
Merci c'est super sympa Jack de ta réponse rapide !!

Mon 1er problème n'est pas d'afficher ma ListView. J'arrive sans soucis à la placer dans mon UserFOrm.
Mais je voudrais que cette ListView charge de données contenu dans une feuille Excel. (9 colonnes et 2000 lignes).

C'est en fait un tableau de pièces que je souhaite modifier via un UserForm. Donc je veux lister ces pièces dans une ListView.
(et en fait c'est pas aussi simple qu'un "RowSource d'une listbox !! lol)

A très vite Jack
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 sept. 2010 à 17:27
Donc la question, c'est "comment remplir une ListView à partir des données d'une feuille ?"
D'où l'intérêt de bien expliquer les problèmes


J'avais 15 minutes à tuer :
Pour faire l'essai :
- ouvre un nouveau classeur
- dans les cellules A1 à D30 (*), ajoute des données à afficher
(*) ou ce que tu veux à condition de bien déclarer le même Range dans
La première ligne sera le nom des colonnes.
- insère une nouvelle UserForm
- ajoutes-y une ListView (ListView1)
- recopie ce code dans la page de code de la forme
et appuie sur F5 puis clique sur le fond de la forme
Option Explicit

Private Sub UserForm_Click()
    Call FillListView(Range("A1:D30"))
End Sub

Private Sub FillListView(SourceRange As Range)
    Dim lvItem      As ListItem
    Dim NbSubItems  As Long
    Dim r           As Long
    Dim t           As Long
    ' Nombre de SubItem (derrière l'item principal)
    NbSubItems = SourceRange.Columns.Count - 1  ' SubItem 1 sera colonne 2
    With ListView1
        .View = lvwReport
        .LabelEdit = lvwManual
        .FullRowSelect = True
        .ListItems.Clear
        If .ColumnHeaders.Count < NbSubItems Then
            For r = .ColumnHeaders.Count To NbSubItems
                ' On suppose que la 1ère ligne = titre
                .ColumnHeaders.Add , , SourceRange.Cells(1, r + 1).Value
            Next r
        End If
        For r = 2 To SourceRange.Rows.Count
            ' Item = 1ère colonne
            Set lvItem = .ListItems.Add(, , SourceRange.Cells(r, 1).Value)
            ' Colonnes suivantes = SubItems 1 à x
            For t = 1 To NbSubItems
                lvItem.SubItems(t) = SourceRange.Cells(r, 1 + t).Value
            Next t
        Next r
    End With
End Sub
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
22 sept. 2010 à 23:32
Excellent Jack !
Un grand merci pour ça !

J'ai testé dans un nouveau classeur..cela ne fonctionne pas.
Mais dans mon classeur existant :

J'ai juste modifié la plage de cellules et activer la bonne feuille.
Par contre, il me met une erreur dès que je veux déplacer les colonnes dans la listview. Et il n'y a pas de Barre de défilement pour aller voir mes 2500 ligne... (paramètrage ??).

PS : Une petite chose... j'ai mis "3000" dans ma plage. Mais c'est un tableau qui sera amené à avoir de nouvelles lignes. Y a t-il un moyen de pas lui spécifier la dernier ligne et qu'il la trouve tout seul ?

Sinon, merci !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 sept. 2010 à 08:50
"J'ai testé dans un nouveau classeur..cela ne fonctionne pas"
Quelle erreur, quel problème ?

"il me met une erreur dès que je veux déplacer les colonnes dans la listview"
Quelle erreur, quel problème ?
Déplacer ???

"pas de Barre de défilement"
Si, elles sont automatiques
Es-tu sûr de parler d'une ListView de type OCX qui serait le fichier MSCOMCTL.OCX ou COMCTL32.OCX ?

"3000" n'est pas une plage valide.
Si tu dois définir une plage de cellules allant de la ligne 1 à la dernière ligne de données, c'est à dire la dernière ligne des données, il te suffit d'enregistrer une macro pendant que, à la main :
- tu te places sur la première ligne
- tu appuies sur Shift+Control+Flèche_bas
et ta zone sera sélectionnée.
Regarde ensuite le code généré et tu sauras quoi mettre.
Ça ressemble à
Set monRange = Range("A1:C1").End(xlDown)
ou dans ce genre là.
Une fois que tu auras défini un range correct, fournis le à la sub :
Call FillListView(monRange)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 09:17
Salut Jack ! The ListView Killer !!

Pour la barre de défilement oubli. Je viens de recrée mon UserForm depuis le départ. J'avais tellement touché à l'autre que je préfère pas savoir ce que j'ai fais ! lol.
Ma nouvelle ListView est toute belle ! (Merci, merci, merci)

Je n'ai plus d'erreur lors que je veux déplacer les colonnes non plus ! J'ai mis "AllowCOlumnReoder" sur TRUE est ça fonctionne.

Je vais tenter ton "End(xlDown)" pour que la plage trouve toute seule la dernière ligne.

Il me reste à présent à avoir la possibilité de modifier / supprimer des lignes de ma liste.
Pour supprimer j'ai trouvé ça sur le net :
"Listview1.ListItems.Remove Listview1.SelectedItem.Index"
J'ai pas encore essayer...

mais si tu sais comment on peut faire... je te lirais avec joie !
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 09:56
Bon pour le Range automatique, la macro m'a écrit quelque chose.
J'ai créé 2 variables (colonne et ligne) pour le placer dans Range.

Dim L As Integer
Dim C As Integer

L = Range(Selection, Selection.End(xlDown)).Select
C = Range(Selection, Selection.End(xlToRight)).Select

Call FillListView(Range("A1:I3000"))


Comment remplacer "A1:I3000" par mes variables L et C ??
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 10:41
Je n'arive pas à aller chercher toutes les colonnes d'un ligne que je sélectionne dans la listview.

mon code donne ça :
Modif_Article.Code_Article.Text = ListView1.ListItems(ListView1.SelectedItem).ListSubItems(ListView1.SelectedItem).Text

"Modif_Article" est le nom de ma Userform qui comprend des textbox pour chaque colonne.
"Code_Article" est le nom de ma 1ere textbox

Mon code ne marche pas...une idée ?
Merci encore
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 sept. 2010 à 13:54
ListView1.SelectedItem, comme son nom l'indique, renvoie un Item.
--> ListView1.SelectedItem.Index.Index
Pour alléger le code, je te conseille de mémoriser cet Index dans une variable, exemple lIndex, pour l'utiliser ensuite dans
ListView1.ListItems(lIndex).ListSubItems(1).Text
lIndex désigne l'index de l'Item dans la liste
Le second index dont tu as besoin, c'est celui du SubItem de cet Item.
Le premier SubItem , SubItem 1 commence à la colonne 2 (la colonne 1 étant représentée par l'Item lui même).

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 14:19
Si j'ai bien compris :
-Items représente le numéro de ligne,
-SubItems représente le numéro de colonne ?
(pour que je sois sur de TOUT comprendre^^)

Donc ton "lIndex" il faut que je fasse un "Dim lIndex as Integer" avant ?

et alors j'aurais : ListView1.SelectedItem.Index.Index = lIndex ?


Thanks a lot !
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 16:06
J'ai réussis à transférer la ligne en surbrillance de la listview vers des textbox d'une userform !!!!

' pour la 1ere cellule
Userform1.Textbox1.Value = ListView1.SelectedItem.Text
'pour la 2ieme cellule de droite
Userform1.Textbox2.Value = ListView1.SelectedItem.SubItems(1)
etc......

J'avance à grand pas !! Merci Jack pour tout ce que tu as déjà fait !

Il ne reste plus qu'a trouver comment modifier ou supprimer la ligne en surbrillance... je pense que ce n'est plus dans la ListView qu'il faut faire ça...

PS : As tu du nouveau pour la "Range" qui irait chercher la dernière ligne ?
Il ne manque plus que ça pour me combler de bonheur dans ce sujet
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 16:18
Autre question concernant la ListView...

J'ai créé un bouton pour ajouter de nouvelles lignes dans la feuille lue par la listview.

Comment je peux faire pour "actualiser" la listview avec la nouvelle ligne crée de la feuille ? (sinon je suis obligé de fermer puis rouvrir la userform...)

Merci merci ! :)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 sept. 2010 à 18:17
Il faut lire
ListView1.SelectedItem.Index
et pas
ListView1.SelectedItem.Index.Index
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 sept. 2010 à 19:42
"As tu du nouveau pour la "Range" qui irait chercher la dernière ligne ? "
Tu es grand : tu sais te servir de l'enregistreur de macro en faisant un Maj-Ctrl-Fleèche_bas

"Comment je peux faire pour "actualiser" la listview"
Tu lui fais un .Clear et tu recommences la lecture complète
0
Golumyrinity Messages postés 18 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 23:31
Merci Jack !

Pour le "Range" j'avais essayer avec l'enregistreur de macro mais... j'arrivais pas à interpréter le resultat pour le mettre dans un "Range(X:Y)"

(J'ai trop de mal avec la définition de variable pour mémoriser un nombre de lignes, de colonne etc... )

Pour le ".Clear" il me suffit juste de placer "ListView1.Clear" et ensuite "Load UserForm" ??

Sinon c'est super excellent ce que tu as fait pour moi !
Je termine ce post sur le ".Clear" et je te laisse tranquille promis !
0
Rejoignez-nous