grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 juillet 2009
-
29 juin 2009 à 10:49
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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 ?
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 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.
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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...
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 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
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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 ?)
grosboufLG
Messages postés17Date d'inscriptionmercredi 17 janvier 2007StatutMembreDernière intervention16 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 ?