Pb de remplissage de listview
Bonjour à tous,
J'ai un soucis avec le remplissage d'une listview.
En fonction de ma feuille pour chaque titre je souhaite récupérer la liste si c'est mangas je récupère les trois noms si je veux tous les voir je vois tous etc.
donc j'ai fait un formulaire avec des boutons et ma listview
je pensais écrire une fonction remplir listview mais sa ne fonctionne pas comme je le pensais.
je remplis mais par ligne et non par colonne
merci de votre lecture
Bonsoir,
Hum... Il est couramment admis dans cette communauté que tout le code qui concerne le UserForm va dans le module du UserForm.
Bon c'est pas le bagne non plus... On fait comme on aime. Hein ! Il y a quelques exceptions... Mébon : Quand on vient demander de l'aide on s'efforce d'adopter des pratiques pas trop zarbi !
A+
Merci de ta réponse aussi nulle qu'il soit.le pire c'est que tu as déjà réalisé ce genre de problème je suis en train de regarder ton message 21 avril 2016
tu penses réellement que je n'ai pas vu ce topic
il n'explique en rien la généralisation d'une listview qui se remplie automatiquement sur une plage donnée et par cellule nommé
si tu veux ma feuille datatable comme son nom l'indique est une bd qui se modifie. je passe par des boutons pour l'utilisateur puisse choisir le domaine qu'il souhaite modifier
je pense que je trouverai la solution et je posterai pour les autres
Pour le moment je suis arrivé à faire plus au moins tourner la chôse.
je vous montre ma fonction remplir listView:
Function Remplir(ByVal name As String)
'les variable i pour parcourir chaque ligne, j parcours les colonnes
'k permet de bouger l'indice sur la colonne suivante pour récupérer les entêtes
'nblg permet de connaître la dernière ligne
'cpt compte le nombre de fois id
' nbcol comme son nom l'indique on récupère le nombre de colone connue
'X position id en fonction du nom
Dim X As Integer
Dim i As Integer, j As Integer, k As Integer, NbLg As Integer, cpt As Integer, NbCol As Integer, MaxCol As Integer
Select Case name
Case Is = "MANGAS"
X = 0
MaxCol = 2
Case Is = "POLICIER"
X = 2
MaxCol = 2
Case Is = "BD "
X = 4
MaxCol = 3
Case Is = " FILM"
X = 7
MaxCol = 4
Case Is = " ANIME"
X = 11
MaxCol = 4
End Select
NbLg = ThisWorkbook.Sheets("Datatable").Cells(2, X + 1).CurrentRegion.End(xlDown).Row
NbCol = ThisWorkbook.Sheets("Datatable").Range("A1").SpecialCells(xlCellTypeLastCell).Column
If name <> "" Then
If ThisWorkbook.Sheets("Datatable").Cells(1, X + 1).Value Like name Then
For i = 1 To NbLg
' MsgBox ThisWorkbook.Sheets("Datatable").Cells(i, X + 1).Value
j = 0
With UserForm1.ListView1
With .ColumnHeaders
For k = 1 To MaxCol
If Cells(2, X + k) = "id" Or Cells(2, X + k) <> "" Then
If cpt < 2 Then
cpt = cpt + 1
.Add , , Cells(2, i).Value, 80
End If
End If
Next k
End With
j = j + 1
.ListItems.Add , , Cells(i, X + 1)
.ListItems(j).ListSubItems.Add , , Cells(i, X + j)
.View = lvwReport
End With
Next i
End If
End If
End Functionpour le moment je dois corriger ma boucle, sachant que je récupère le nombre de ligne et le nombre de colonne.
sachant que mes tables (mangas policer bd film et anime) sont fixés sur les cellules. Je peux tricher en mettant le nombre de colonne
à partir des données, à chaque fois que je clique sur un boutons faut qu'il m'affiche la liste qu'il comporte.
Bonjour à tous ,
pour ceux qui m'ont lus:
après quelques recherches fructueuses j'ai vu qu'un autre topic traité la même chose, du 21 avril 2016 :galopin(j'exploite le fichier sabercha_VG4.xlsm)
sa fait presque ce que je souhaite .
dans l'userf j'initialiase la listView et sur le clic du bouton je remplis .
mais je suis pas encore ....
Merci de votre lecture
Bonjour à tous,
Je souhaite avoir un formulaire qui me donne le choix sur les différents tables que j'ai sur mon DataTable:
Donc, j'ai choisi le mode boutons et listView, qui permet de limiter les action de l'utilisateur pas trop de choix que de cliquer sur un des boutons pour avoir le "tableau "(=listview)
pourquoi listview? il me permet de sélectionner modifier/ajouter/supprimer/cocher une ou plusieurs ligne de la liste.
1)initialisation du formulaire je veux juste mes boutons et une liste vide,
2) Au clic sur un des boutons, j'affiche la liste.
3)modifier/ajouter/supprimer/cocher une ou plusieurs ligne de la liste(donc incrémenter décrémenter ma plage de donnée )
4) avoir un visuel de DataTable.
Donc pour remédier à c'est plusieurs étapes, je me suis dit on part de ListView et le généraliser pour qu'il puisse s'autoinitialiser en fonction du clic.
Une fonction remplir listView me semble la solution.
Ainsi je peux faire appel la fonction sur l'événement du clic.
Voilà je me demande comment généraliser mes listviews.
Déjà les mettre en paramètre et affecter les valeurs en fonction du choix du clic.
Si je fais l'algo en mode Français:
fonction RemplirListViewX(nom)
var PosLg,PosCl,Index,Derlg,X type numérique
selection du choix nom
choix est "bouton1"
X=0
PosLg =2
PosCl = 1
choix est "bouton"
X=1
PosLg =2
PosCl = 1
choix est "buton1"
X=2
PosLg =2
PosCl = 1
choix est "buton"
X=3
PosLg =2
PosCl = 1
choix est "button1"
X=4
PosLg =2
PosCl = 1
Fin Selection
Derlg = Cellules(lg,cl).CurrentRegion.End(xlDown).Row
Dans Formulaire.ListeVue
.Nettoyer
si X = 0 alors
.listeEntêtte.Ajout,,"Id",30
.listeEntêtte.Ajout,,"Nom",50
sinon si X= 1 alors
.listeEntêtte.Ajout,,"Id",30
.listeEntêtte.Ajout,,"Nom",50
sinon si X= 2 alors
.listeEntêtte.Ajout,,"Id",30
.listeEntêtte.Ajout,,"Nom",50
.listeEntêtte.Ajout,,"HS",50
sinon si X= 3 alors
.listeEntêtte.Ajout,,"Id",30
.listeEntêtte.Ajout,,"Nom",50
.listeEntêtte.Ajout,,"Réalisateur",50
.listeEntêtte.Ajout,,"Comédien",50
sinon si X= 4 alors
.listeEntêtte.Ajout,,"Id",30
.listeEntêtte.Ajout,,"Nom",50
.listeEntêtte.Ajout,,"genre",50
.listeEntêtte.Ajout,,"épisode",50
fin si
Pour index = 1 to Derlg
.ListeItem.Ajout,,feuilleEnCours.Cellules(index+2,1)
.ListeItem.SousItems.Ajout,, feuilleEnCours.Cellules(index+,2)
Fin Pour
Fin Dans
Fin FonctionSi j'ai bien compris à me corriger initialisation de la listview:
public sub InitialisationListView(ByVal name As String)
Dim ch As ColumnHeader
Dim lngRow As Long
Dim ListItem As MSComctlLib.ListItem
Dim Derlg As Integer
Dim feuilleEnCours As Worksheet
Derlg = ThisWorkbook.Sheets("Datatable").Cells(2, X + 1).CurrentRegion.End(xlDown).Row - 1
MaxCol = ThisWorkbook.Sheets("Datatable").Range("A1").SpecialCells(xlCellTypeLastCell).Column
Set feuilleEnCours= ThisWorkbook.Sheets("Datatable")
Select Case name
Case Is = "MANGAS"
X = 0
Case Is = "POLICIER"
X = 2
Case Is = "BD "
X = 4
Case Is = " FILM"
X = 7
Case Is = " ANIME"
X = 11
End Select
With UserForm1.ListView1
With .ColumnHeaders
.Clear
If X = 0 Then
.Add , , "id", 50
.Add , , "nom", 80
End If
If X = 2 Then
.Add , , "id", 50
.Add , , "nom", 80
End If
If X = 4 Then
.Add , , "id", 50
.Add , , "nom", 80
.Add , , "gs", 50
End If
If X = 7 Then
.Add , , "id", 50
.Add , , "nom", 80
.Add , , "réalisateur", 50
.Add , , "comédien", 80
End If
If X = 11 Then
.Add , , "id", 50
.Add , , "nom", 80
.Add , , "genre", 50
.Add , , "épisode", 80
End If
With UserForm1.ListView1
.Lis.Clear
'.CheckBoxes = True
For lngRow = 1 to Derlg
Set Lis = .ListItems.Add(, , feuilleEnCours.Cells(lngRow + 2, X + 1)
ListItem.SubItems(1) = feuilleEnCours.Cells(lngRow + 2, X + 2)
Next lngRow
End With
End SubMais sa me retourne pas ce que je souhaite donc il y a un truc que je n'ai pas compris.
Si c'est impossible d'initialiser les listView en fonction des noms de mes boutons alors le faire en dure?
Surtout que le nom de mes boutons est aussi le nom de ma plage de donnée comme le lien https://legrandchamanexcel.wordpress.com/tag/listview/ et le sujet du 21 avril 2016 par sabercha https://forum.excel-pratique.com/post443833.html?hilit=listview#p443833qui est la même chose que moi .dans ce topic avec une feuille une référence nom on peut généraliser les listView sur différents plage de données. c'est ce que je souhaitai faire .
Comme je l'ai dit il y a un truc que je n'ai pas pris en compte celui qui sait merci de me le dire ce que c'est que je corrige de suite .
Sinon je ferai en dure c'est à dire référencer les entêtes de ma listview et situer où c'est dommage que je ne peux pas automatiser ceci avec une boucle pour sachant que je connais le nombre itération en cherchant max ligne et max colonne, ou une boucle tant que vu qu'on a une référence nom, on sait la plage de donnée donc on pouvait charger la listView.
Mais je continuerai à chercher en me basant sur le formulaire sabercha et legranchaman
Re à tous ,
En regardant de plus près et de ma feuille Datatable ce la fonctionne donc:
ce que j'ai modifié sur la feuille:
dans l'ongle formule définir nom je l'ai mis sur la cellule id soit A2.
'Exemple 1 : Comment alimenter un Listview
' -- Identification des variables
Dim ws As Worksheet
Dim rg As Range
Dim i As Integer
Dim j As Integer
' -- Initialisation des variables
Set ws = ThisWorkbook.Sheets("Datatable") 'Nom de l'onglet contenant nos données
Set rg = ws.Range("mangas") 'Notre cellule de référence de notre tableau
' -- Construction du tableau
With UserForm1.ListView1 'Nous travaillons avec notre Listview "lvPieces" dans notre userform
' -- Ajout des colonnes
For i = 1 To 2 '2 colonnes à ajouter
'Ajouter une colonne en spécifiant le nom de l'entête seulement, largeur par défaut
'les titres sont sur la même ligne que notre référence (rg)
.ColumnHeaders.Add , , rg.Offset(0, i - 1)
Next i
' -- Ajouter les éléments de la 1re colonne
For i = 1 To 3
'Ajouter un élément en spécifiant la valeur seulement
'les éléments sont dans la même colonne que notre référence (rg)
.ListItems.Add , , rg.Offset(i, 0)
Next i
' -- Ajouter les sous-éléments
For i = 1 To 3 'Nous bouclons sur les 3 éléments (lignes)
For j = 1 To 2 'Nous bouclons sur les 2 colonnes
'Ajouter un sous-élément en spéciant la valeur seulement
.ListItems(i).ListSubItems.Add , , rg.Offset(i, j)
Next j
Next i
' -- Spécifier l'affichage du Listview en mode "Détails"
.View = lvwReport
End With
'IniListview (InitTableau)
End Subj'obtiens ce que je veux à l'initialisation de mon formulaire et non au clic du bouton.
je reviens pour améliorer ce code
Re à tous,
après coup j'ai fait ceci pour une fonction initier mais voilà j'ai un soucis ubound:
Public Sub InitializeListView(ByVal name As String, ByVal PosCl As Integer, ByVal DerCl As Integer, ByVal DerLg As Integer)
' -- Identification des variables
Dim ws As Worksheet
Dim rg As Range
Dim i As Integer
Dim j As Integer
' -- Initialisation des variables
Set ws = ThisWorkbook.Sheets("Datatable") 'Nom de l'onglet contenant nos données
Set rg = ws.Range(name) 'Notre cellule de référence de notre tableau
' -- Construction du tableau
With UserForm1.ListView1 'Nous travaillons avec notre Listview dans notre userform
' -- Ajout des colonnes
For i = 1 To DerCl - PosCl + 1 ' colonnes à ajouter
'Ajouter une colonne en spécifiant le nom de l'entête seulement, largeur par défaut
'les titres sont sur la même ligne que notre référence (rg)
.ColumnHeaders.Add , , rg.Offset(0, i - 1)
Next i
' -- Ajouter les éléments de la 1re colonne
For i = 1 To DerCl - PosCl + 1
'Ajouter un élément en spécifiant la valeur seulement
'les éléments sont dans la même colonne que notre référence (rg)
.ListItems.Add , , rg.Offset(i, 0)
Next i
' -- Ajouter les sous-éléments
For i = 1 To DerLg 'Nous bouclons sur les éléments (lignes)
For j = 1 To DerCl - PosCl + 1 'Nous bouclons sur les colonnes
'Ajouter un sous-élément en spéciant la valeur seulement
.ListItems(i).ListSubItems.Add , , rg.Offset(i, j)
Next j
Next i
' -- Spécifier l'affichage du Listview en mode "Détails"
.View = lvwReport
End Withje dois corriger car ma dernière valeurs dépasse !!!
Bonjour
J'ais jouer avec a toi de voir si ça te va
A+
Maurice
bonjour Archer,
Merci de ce travail c'est ce que j'ai fait au final, dans chaque bouton_click
Dim i As Integer, j As Integer, cpt As Integer
Dim DerLgn As Integer
Dim ws As Worksheet
Dim rg As Range
Dim Derlg As Integer
ListView1.Visible = True
Form_UserForm1.ListView1.ColumnHeaders.Clear
Form_UserForm1.ListView1.ListItems.Clear
Derlg = nombreElementDansUnTableau("Datasheet", 4, 1)
MaxCol = ThisWorkbook.Sheets("Datasheet").Range("A1").SpecialCells(xlCellTypeLastCell).Column
'initialisatgion des variables
Set ws = ThisWorkbook.Sheets("Datasheet") ' nom de la feuille de nos données
Set rg = ws.Range("tc") ' notre cellule de référence de notre datatable
With UserForm1.ListView1 'Nous travaillons avec notre Listview dans notre userform
' -- Ajout des colonnes
For i = 1 To 2 '7 colonnes à ajouter
'Ajouter une colonne en spécifiant le nom de l'entête seulement, largeur par défaut
'les titres sont sur la même ligne que notre référence (rg)
' .ColumnHeaders.Clear
.ColumnHeaders.add , , rg.Offset(0, i - 1)
Next i
' -- Ajouter les éléments de la 1re colonne
For i = 1 To Derlg
'Ajouter un élément en spécifiant la valeur seulement
'les éléments sont dans la même colonne que notre référence (rg)
.ListItems.add , , rg.Offset(i, 0)
Next i
' -- Ajouter les sous-éléments
For i = 1 To Derlg 'Nous bouclons sur les 5 éléments (lignes)
For j = 1 To 3 'Nous bouclons sur les 6 colonnes
'Ajouter un sous-élément en spéciant la valeur seulement
.ListItems(i).ListSubItems.add , , rg.Offset(i, j)
Next j
Next i
' -- Spécifier l'affichage du Listview en mode "Détails"
.View = lvwReport
.Gridlines = True 'affichage d'un quadrillage
.FullRowSelect = True 'Sélection des lignes comlètes
.CheckBoxes = True
End Withje viens de jeter un œil sur ta fonction il manque la prise en compte de la dernière la ligne et de la cellule de référence j'ai saisi comment on paramètre une listview pour la généraliser selon sur les entités auxquels je dois travailler.
encore merci de m'avoir lue et trouver deux solutions ton travail me permettra de poursuivre mon projet surtout le deuxième formulaire excellent, j'étais en train de le faire ce que tu as fait
merci de m'avoir avancer mon travail
bonjour Maurice et aux excelleur(se),
Merci de ce nouveau formulaire,
j'ai vu la fonction
Dim Ctrl As Control
Dim D As Long 'colonne de début
Dim F As Long 'colonne de fin
Dim Sh As Object 'sheet = =datatable
dim Lig as long ' ligne de départ
Private Sub InitList(D, F)
Dim L As Long
With ListView1.ColumnHeaders
.Clear 'Supprime les anciens entêtes
'Ajout des colonnes
.Add , , Num, 0
For C = D To F
.Add , , Sh.Cells(2, C), 60 ' ici ajoute des entêtes des colonnes
Next
End With
With ListView1
.ListItems.Clear
For L = 3 To Sh.Cells(Rows.Count, D).End(xlUp).Row ' boucle parcours les lignes
.ListItems.Add , , L 'ajout du champ de la ligne
For C = D To F ' boucle parcours les colonnes
.ListItems(.ListItems.Count).ListSubItems.Add , , Sh.Cells(L, C) ' ajout le champs de la colonne sur la ligne
Next
Next
.ListItems(1).Selected = False'pas de selection sur la première ligne
End With
Set ListView1.SelectedItem = Nothing
For C = 1 To 4
Controls("Label" & C).Visible = False
Controls("TextBox" & C).Visible = False
Next
End Subje l'ai rendu ainsi avec la référence nom pour être toujours positionné sur la cellule id
Option Explicit
Dim Ctrl As Control
Dim D As Long 'colonne de début
Dim F As Long 'colonne de fin
Dim Sh As Object 'sheet = =datatable
Dim Lig As Long ' ligne de départ
Dim Derlg As Long ' dernière ligne
Dim Nom As String
Dim rg As Range
Dim i As Integer, j As Integer
Private Sub InitList(D, F, Nom)
Sh=Feuil1
ListView1.ColumnHeaders.Clear ' on efface les entête
ListView1.ListItems.Clear ' on efface le contenue
Lig = 4 ' lig de départ
Derlg = Sh.Cells(Rows.Count, D).End(xlUp).Row
'initiialisatgion des variables
Set rg = Sh.Range(Nom) ' notre cellule de référence de notre datatable
With U_Liste1.ListView1 'Nous travaillons avec notre Listview dans notre userform
' -- Ajout des colonnes
For i = 1 To F - D + 1 ' colonnes à ajouter
'Ajouter une colonne en spécifiant le nom de l'entête seulement, largeur par défaut
'les titres sont sur la même ligne que notre référence (rg)
' .ColumnHeaders.Clear
.ColumnHeaders.Add , , rg.Offset(0, i - 1)
Next i
' -- Ajouter les éléments de la 1re colonne
For i = 1 To Derlg
'Ajouter un élément en spécifiant la valeur seulement
'les éléments sont dans la même colonne que notre référence (rg)
.ListItems.Add , , rg.Offset(i, 0)
Next i
' -- Ajouter les sous-éléments
For i = 1 To Derlg 'Nous bouclons sur les éléments (lignes)
For j = 1 To F - D 'Nous bouclons sur les colonnes
'Ajouter un sous-élément en spéciant la valeur seulement
.ListItems(i).ListSubItems.Add , , rg.Offset(i, j)
Next j
Next i
' -- Spécifier l'affichage du Listview en mode "Détails"
.View = lvwReport
.Gridlines = True 'affichage d'un quadrillage
.FullRowSelect = True 'Sélection des lignes comlètes
.CheckBoxes = True
End With
End SubJe vais ouvrir un topic sur les deux formulaires que je suis en train de faire.
Je vais arriver à un moment où je vais bloquer sur les listes views.
Dis moi ce que tu en penses de mon code.
A te lire.