{Access} récupérer valeur liste -> VBA
Résolu
juliendangers
Messages postés
246
Statut
Membre
-
DamDam -
DamDam -
Bonjour à tous,
Je vais vous exposer mon problème. J'ai créer une base de données avec 7 tables pour mon projet! Il est pratiquement terminé à part un malheureux point qui me donne du fil à retordre :s
Le problème concerne 3 tables liées. La table couleur(id_couleur, libellé) liée à la table affectation (id_affect, id_auto, id_couleur) ou id_couleur est une liste a choix multiple contenant l'ensemble des couleurs de la table couleur. Puis la table neuve(id_neuve, modele_neuve, puissance_neuve, energie_neuve) qui est liée a la table affectation par id_voiture!
Je vous explique mes choix :
Un modele (de voiture) peut etre de plusieurs couleurs mais pas de toute la gamme de couleur de la marque! On doit donc assigner à un modèle les couleurs qui lui correspondent, c'est pourquoi je dois récupérer les valeurs sélectionnées dans la liste de choix multiples...
Seulement avec access uniquement c'est impossible (ou alors expliquez moi je suis preneur)!
J'ai donc vu que je devais utiliser du code VBa. Mais je n'ai travaillé le VBa qu'avec excel et je ne sais trop comment m'y prendre avec access.
C'est pourquoi je fais appel à vos connaissances!
Je vous remercie d'avance ;) Bonne journée
Je vais vous exposer mon problème. J'ai créer une base de données avec 7 tables pour mon projet! Il est pratiquement terminé à part un malheureux point qui me donne du fil à retordre :s
Le problème concerne 3 tables liées. La table couleur(id_couleur, libellé) liée à la table affectation (id_affect, id_auto, id_couleur) ou id_couleur est une liste a choix multiple contenant l'ensemble des couleurs de la table couleur. Puis la table neuve(id_neuve, modele_neuve, puissance_neuve, energie_neuve) qui est liée a la table affectation par id_voiture!
Je vous explique mes choix :
Un modele (de voiture) peut etre de plusieurs couleurs mais pas de toute la gamme de couleur de la marque! On doit donc assigner à un modèle les couleurs qui lui correspondent, c'est pourquoi je dois récupérer les valeurs sélectionnées dans la liste de choix multiples...
Seulement avec access uniquement c'est impossible (ou alors expliquez moi je suis preneur)!
J'ai donc vu que je devais utiliser du code VBa. Mais je n'ai travaillé le VBa qu'avec excel et je ne sais trop comment m'y prendre avec access.
C'est pourquoi je fais appel à vos connaissances!
Je vous remercie d'avance ;) Bonne journée
Configuration: Windows 7 / Firefox 3.5.8
22 réponses
- 1
- 2
Suivant
-
Salut,
il faut déjà que ta liste soit paramétrée en 'sélection multiple étendue'.
Ensuite, le bout de code suivant va te permettre d'afficher ce qui est sélectionné dans la liste :
Dim MonCtl As Control Dim Element As Variant Set MonCtl = Forms!nom_du_formulaire!Nom_de_la_liste For Each Element In MonCtl.ItemsSelected MsgBox MonCtl.Column(0, Element) Next
Ca devrait te permettre d'avancer.
-
merci de ta rapidité.
comment la passer en étendu (je travaille avec access 2007 et 2010), car j'ai juste ajouter la propriété autoriser plusieurs valeurs à la zone de liste déroulante??
ensuite si je comprends bien le code :
Dim MonCtl As Control //défini un controle nommé MonCtl
Dim Element As Variant
Set MonCtl = Forms!nom_du_formulaire!Nom_de_la_liste //applique le controle à la liste déroulante du formulaire
For Each Element In MonCtl.ItemsSelected //affiche l'ensemble des éléments sélectionés de la liste
MsgBox MonCtl.Column(0, Element)
Next
questions :
nom_de_formulaire c'est le formulaire qui affichera les couleurs sélectionées, ou celui où on les sélectionne? (celui ou on les sélectionne a mon avis)
plutot que de les afficher avec un msgbox je pourrais pas plutot les stocker ailleurs? (dans une requete par exemple?)
Car actuellement dans mon formulaire affectation, pour un modele, quand j'ai plusieurs valeurs de cochées dans la liste, j'ai le résultat suivant couleur : couleur1; couleur5; couleur9;
Je voudrais juste prendre ces couleurs et les passer dans une liste au formulaire NEUVE
Merci-
Une liste déroulante n'autorise pas de sélection multiple (car elle fonctionne au 'clic'), une zone de liste l'autorise (et il faut paramétrer dans l'onglet 'autres', la valeur 'étendu' au champ 'sélection multiple'.
Le nom de formulaire est bien entendu celui où est la liste dont on veut récupérer les valeurs.
Ensuite, on peut concaténer une chaine pour la mettre en source d'une zone de liste, déroulante, cette fois...
-
-
bah la table NEUVE!
j'ai fait dans la table NEUVE un élément couleur_neuve et en type de donnée je lui ai mis zone de liste déroulante. Maintenant il y a le champs contenu que l'on peut remplir manuellement pour faire une liste ac ces valeurs! et c'est ce contenu que je voudrais remplir.
Mais je ne sais pas si on peut directement agir sur la table ou seulement sur le formulaire. -
taliste.rowsourcetype = "Liste valeurs"
taliste.rowsource = "color1;color5;color8"
Tu vireras le dernier ";" de ta chaîne, ça peut gêner (des fois, ça met une ligne à blanc)...
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
merci!
valeur "étendue" mise en place
Je pense savoir comment faire pour la concaténation et placer ensuite la chaine dans les valeurs de la liste (c'est déjà ça :D)
mon probleme se situe au niveau du code
il faut créer une procédure ou une fonction pr le code?
quand ce code doit-il s'exécuter et comment?
(dsl mais je vois pas trop comment fonctionne le VBa avec acces :s) -
U_u j'avais créer un module comme un idiot...
Merci pour ce petit rappel ;)
j'ai donc réussi a appliquer le code (après tout ce temps c'est pas très glorieux xD) mais as Control n'est pas pris en charge :S (cela vient-il de la version?)
De plus lorsque le code s'exécute je vois apparaitre des caractères "ÿ", "?"
J'ai essayé de prendre la valeur mais ca ne marche pas non plus...-
Quand ton code est planté, va voir dans ta fenêtre de VBA le menu Outils/références, pour voir s'il en manque une...
Sinon, tu remplaces 'control' par 'variant', c'est un type de données qui peut tout accepter.
De plus lorsque le code s'exécute je vois apparaitre des caractères "ÿ", "?"
ah ben, là, je vois pas...
-
-
j'ai réussi!!
J'ai remplacé control par variant, puis
MsgBox MonCtl.Column(0, Element)
par
MsgBox MonCtl.Column(2, Element)
car j'en ai deduis que 0 c'était les checkbox, 1 l'id de la couleur et 2 le nom de la couleur...
et résultat ca marche!
Merci pour le temps que tu m'as consacré! Je vais maintenant m'attaquer à les envoyer dans l'autre formulaire donc il ne devrait pas y avoir de nouveaux posts avant demain ;)
Merci -
ouai c'est ce que je me suis dis! Mais sinon c'est quoi la propriété du contenu d'une liste déroulante?
y a t'il une facon pour que je puisse mettre ma chaine concaténée "color1; color5; color8;" directement dans le contenu? -
bon j'ai changé de méthode, je vais directement écrire la liste dans une liste déroulante dans la table!
Pour ca j'identifie l'id de la voiture auquel correspond les couleurs sélectionnées, de facon à assigner les valeurs au bon modèle par la suite
Private Sub ID_COULEUR_Exit(Cancel As Integer) Dim ID As Variant ID = Forms!F_AFFECTATION!ID_VOITURE MsgBox ID 'vérif Dim MonCtl As Control Dim Element As Variant Dim Suite As String Set MonCtl = Forms![F_AFFECTATION]![ID_COULEUR] For Each Element In MonCtl.ItemsSelected MsgBox MonCtl.Column(2, Element) 'vérif Suite = Suite + MonCtl.Column(2, Element) + "; " Next MsgBox Suite 'vérif
jusque là tout roule :D
Maintenant comment peut-on accéder au contenu de la table?
Tables!T_NEUVES!COULEUR_NEUVE.RowSource (je me doute que ce n'est pas ca mais c'est pour montrer mon incapacité ><).
Je pense que c'est le dernier point a résoudre :D -
je vais directement écrire la liste dans une liste déroulante dans la table!
Je vois pas : une liste déroulante est un contrôle access, une tables contient des infos, pas des contrôles access...
Maintenant comment peut-on accéder au contenu de la table?
Quelle table ?
-
merci sérieux je ne sais pas comment je ferais sans toi :s heureusement qu'il y a des gens comme toi pour donner de leur temps! J'essaye de suite
bon j'ai vu qu'il fallait se pencher sur le DAO donc je m'y met ;) -
La collection table contient des fields, qui ont chacun des propriétés : name, value...
Ca devrait faire un truc comme ça :
for each matable in mabase.tabledef
for each monchamp in matable
msgbox monchamp.name & " " & monchamp.value
next
next
Mais je suis pas trop sûr de la syntaxe. -
Tiens, j'ai creusé un peu, ce code sort la liste des champs de la table 'T_couleurs' avec leurs attributs :
Private Sub Commande0_Click() Dim T As DAO.TableDef Dim F As DAO.Field Dim P As DAO.Property Set base = CurrentDb() 'Set T = CurrentDb.TableDef("T_couleurs") For Each T In CurrentDb.TableDefs If T.Name = "T_couleurs" Then For Each F In T.Fields For Each P In F.Properties MsgBox "Champ " & F.Name & " - Attribut : " & P.Name & ", Valeur = " & LitProp(F, P.Name) Next Next End If Next End Sub Private Function LitProp(Objet As Object, Propriete As String) As String On Error GoTo err: LitProp = Objet.Properties(Propriete) err: End Function
Ca peut faire un bon début, avec ça en complément :
http://officesystem.access.over-blog.com/article-16105316.html
<edit>
C'était avant que je trouve le truc ultime :
https://access.developpez.com/sources/?page=dev#ListerTablesChamp
-
le résultat que j'obtenais étais beaucoup moins performant^^
grace au code que tu m'as fourni il ne me reste plus qu'à modifier RowSource avec du SQL donc ca devrait se faire sans problème!
Je te remercie pour ton aide -
bon j'ai choisi l'option de créer une table temporaire, ou j'enregistre ID et Suite pr ensuite les insérer dans l'autre mais j'ai un problème lors de la création :s
Dim tbl As DAO.TableDef Dim fld As DAO.Field Set tbl = CurrentDb.CreateTableDef("Temp") Set tdf = CurrentDb.TableDefs("Temp") tdf.Field.Append tdf.CreateField("id_temp", dbLong) 'erreur 3420 objet incorrect ou non défini?? tdf.Field.Append tdf.CreateField("color_temp", dbText, 200) tdf!id_temp.Properties.Append tdf.CreateProperty("RowSource", dbLong, ID) tdf!color_temp.Properties.Append tdf.CreateProperty("RowSource", dbText, Suite)
je comprends pas... -
bon j'ai avancé mais le problème est que je n'arrive pas à enregistrer les données dans cette table temporaire...
Dim ID As Variant ID = Forms!F_AFFECTATION!ID_VOITURE MsgBox ID 'vérif Dim base As DAO.Database Set base = CurrentDb() Dim MonCtl As Control Dim MaListe As ListBox Dim Element As Variant Dim Suite As String Set MonCtl = Forms![F_AFFECTATION]![ID_COULEUR] For Each Element In MonCtl.ItemsSelected MsgBox MonCtl.Column(2, Element) 'vérif Suite = Suite + MonCtl.Column(2, Element) + "; " Next MsgBox Suite 'vérif Dim tdf As DAO.TableDef Dim fld As DAO.Field Set tdf = base.CreateTableDef("Temp") Set fld = tdf.CreateField("id_temp", dbLong) fld.OrdinalPosition = 1 fld.DefaultValue = ID 'ne marche pas tdf.Fields.Append fld Set fld = tdf.CreateField("color_temp", dbText) fld.OrdinalPosition = 2 fld.Size = 255 fld.Required = True fld.AllowZeroLength = False fld.DefaultValue = Suite 'ne marche pas tdf.Fields.Append fld MsgBox "La table " & fld.DefaultValue & " a été créée" Dim T As DAO.TableDef Dim F As DAO.Field Dim P As DAO.Property Set T = CurrentDb.TableDefs("T_NEUVES") For Each T In CurrentDb.TableDefs If T.Name = "T_NEUVES" Then For Each F In T.Fields If F.Name = "COULEUR_NEUVE" Then For Each P In F.Properties If P.Name = "RowSource" Then T!COULEUR_NEUVE.Properties.Append T.CreateProperty("RowSource", dbText, "SELECT color_temp FROM Temp WHERE id_temp = ID_NEUVE;") End If Next End If Next End If Next Set fld = Nothing Set tdf = Nothing Set T = Nothing Set F = Nothing Set P = Nothing -
Une question me tracasse : tu veux faire quoi, au juste, qui nécessite une table temporaire ?
-
^^ je me suis rabattu sur cette option car je n'arrivais pas à créer une requete SQL pour mettre la chaine suite dans le contenu de ma liste de la table T_NEUVES, car pour une requete SQL il faut choissir l'origine de la source (from) or ma variable Suite n'est dans aucune table ou requete! C'est pourquoi je voulais la placer dans une table temporaire... :s
-
non c'est la table , neuve que je veux remplir!
la table affectation me permet de définir quelles couleurs seront assignées à chaque modèle. C'est cette suite de couleurs que je récupère dans Suite.
Maintenant j'aimerais l'envoyer dans T_NEUVE --> COULEUR_NEUVE qui est une liste déroulante.
j'ai essayé avec : UPDATE T_NEUVES SET COULEUR_NEUVE = Suite WHERE ID = ID_NEUVE;
mais ca ne marche pas :s -
j'ai pensé a rajouter une condition pour tester si l'ID_NEUVE était égale à ID comme ca :
For Each T In CurrentDb.TableDefs If T.Name = "T_NEUVES" Then For Each F In T.Fields If F.Name = "ID_NEUVE" Then If F.Value = ID Then //FAUX If F.Name = "COULEUR_NEUVE" Then For Each P In F.Properties If P.Name = "RowSource" Then T!COULEUR_NEUVE.Properties.Append T.CreateProperty("RowSource", dbText, Suite) End If Next End If End If End If Next End If Next
j'ai un pb au niveau du text de la condition de l'ID...
- 1
- 2
Suivant