Transfert de données de fichier Excel sur ListBox

Signaler
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010
-
Messages postés
2
Date d'inscription
lundi 18 juillet 2011
Statut
Membre
Dernière intervention
16 octobre 2012
-
Bonjour à tous,

Me voila tous nouveau sur ce forum, je viens vers vous pour une question:

Alors j'ai un userform de saisie qui incrémente un autre fichier excel "base de données", la dessus pas de problème.
Maintenant je souhaiterai que dans une listebox présente dans un autre onglet de cet userform vienne s'afficher certaines données (ex: colonne A et B)du fichier excel "base de données".

Et je n'arrive pas a réaliser cette opération. Pouvez-vous m'aider ?

Merci !!

20 réponses

Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Salut,

En premier lieu, règle les paramètres de ton contrôle Listbox, notamment le nombre de colonnes. Dans ton exemple, tu souhaites que la Listbox affiche 2 colonnes de données.

Ensuite, pour remplir la liste avec les données d'une feuille Excel en particulier, utilise une procédure de ce type, soit au lancement de l'userform (si ton userform ne vient pas écrire des données dans la feuille Excel), soit à chaque activation de l'onglet concerné (si ton userform offre la possibilité de modifier les données de la feuille Excel).


Private Sub UserForm_Activate()

Dim i As Long
Dim nomfeuille As String

nomfeuille = "Base de données"
i = 1

Me.ListBox1.Clear 'On efface le contenu de la Listbox

'On parcourt les cellules des colonnes A et B de la feuille "Base de données".
'Dans mon exemple, on boucle jusqu'à trouver une cellule vide dans la colonne A.
'Je considère que le champ de la colonne A doit être obligatoirement rempli pour être pris en compte (cf. clé dans une BDD).
'A toi de choisir ta méthode pour stopper la boucle quand il n'y a plus de données.

Do Until ActiveWorkbook.Sheets(nomfeuille).Cells(i, 1) = ""

'On ajoute une ligne entière à la suite, dans la Listbox. L'index n'est donc pas précisé ici.
'Seul le contenu de la colonne 1 s'affiche dans la Listbox.

Me.ListBox1.AddItem ActiveWorkbook.Sheets(nomfeuille).Cells(i, 1)

'On Ajoute la donnée dans la colonne 2 (l'index de ListBox.list commence à 0 et non à 1).

Me.ListBox1.List(i - 1, 1) = ActiveWorkbook.Sheets(nomfeuille).Cells(i, 2)

i = i + 1

Loop

End Sub


Et voilà. Bon courage.
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Merci beaucoup bertholdt d'avoir pris du temps pour avoir répondu à ma question.
Je vais tester ce que tu me proposes.
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Re bonjour bertholdt,

Voila je viens de réadapté ta proposition, ce qui donne :

Private Sub listbox1_clock()

Private Sub UserFormSuivi_Activate()

Dim i As Long
Dim nomfeuille As String

nomfeuille = "K:\Repertoire Commun\Arnaud\Excel\VBA\BaseDeDonnées.xls"
i = 1

Me.ListBox1.Clear 'On efface le contenu de la Listbox

'On parcourt les cellules des colonnes A et B de la feuille "Base de données" on boucle jusqu'à trouver une cellule vide dans la colonne A.
'On considère que le champ de la colonne A doit être obligatoirement rempli pour être pris en compte (cf. clé dans une BDD).

Do Until ActiveWorkbook.Sheets(nomfeuille).Cells(i, 1) = ""

'On ajoute une ligne entière à la suite, dans la Listbox. L'index n'est donc pas précisé ici.
'Seul le contenu de la colonne 1 s'affiche dans la Listbox.

Me.ListBox1.AddItem ActiveWorkbook.Sheets(nomfeuille).Cells(i, 1)

'On Ajoute la donnée dans la colonne 2 (l'index de ListBox.list commence à 0 et non à 1).

Me.ListBox1.List(i - 1, 1) = ActiveWorkbook.Sheets(nomfeuille).Cells(i, 2)

i = i + 1

Loop
End Sub
End Sub

Pour les contrôle de ma listbox1 j'ai mis dans Bount Coulnm : 2 Je pense que c'est la que l'on met le nombre de colone que l'on veut ?

Mais le problème est que quand je clique sur ma listebox celle-ci reste vide !!
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Salut,

Plusieurs remarques par rapport au code que tu as posté suite à ma première réponse.

1.Tu as imbriqué une procédure dans une autre:
Au début du code :
Private Sub UserFormSuivi_Activate() dans
Private Sub listbox1_clock()

Et à la fin :
End Sub
End Sub

Cela produit une erreur d'exécution. Tu ne peux pas imbriquer deux procédures comme ça. Si tu souhaites exécuter une procédure au sein d'une autre, tu peux l'appeler grâce à l'instruction Call : Call nomprocedure


2.En ce qui concerne la feuille dans laquelle se trouve les données, dans mon exemple, je considère qu'il s'agit d'une feuille présente dans le classeur dans lequel se trouve ton userform. J'ai l'impression que dans ton cas, il s'agit d'une feuille présente dans un autre classeur. Si c'est le cas, il est possible de récupérer les données mais la méthode est un peu plus complexe.

3. Le paramètre permettant de définir le nombre de colonnes de la ListBox s'appelle ColumnCount et non BoundColumn. Dans ton cas, laisse le paramètre BoundColumn à sa valeur par défaut.


Dis moi ce qu'il en est en ce qui concerne le point n°2.
A+
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

1. En faite je veux que quand je clique sur la listbox1, celle-ci affiche les données.

2.Effectivement il s'agit bien d'une feuille présente dans un autre fichier excel.
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

1.Ah c'est quand tu cliques dessus, ok. Pas conventionnel mais pourquoi pas
Personnellement, je trouve plus simple et logique de remplir la ListBox à l'activation de la Form. A toi de voir.

Petite remarque : Attention il s'agit de l'évènement click et non clock comme tu l'as écrit.


2. Pour aller chercher des données dans un autre fichier Excel voilà comment il faut faire (J'ai réécris la procédure et je reste sur l'évènement Userform_Activate car dans mon test, la procédure ne s'activait pas lorsque je cliquais sur la ListBox, même avec l'évènement ListBox1_Click) :


Private Sub UserForm_Activate()

Dim nomclasseursource As String
Dim nomfeuillesource As String
Dim chemindacces As String
Dim donnee1 As String
Dim donnee2 As String
Dim i As Long

nomclasseursource = "BaseDeDonnées"
nomfeuillesource = "Feuil1" 'Le nom de la feuille contenant les données dans ton classeur source.
chemindacces = "K:\Repertoire Commun\Arnaud\Excel\VBA\BaseDeDonnées.xls"

Application.ScreenUpdating = False 'permet de ne pas afficher les différentes manipulations réalisées par la macro. On ne voit donc pas le fichier source s'ouvrir. Le rendu est plus propre.

Me.ListBox1.Clear
Application.Workbooks.Open chemindacces

Do Until Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 1) = ""

donnee1 = Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 1)
donnee2 = Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 2)

Me.ListBox1.AddItem donnee1
Me.ListBox1.List(i - 1, 1) = donnee2

i = i + 1
Loop

Application.Workbooks(nomclasseursource).Close
Application.ScreenUpdating = True 'On rétablit les mises à jour de l'affichage.

End Sub


Voilà avec ça, tu devrais t'en sortir.
Bonne prog !

Pierrick
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Ma listbox reste toujour vide.

Mais en faite mon userform "GRC" comprends plusieurs onglet. Et la listbox et dans le deuxieme onglet nommé "Suivi".

Cela a t'il une incidence l'évènement Userform_Activate ??

On devrait pas mettre plutot GRC ou Suivi _Activate ??
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Re,

Si tu souhaites remplir la ListBox quand l'utilisateur clique dessus, tu n'as pas besoin de t'occuper des onglets car pour activer la procédure, l'utilisateur devra obligatoirement se trouver dans l'onglet en question, puisqu'il devra cliquer sur la ListBox.

En revanche, si tu souhaites remplir la ListBox à lors de l'accès à l'userform ou à l'onglet, et si ton userform se compose de plusieurs onglets, il va falloir adapter tes procédures. Dans tous les cas, il sera obligatoire de remplir la ListBox alors que l'onglet dans lequel elle se trouve est actif. Si tu ne fais pas cela et que tu lances la procédure de remplissage alors qu'un autre onglet est actif, il se produira une erreur.

Ce que tu peux faire, ça reste une suggestion, c'est "initialiser" tous les onglets qui en ont besoin lors de l'activation de l'userform, et ce de manière automatique. Dans ce cas, dans la procédure Userform_Activate() tu fais en sorte que ton programme parcourt chaque onglet concerné (dans ton cas, juste le n°2 apparemment). Tu définis donc l'index du contrôle Onglet pour qu'il se positionne sur l'onglet n°2 (une commande du style Me.Onglet.Index = 2), tu remplis ta ListBox via la procédure donnée dans les messages précédents, puis tu reviens éventuellement sur l'onglet de ton choix, le n°1 par exemple.

Dans ce cas, ta Listbox est remplie dès l'activation de l'Userform.
La procédure que je t'ai donnée précédemment fonctionne, je l'ai testée. Assure toi que les paramètres de la ListBox sont bien réglés, notamment ceux que tu as pu modifier par mégarde. Assure toi aussi que ton fichier source contient bien des données, et dans quelle feuille de ce classeur source elles se trouvent.
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Je comprend pas, j'ai tous fermé, puis j'ai ouvert un nouveau fichier excel, pour tester.

- J'ai créer un userform, dedans j'ai mis un ListBox

- J'ai copier/coller ta proposition de code, en modifiant juste Feuil1 par Base de données

- J'ai pas modifié les paramètres et du ListBox

Bah je ne vois toujours rien qui s'affiche dans ma listBox alors qu'il y a bien des données dans mon fichier BaseDeDonnées
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Maintenant j'ai autre chose :

Il me met une erreur d'execution 1004
"Erreur définie par l'application ou par l'object"

Et il me surligne :
Do Until Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 1) = ""

????????????????????

(Tu peux me traiter de Piniouf ^^)
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Alors, on va reprendre depuis le début, je vais t'expliquer ce que j'ai compris de ton problème et comment je l'ai résolu :

Donc, tu as un fichier Excel qui contient des données et qui s'appelle "Base De Données". On va l'appeler BDD.
Dans un autre fichier Excel, tu as créé une Userform avec laquelle tu souhaites aller lire certaines données du fichier BDD.

J'ai l'impression qu'il y a une confusion entre le classeur et les feuilles. Le classeur est en fait le fichier Excel... et les feuilles sont contenues dans le classeur. Quand tu crées un nouveau classeur, il y a 3 feuilles disponibles par défaut (nommées Feuil1 à Feuil3). Dans ton fichier source BDD, il faut non seulement faire attention au nom du classeur mais aussi au nom de la feuille (Majuscules y compris).

Ensuite, quelles sont les colonnes du fichier source que tu cherches à insérer dans la ListBox ? Dans mon exemple, il s'agit des colonnes A et B.

Enfin, il faut modifier la propriété ColumnCount de ListBox et le mettre à 2, si tu as 2 colonnes.

Dans tous les cas, observes-tu une erreur d'exécution ?
Si oui, alors il y a un soucis dans ton adaptation du code.
Si non, alors il y a un soucis avec tes données, tu ne vas pas chercher au bon endroit.
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Vérifie que tu indiques les bons noms pour les variables "nomclasseursource" et "nomfeuillesource".
Vérifie que i n'est pas égal à 0
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Oui tu as compris la structure de mes fichiers

Alors :
Classeur nommé BaseDeDonnées
Feuille il n'y a qu'une seule nommée Base de données.

Ensuite, je souhaite insérer les colonnes A à N de ma base de données.

Dans ma base de données les cellules A1 à N1 correspondent au titre des mes colonnes (ex: Nom). Donc deja mon fichier comporte des données et i ne peut pas etre nulle
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

14 colonnes, ça fait beaucoup dans une Listbox.
Vois plutôt pour utiliser le contrôle Listview qui est plus performant que ListBox et qui te donnera plus de possibilités.
L'importation des données, tu pourras la gérer plus tard, c'est le plus simple.
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Bon bah du coup je vais me rabattre sur le Listview...

En tous cas je tiens a te remercier pour le temps que tu m'as consacré !!

Merci beaucoup
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Bonjour Bertholdt,

J'aurai une question a te poser, sais-tu comment importer des données sur un listview d'un fichier excel ?

J'ai beau chercher sur le net, je n'arrive pas a trouver...
Messages postés
22
Date d'inscription
lundi 20 novembre 2000
Statut
Membre
Dernière intervention
17 mai 2010

Salut,

La méthode d'importation des données depuis Excel vers la Listview est similaire à celle que je t'avais donnée pour la Listbox, exception faite des méthodes du contrôle Listview qui sont différentes. Si tu cherches comment fonctionne un contrôle Listview, cherche des codes sources qui en utilisent, ils sont nombreux.

A+
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

Voila le code que j'ai mis, mais voila il me met encore une erreur, et j'arrive pas du tous a voir ou se trouve l'erreur


Private Sub UserForm_Initialize()

Dim nomclasseursource As String
Dim nomfeuillesource As String
Dim chemindacces As String
Dim donnee1 As String
Dim donnee2 As String
Dim i As Long

nomclasseursource = "BaseDeDonnées"
nomfeuillesource = "Base de données" 'Le nom de la feuille contenant les données dans le classeur source.
chemindacces = "K:\Repertoire Commun\Arnaud\Excel\VBA\BaseDeDonnées.xls"

'----- 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 du jour", 70
.Add , , "Service", 50
.Add , , "Initiale", 40
.Add , , "Dépt", 30
.Add , , "Type", 50
.Add , , "Date de réclamation", 80
.Add , , "Code client", 50
.Add , , "Nom Interlocuteur", 80
.Add , , "N°Circuit", 50
.Add , , "Nature", 50
.Add , , "Obser Nature", 90
.Add , , "Action menée", 50
.Add , , "Obser Action", 90

End With

End With
'-----------------------------------------------------

'---Copie des données---------------------------------

Application.ScreenUpdating = False 'permet de ne pas afficher les différentes manipulations réalisées par la macro. On ne voit donc pas le fichier source s'ouvrir. Le rendu est plus propre.

Me.ListView1.ListItems.Clear
Application.Workbooks.Open chemindacces

Do Until Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 1) = ""

donnee1 = Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 1)
donnee2 = Application.Workbooks(nomclasseursource).Worksheets(nomfeuillesource).Cells(i, 2)

Me.ListView1.ListItems.Add donnee1
Me.ListView1.ListItems(i - 1, 1) = donnee2

i = i + 1
Loop

Application.Workbooks(nomclasseursource).Close
Application.ScreenUpdating = True 'On rétablit les mises à jour de l'affichage.

'--------------------------------------------------

'Spécifie l'affichage en mode "Détails"
ListView1.View = lvwReport

'Affichage d'un quadrillage dans la ListView
ListView1.Gridlines = True

'Surligne la ligne entière selectionnée
ListView1.FullRowSelect = True


End Sub
Messages postés
28
Date d'inscription
mardi 11 mai 2010
Statut
Membre
Dernière intervention
21 juin 2010

J'ai vraiment besoin d'un coup de main, parce que j'ai fais quasiment toutes les pages sur google concernant l'alimentation d'une listview et j'ai rien compris. J'arrive pas du tous à résoudre mon problème ...
Messages postés
2
Date d'inscription
lundi 18 juillet 2011
Statut
Membre
Dernière intervention
16 octobre 2012

aider moi j'ai + de 3 jrs de recherche sur "transfert tous le contenue de listbox multilignes vers feuil xls" merci