{Access} récupérer valeur liste -> VBA [Résolu/Fermé]

Signaler
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
-
 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

22 réponses

Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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.
5
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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.
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
Compris.

Il faut aller dans les propriétés de la table, se positionner sur le champ voulu et voir ses propriétés pour les modifier, le cas échéant. J'ai jamais fait ça en VBA, mais c'est possible.
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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)...
Enfin quelqu'un qui répond à la question propriété de contenu
Merci à toi pour ton aide
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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)
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
La programmation VBA est évènementielle, c'est-à-dire que c'est à toi de dire quand tu voudras faire cette récupération de couleurs...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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...
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
En fait, ce sont les colonnes de la liste, elles sont toutes adressables même si elles ne sont pas affichées...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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?
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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 ?
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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 ;)
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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.
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
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
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
Une question me tracasse : tu veux faire quoi, au juste, qui nécessite une table temporaire ?
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
^^ 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
Messages postés
23763
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
13 janvier 2020
3 024
Je viens de reprendre depuis le début, tu cherches juste à remplir la table affectation, non ?

Donc ça ne devrait être que la création de lignes dans cette table avec un .addnew, suite au choix de l'utilisateur...

Ou j'ai rien compris...
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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
Messages postés
226
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
28 octobre 2011
42
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...