Alimenter un listview

zourite

XLDnaute Junior
Bonsoir le forum,

J'aimerai alimenter le nombre de ligne automatiquement d'un listview.

J'arrive à définir les colonnes, mais je voudrais définir les lignes automatiquement en fonction de ma base de données (sur feuille excel), j'ai essayé mais je comprend pas comment ca marche..

j'ai essayé le code suivant mais ca ne marche pas :(
Code:
Private Sub UserForm_Initialize()
    
    '----- remplissage ListView------------------------
    With ListView1
        'Définit le nombre de colonnes et Entêtes
        With .ColumnHeaders
            'Supprime les anciens entêtes
            .Clear
            'Ajoute 3 colonnes en spécifiant le nom de l'entête
            'et la largeur des colonnes
            .Add , , "Date", 80
            .Add , , "Mission", 50
            .Add , , "Gamme", 50
            .Add , , "Nom", 50
            .Add , , "CA", 50
            .Add , , "Charges", 50
   
        End With
               For i = 1 To 200
        With .ListItems
           .Add , , Cells(i + 4, 1)
        End With
        'Remplissage des colonnes dans la 1ere ligne
        .ListItems(1).ListSubItems.Add , , Cells(i + 4, 2)
        .ListItems(2).ListSubItems.Add , , Cells(i + 4, 3)
        .ListItems(3).ListSubItems.Add , , Cells(i + 4, 4)
        .ListItems(4).ListSubItems.Add , , Cells(i + 4, 5)
        .ListItems(5).ListSubItems.Add , , Cells(i + 4, 6)
    Next i
           ListView1.View = lvwReport
    
        
ListView1.Gridlines = True
ListView1.AllowColumnReorder = True
ListView1.FullRowSelect = True

End Sub

Pourriez-vous me guider?
merci

zourite
 

Pièces jointes

  • listview1.xls
    30 KB · Affichages: 242
  • listview1.xls
    30 KB · Affichages: 219
  • listview1.xls
    30 KB · Affichages: 260

Hulk

XLDnaute Barbatruc
Re : Alimenter un listview

Hello,

Les ListWiew n'étant pas mon fort, je te laisse un fichier exemple que j'ai simplifié pour une meilleure compréhension.

Je ne sais plus qui me l'a passé, mais merci à lui s'il se reconnait !

Si ça peut t'aider...
 

Pièces jointes

  • Test Listwiew.xlsm
    27.7 KB · Affichages: 654

zourite

XLDnaute Junior
Re : Alimenter un listview

Bonjour Hulk, Paritec,

Merci à vous deux pour vos réponses !!

Ca marche très bien !

J'ai des petites questions:

Est il possible de figer les deux premières colonnes du listview date & mission, afin que lorsque j'utilise le scrollbar vers la droite pour voir les autres colonnes, je garde en vue les deux premières?

Dans la solution que tu m'as apporté Paritec, on peut faire glisser les colonnes manuellement, peut-on interdire le glissement de la première colonne?

Comment bloqué le redimensionnement manuel des colonnes?

Merci d'avance pour vos réponses.

zourite
 

zourite

XLDnaute Junior
Re : Alimenter un listview

Re le forum,

Après d'avantages de recherches, je ne pense pas qu'il soit possible de figer la colonne d'un listview.
L'alternative serait de créer plusieurs listview et de les relier.

Donc, j'ai pensé, que dans mon cas que le listview1 pourrait être la source (toutes les données sont importées de la feuille excel sur ce listview), et que listview2 (et pourquoi pas plus) utiliserait les données de certaines colonnes du listview1.
Actuellement j'ai juste reproduit le code du listview1 pour le listview2.. je ne sais pas comment allimenter le listview2 via le listview1.

Il faudrait également fixer deux points:
  • les scrollbars horizontaux des listview doivent être liés; est-il possible de masquer un des deux scroll bars, puisqu'ils ont la même utilité?
  • j'utilise
    Code:
    ListView1.FullRowSelect = True
    afin de sélectionner une ligne entière sur le listview. Comment faire pour que lorsque je clique sur la ligne d'un listview, ca sélectionne la même ligne de plusieurs listviews?

Qu'en pensez vous? et pouvez vous m'aider?

merci d'avance

zourite
 

Pièces jointes

  • Copie de Zourite V1.xls
    53 KB · Affichages: 282
Dernière édition:

YANN-56

XLDnaute Barbatruc
Re : Alimenter un listview

Bonsoir zourite, aux participants, et à ceux qui passeront par là,

Je fais donc suite à ce Fil:
https://www.excel-downloads.com/threads/listview-userform-memoire-insuffisante.172354/
Voici ma petite contribution jointe.

J'y ai ajouté le maximum de commentaires, pour t'aider à comprendre.
et notamment l'importance de cibler ce que l'on va copier.

Il est gonflant d'avoir à venir trifouiller dans ses codes par suite d'avoir décidé
d'ajouter une Ligne ou une Colonne dans sa base de données.

Je me suis appliqué à supprimer les chrysanthèmes qui font "joli", mais qui fanent très vite!!!!

Au plaisir de voir ton évolution,

Yann
 

Pièces jointes

  • Aide_Zourite _1.xls
    42.5 KB · Affichages: 321

YANN-56

XLDnaute Barbatruc
Re : Alimenter un listview

J'apporte un "Nota".

Dans ce que tu dis de "Figer" les Colonnes, il est facilement possible d'en interdire
leur "Click dessus leur entête, ou de faire autre chose si l'on veut!

Quant au rapport entre plusieurs ListView,
il faudra faire attention que dans la première, il ne soit pas de SubItems vides.
(C'est gérable, mais il vaut mieux le faire en amont en mettant: "Si vide = "-" ou "")

J'ai une autre méthode mettant fin aux divers soucis:
C'est de mettre en mémoire dans les "Key" ou "Tag" des Items l'adresse de la Cellule pompée,

Même par suite d'un tri par "Click" sur un entête de colonne, on conservera cette dernière,
sans se préoccuper de l'Index de telle ou telle ListView secondaire.

Cette démarche est très confortable pour la suite d'un projet...

Amicalement, et à te lire,

Yann

P.S.
Pour interdire le redimensionnement des colonnes, il est vraiment très simple.
Mais j'ai privilégié le premier sujet.
 
Dernière édition:

zourite

XLDnaute Junior
Re : Alimenter un listview

Bonsoir Yann-56,


EDIT: je viens de voir ton deuxième message

Merci pour ton aide encore une fois ! :)

Je pense que là, c'est ok pour la création de la listview, je me sert de ton modèle.

Le problème que je rencontre, et d'un point de vue ergonomique..
On ne peut pas "figer" une colonne d'un listview. Donc, sachant que l'utilisateur se repère via les deux premières colonnes, si le nombre de colonne devient trop important, il ne pourra pas lire à la fois les premières colonnes et les dernières.

Comment faire pour créer un deuxième listview qui se source du 1er?
Comment faire pour lier les scrollbars verticaux?
Peux-ton rendre invisible le scrollbar d'un des deux listviews?

Un deuxième problème survient lors de la sélection d'une ligne entière:
Actuellement, lorsque je sélectionne une ligne entière, elle n'est surlignée que dans un seul listview.
La "sélection de ligne" n'est donc pas la bonne méthode en cas de plusieurs listviews liés. J'ai donc pensé qu'il était possible de personnaliser un évènement "click" qui surlignerai et changerai la couleur de police de la ligne sélectionnée.
Puis ce changement de format se répercuterait sur les autres listviews (pour cela il faudra que le "backcolor" , la "police" et le text soit importé du 1er listview.

Est-ce que cela est possible?

merci d'avance

zourite
 

YANN-56

XLDnaute Barbatruc
Re : Alimenter un listview

Lier les scrollbars verticaux en repérant les " UserForm1.ListView(x).ListItems(x).EnsureVisible",
c'est possible, mais là ce n'est pas de la tarte!

J'ai coutume de ne charger que les premières données essentielles de la base de données. (Nom ou autre)
Cela gagne énormément de temps!

Ayant enregistré leur adresse, quand je clique sur un Item,
je visualise le contenu de la ligne concernée dans une autre ListView.
(Ayant aussi transféré les adresses dans la deuxième, je peux ainsi faire ce que je veux)

Pas facile à expliquer sans exemple, je le conçois, aussi il serait bien que l'on y aille point par point.

Il me fait plaisir de partager avec quelqu'un qui a envie d'avancer avec cet outil merveilleux.:)

Amicalement,

Yann

PS: Ci-desuss Lire "FirstVisible" ou "Last..."
 
Dernière édition:

zourite

XLDnaute Junior
Re : Alimenter un listview

Merci Yann-56 pour ces précieuses infos,

là j'ai eu mon quota de recherche & vba pour la journée..je dois malheureusement y aller.. bien que j'avoue commencer à prendre gout à ces lignes codes :eek:
En tout cas je suis heureux d'avoir découvert les listviews bien que j'en ai des cernes ! haha

Je vais bien réfléchir à tout ca, et revenir en forme pour demain avec un exemple tout frais !

Bonne soirée

zourite
 

zourite

XLDnaute Junior
Re : Alimenter un listview

Bonsoir le forum,

Je vais suivre le conseil de Yann et tenter de y aller point par point.

Dans ce fichier, il y a deux listviews. La listview1 se source de la feuille excel.
Je souhaite que la listview2 se source uniquement de la listview1 en créant deux colonne: Date et Gamme.
Il faudrait que la listview2 importe les valeurs, le nombre de ligne, mais également le format du backcolor et la couleur d'écriture.
En gros j'aimerai que quand je change les couleurs de mon listview1, ca s'applique également sur les mêmes lignes sur le listview2.

Merci pour votre aide

zourite
 

Pièces jointes

  • Copie de Copie de Zourite V1.xls
    51 KB · Affichages: 149
  • Copie de Copie de Zourite V1.xls
    51 KB · Affichages: 140
  • Copie de Copie de Zourite V1.xls
    51 KB · Affichages: 185

Bebere

XLDnaute Barbatruc
Re : Alimenter un listview

bonjour Zourite,Yann
un exemple avec checkboxes
à bientôt
 

Pièces jointes

  • Copie de Copie de Zourite V1.xls
    60 KB · Affichages: 286
  • Copie de Copie de Zourite V1.xls
    60 KB · Affichages: 199
  • Copie de Copie de Zourite V1.xls
    60 KB · Affichages: 228

YANN-56

XLDnaute Barbatruc
Re : Alimenter un listview

Bonjour Zourite, Bebere, et à ceux qui passeront pat là,

Petites remarques:

Je ne vois pas, dans ton dernier jet, l'utilisation de ma méthode qui a pour but de ne pas avoir à venir modifier
le code en cas de modification de l'intitulé ou emplacement du tableau!
Chacun fait ce qu'il veut; mais je trouve cela très confortable (Par expérience)!

Il ne faut pas oublier que l'Index correspondant à la Ligne de la ListView, et nom son Item!!!
Ce qui veut dire que dans le cas d'un Tri de la ListView1 par suite du Click sur un en-tête de colonne,
il n'y aura plus de correspondance entre les deux Listes!
Cette action n'est pas évoquée, mais fréquemment utilisée dans les logiciels. (Y compris Wind.)


Cette dernière n'enlève rien à la démonstration de Bebere :) qui te sera certainement utile par ailleurs.

Pour ma part, j'avais pensé bien faire en multipliant les commentaires; c'est raté! Mais pas grave... ;)

Je suis à construire un exemple pour un autre XLDNaute. Je reviendrai le soumettre ici, au cas où.
Mais des écritures comme:
Code:
    Dim fin&, i&, j&
    ......................................
    fin = Feuil1.Range("A" & Rows.Count).End(xlUp).Row

il n'y en aura pas car je parle "Plouc"

A bientôt, dés que mon dernier exemple sera abouti. (Juste pour info)

Yann
 

YANN-56

XLDnaute Barbatruc
Re : Alimenter un listview

Re Zourite,

Je ne parviens pas à rouvrir le Fil de la discussion dont je parlais, et dont BRUNO62 était à l'origine.
Je souhaitais lui apporter cette aide! Peut-être a-t-il supprimé son profil?

Qu'importe, je joins les éléments que je proposais à son attention, et que je te les soumets.

Dans cet exemple, je passe outre "Cibler la mise en page de la base de données"

Le sujet principal était l'utilisation de TextBoxes, et je n'ai pas voulu encombrer mes codes avec cela.

Je n'ai pas ajouté, pour toi, le caprice de la mise en couleur des Itens, mais si tu y tiens cela sera très facile.

Si cette fois tu me suis, je te suivrai.

Amicalement,

Yann

P.S. Suite à ouverture du capot, j'ai réussi pour Bruno...
 

Pièces jointes

  • DONNEES.xls
    33.5 KB · Affichages: 242
  • DONNEES.xls
    33.5 KB · Affichages: 224
  • DONNEES.xls
    33.5 KB · Affichages: 238
  • BRUNO_3.xls
    82.5 KB · Affichages: 211
  • BRUNO_3.xls
    82.5 KB · Affichages: 234
  • BRUNO_3.xls
    82.5 KB · Affichages: 275
Dernière édition:

zourite

XLDnaute Junior
Re : Alimenter un listview

Bonjour Bebere, Yann,

Tout d'abord merci à vous deux pour vos conseils et vos exemples qui me permette de trouver mon chemin !

Bebere, ca se rapproche de très près de mon besoin avec le changement de police,et de couleur dans un autre listview.

Cependant, tes commentaires Yann, me font réaliser que si mon besoin change, je devrais tout reprendre... car cette histoire de clé est plus importante que je le croyais.

En relisant plusieurs fois tes commentaires, je commence à comprendre.
Ayant enregistré leur adresse, quand je clique sur un Item,
je visualise le contenu de la ligne concernée dans une autre ListView.
C'est exactement ce que je souhaites faire.
La différence par rapport à l'exemple de Bruno, est que dans le miens, l'affichage doit rester identique.. le but étant que l'utilisateur remarque le moins possible la présence de listview différentes (d'où les scrollbar liées et cachées et également le changement de format de la couleur de police et du backcolor.).
L'effet attendu est une réelle simulation de "figer une colonne" sous excel.

Au niveau des modifications par rapport au fichier initial que tu m'as crée (encore merci, et désolé si je ne comprend que maintenant tout l'intérêt d'une structure comme celle là)

Je dois donc changer le nombre de colonne du listview1 (source) à 2 (pour avoir uniquement Date & mission).

Ensuite attribuer des clés aux différentes lignes, j'ai pensé à nommer les key par i
Est ce que c'est comme ca qu'il faut faire?
Code:
With Me.ListView1: .View = 3: .Gridlines = True: .FullRowSelect = True
  With .ColumnHeaders 'Création des Colonnes de la Listiew
      For i = COLONNE_CELLULE_ORANGEE To 2 ' Je limite à 30 colonnes, pour l'instant, et pour aller plus vite.
          If ActiveSheet.Cells(LIGNE_CELLULE_ORANGEE, i).Value <> "" Then 'Si les entêtes ne sont pas vides (Invraisemblable; au demeurant)
            .Add , , ActiveSheet.Cells(LIGNE_CELLULE_ORANGEE, i).Text, 60 ' Après on pourra venir modifier cette Largeur forfaitaire
          End If
      Next i
  End With
' ===================================== On va,aussi s'enservir pour remplir la ListView ("i" = Lecture Verticale, "j" = Lecture Horizontale)
       For i = LIGNE_CELLULE_ORANGEE + 1 To ActiveSheet.Cells(65536, COLONNE_CELLULE_ORANGEE).End(xlUp).Row ' En partant du bas de la Colonne de la Cellule Orangée
            .ListItems.Add , , ActiveSheet.Cells(i, COLONNE_CELLULE_ORANGEE).Value 'Je Charge l'Item avec la première Colonne concernée.
                For j = 1 To .ColumnHeaders.Count ' Je complète avec ce qu'il y a dans la Ligne, en me basant sur le nombre de Colonnes.
                  .ListItems(.ListItems.Count).ListSubItems.Add , i, ActiveSheet.Cells(i, COLONNE_CELLULE_ORANGEE + j).Value
                Next j
       Next i

j'espère que c'est ca. mais après relecture, je crois que je pédale dans la choucroute..

Ensuite pour la lecture de la listview2 dans la listview1, ca j'ai vraiment pas compris..

J'ai repris ton fichier en apportant les modifs..

merci d'avance pour tes suggestions.

PS: j'ai trouvé un bug sur la version de Bruno, lorsque tu click sur listview2 (pas à chaque fois) mais il se peut que ca modifie des données dans le listview1.. (sans que l'utilisateur ne fasse la moindre saisie)
 

Pièces jointes

  • Copie de Aide_Zourite _1.xls
    51.5 KB · Affichages: 329
Dernière édition:

Discussions similaires

Réponses
0
Affichages
83

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG