Création ListBox pour les débutants

grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009 - 29 juin 2009 à 10:49
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009 - 30 juin 2009 à 08:32
Bonjour tout le monde.

J'aurais besoin d'un (sacré) coup de main pour la création d'une ListBox.
Je suis archi débutant en VB, et même en parcourant les forums et en demandant de l'aide à l'ami Google, je n'ai pas réussi à m'en sortir. Je ne comprends pas ou mettre quoi, dans userform, dans le workbook, quelle syntaxe employer....etc

Pour commencer je vais vous expliquer ce que je souhaite faire pour être sur  que c'est bien d'une ListBox dont j'ai besoin.

En fait j'ai un fichier Excel dans lequel se trouve des données sous forme de tableau (jusque la normal pour excel )

L'une des colonnes de mon tableau se nomme "Chapitre" (dans cette colonne il y a plusieurs lignes qui correspondent à chaque chapitre, le nombre de ligne étant différent pour chaque chapitres).
Et ce que je cherche à faire et de faire apparaitre une fenêtre à l'écran dans laquelle la liste des chapitres apparait et qui demande à l'utilisateur de faire un choix des chapitres (1 ou plusieurs) qu'il veut analyser.

(Pour info par la suite une fois ce choix fait, il faudra que je trouve le moyen de me servir de ce qu'il à selectionné pour faire un total par chapitre de certaines colonnes et faire apparaitre ces différents totaux (par chapitre) sur un graphique).

Et je n'arrive pas du tout à mettre cela en place. Quelqu'un aurait-il la patience de m'expliquer la démarche à suivre s'il vous plait ?

10 réponses

cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
29 juin 2009 à 11:23
Bonjour 

bien sur on peut programmer en VBA mais si l'on peut éviter.

Dès lors qu'il y a au moins une ligne par chapitre et que les utilisateurs aoutent des lignes dans le chapitre : lorsqu'on met une validation des données : une combo s'ouvre pour laisser l'utilisateur choisir dans une liste de valeur. -> Rechercher dans l'aide Excel : validation des donneés et Regarder dans Excel menu Données/Validation : dans e champ autoiser mettre "Liste" et dans le champ source la plage de cellules contenant les valeurs autorisées pour les chapitres.

Pour les totaux : Regarder  "Données/Sous-Totaux"
0
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
29 juin 2009 à 11:29
Salut loulou69 et merci pour ta réponse.

En fait je suis en train de réaliser une macro pour faire l'analyse de données.
En fait le but de mon fichier est que en ouvrant le fichier, l'utilisateur est invité à choisir un export de données au format *.txt issu d'un logiciel d'ordonnancement, puis ensuite GRACE A LISTBOX OU AUTRE SUGGESTION que vous me donnerez l'utilisateur exprime les chapitres qu'il veut voir être analysés.
Ensuite la macro s'occupe de tout le reste, selection des données, calclul sur celle-ci...etc et hop une fois la macro terminée, l'utilisateur voit directement apparaitre la synthèse sous forme graphique des différentes infos.

Donc je ne peux pas me servir de l'outil liste ou autre, il faut que le choix soit fait pendant l'excecution de la macro
0
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
29 juin 2009 à 11:34
En gros il faut que tout soit automatisé. L'utilisateur ne doit internvenir que deux fois :


-une première fois pour ouvrir le ou les exports donc il veut une analyse


-une deuxième fois pour dire quels chapitres au sein de ses exports il souhaire avoir l'analyse.


 


Et ensuite la macro bosse en fond et une fois finie, il obtient la ou les feuilles qui comportent les graphiques
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
29 juin 2009 à 11:54
Je n'ai pas encore testé, et ce n'est pas fini j'écris en ligne ce qui permettra de créer la liste des valeurs différentes dans la colonne CHAPITRE ici F dans une listebox dans laquelle on pourra éventuellement sélectionner plusieurs valeurs (Multiselect)

'Créer un formulaire
'Coller une listbox List1 avec la propriété MultiSelect à 1 =fmMultiSelectMulti
Coller ce code dans la partie code du formulaire

Dim maCollection as Collection

Sub Form_Load
 'Alloue une nouvelle collection
    Set maCollection = new Collection
    Call RemplirListbox1
End Sub

Sub RemplirListbox1()
'Parcourir les ligne de la ligne 2 jusqu'à la derniere (si A2 est la celulle de la 1ère colonne qui contient des valeurs : Range("A2").End(xlDown).Row
' si F est la colonne des chapitres
Const COL_CHAPITRE="F"
Dim valCellulei as string
for i=2 to Range("A2").End(xlDown).Row
  ' valeur de cellule ligne i
  valCellulei= Cstr(Range(COL_CHAPITRE & CStr(i)).Value)

  If Not EstDansCollection(valCellulei) then
   List1.AddItem valCellulei
   MaCollection.Add valCellulei
  End If
next
End Sub
' à ce stade

Function EstDansCollection(valeur) as Boolean
  Dim Value as variant
   EstDansCollection=False
   For Each Value in MaCollection
        if Value=value then
            EstDansCollection=True
        end if
    Next Value
End Function
0

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

Posez votre question
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
29 juin 2009 à 12:20
désolé d'être aussi "nul", mais ce que tu m'as écrit, je le recopie dans This WorkBook ou ailleurs (userform ou autre). Pour l'instant toute ma macro est dans This workbook...
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
29 juin 2009 à 12:50
A coller dans userform appelé MonUSerform
Sub Form_Load()
...
End Sub
Sub RemplirListbox1(feuille as string)
...
End Sub

A coller dans un module
Public  maCollection as Collection 'Public au lieu de Dim -)

Public Sub MaProcedure()
MonUSerform.Show 1 'sert à lancer le userform  via le menu Outils/Macro/Macro et lancer MaProcedure
End Sub

Public Function EstDansCollection(....

je vois déjà un problème de codage
l'objet Range doit s'appuyer lui même sur un autre objet (Selection, ou Sheet)

Donc ajouter en paramètre de RemplirListBox1 le nom de la feuille d'ou viennent les données

Sub Form_Load
 'Alloue une nouvelle collection
    Set maCollection = new Collection
    Call RemplirListbox1("Feuil1")
End Sub

Sub RemplirListbox1(feuille as string)
Sheets(feuille).Activate
....

A tester en pas à pas, sous VBE
et peut etre remplacer Range par ... à voir plus tard.

Je reviens un peu plus tard, excuses-moi
0
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
29 juin 2009 à 16:55
loulou69,

j'ai essayé de comprendre ce que tu m'as envoyé et j'avoue que j'ai pas tout capté. J'ai tout de même essayé de l'adapter à mon fichier :

J'ai donc recopier dans le UserForm :

Sub Form_Load()
 'Alloue une nouvelle collection
    Set maCollection = New Collection
    Call RemplirListbox1
End Sub


Sub RemplirListbox1()
' Parcourir les ligne de la ligne 5 (car mes données commencent à la ligne 5) jusqu'à la derniere (NbreLignes car j'ai
' une variable du type (NbreLignes = Application.CountA(Range("Q1:Q65536")) + 4)
' ensuite j'ai mis A5 du coup, et enfin mes chapitres sont en colonne Q
' J'ai donc fait :


Const COL_CHAPITRE = "Q"
Dim valCellulei As String
For i = 5 To Range(Cells(1, NbreLignes)).End(xlDown).Row
  ' valeur de cellule ligne i
  valCellulei = CStr(Range(COL_CHAPITRE & CStr(i)).Value)


  If Not EstDansCollection(valCellulei) Then
   List1.AddItem valCellulei
   maCollection.Add valCellulei
  End If
Next
End Sub

et j'ai laissé comme tu m'as donné dans Module :

Public maCollection As Collection  'Public au lieu de Dim -)


Public Sub MaProcedure()
UserForm1.Show 1 'sert à lancer le userform  via le menu Outils/Macro/Macro et lancer MaProcedure
End Sub


Public Function EstDansCollection()

(j'ai pas réussi à renommer mon userform donc j'ai changé MonUSerform en UserForm1)

Par contre lorsque je lance la macro "Ma procedure", il y a juste une petite fenêtre qui apparait, titre UserForm1 mais rien dedans...comme ça.

Est-ce que tu m'as trouvé clair dans l'explication de ce que je voulais essayer de faire ou est-ce que tu veux que je reformule un peu ou que je t'envoie mon fichier ou autre ?
En tout cas merci pour ton aide
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
29 juin 2009 à 17:38
dans la fenetre UserForm1
tu as bien mis  une  listbox List1 (le nom est important si tu as collé mon code)
Ajoute un bouton OK de nom "cmdOK" pour pourvoir fermer

Sub cmdOK_Click
Unload me
End Sub

Tu n'as pas eu d'erreur? Tu as commncé à regarder ton code avec le débogueur sous VBE (outils/Macro/Visual Basic Editor)?  touche F8 = pas à pas
0
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
30 juin 2009 à 08:13
J'ai retravaillé un peu mon classeur.
Dorénavant ma macro se termine par la création d'une feuille qui reprend une synthèse de tous les Sous-Chapitres, et leur Chapitre correspondant, avec en face de la ligne de chaque Sous-Chapitre les valeurs que je vais devoir afficher sur mon graphe.

Et en fait ce que je veux maintenant c'est une boite de dialogue qui s'ouvre en demandant à l'utilisateur de choisir quels chapitres il veut analyser (il doit pouvoir sélectionner 5, tous ou même un seul chapitre).
Et l'effet de cette sélection fera que au lieu de renvoyer toutes les données de tous les chapitres sur le graphe, sont choix aurait pour effet de "supprimer" tous les chapitres non sélectionnés par l'utilisateur.
Et dans l'idéal ( <?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /??><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 11.25pt; HEIGHT: 11.25pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://www.vbfrance.com/imgs2/smile_wink.gif" src="file:///C:\DOCUME~1\duvalt\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape> ) ça serait bien qu'il puisse faire réapparaître la boite de dialogue pour refaire un autre choix sans avoir besoin de relancer le fichier du début.

PS : J'aurais voulu pouvoir vous envoyer un peu mon fichier pour vous montrer un peu plus clairement de quoi je parle mais je n’arrive pas à joindre de pièce dans ce message (comment fait-on ?)
0
grosboufLG Messages postés 17 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 16 juillet 2009
30 juin 2009 à 08:32
Alors Loulou69,

J'ai refait tout ce que tu m'as dit (j'ai mis MonUserform, comme nom et je me suis rendu compte à quel point j'avais été bidon de ne pas réussir à le renommer). J'ai fait les changements de colonne pour que ça colle.
Et quand je fais le Pas à Pas, la boite de dialogue s'affiche, mais ensuite au prochain F8 rien (pas de contenu dans la liste, pas d'étape suivante, pas non plus de message d'erreur pour autant). Donc je clique sur OK et en faisant F8 deux fois ça ferme bien la boite de dialogue.

C'est normal que pour l'instant rien de plus ne se passe ?
0
Rejoignez-nous