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

72formlistview.xlsm (27.81 Ko)

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 Function

pour 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

101formlistview.xlsm (34.16 Ko)

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 Fonction

Si 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 Sub

Mais 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 Sub

j'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 With

je 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 With

je 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

voila un autre essais

regarde Bien le code

A+

Maurice

72formlistview-2.xlsm (49.18 Ko)

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 Sub

je 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 Sub

Je 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.

93formlistview.xlsm (39.92 Ko)
Rechercher des sujets similaires à "remplissage listview"