[Access] Liste déroulante
Otis07
Messages postés
3
Statut
Membre
-
incaout Messages postés 347 Date d'inscription Statut Membre Dernière intervention -
incaout Messages postés 347 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je me présente, je suis en école d'ingénieur et je dois réaliser un jeu de carte ( Le UNO) sous Access sans avoir de cours d'informatique. Je me suis donc lancer dans l'interface, et sa se passe plutôt bien. Cependant, lorsqu'on va commencer une partie, je souhaite que le joueur ai un nom. J'ai donc mi une liste déroulante pour que le joueur marque son nom ou en choisissent un existant.
Mais, j'aimerai que ce nom soit sauvegarder lorsqu'on valide la saisie... Faut il utiliser un code spécial par rapport a cette liste déroulante, ou faut-il lier une table a cette liste et comment faire.
Merci de votre aide par avance.
Je me présente, je suis en école d'ingénieur et je dois réaliser un jeu de carte ( Le UNO) sous Access sans avoir de cours d'informatique. Je me suis donc lancer dans l'interface, et sa se passe plutôt bien. Cependant, lorsqu'on va commencer une partie, je souhaite que le joueur ai un nom. J'ai donc mi une liste déroulante pour que le joueur marque son nom ou en choisissent un existant.
Mais, j'aimerai que ce nom soit sauvegarder lorsqu'on valide la saisie... Faut il utiliser un code spécial par rapport a cette liste déroulante, ou faut-il lier une table a cette liste et comment faire.
Merci de votre aide par avance.
A voir également:
- [Access] Liste déroulante
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Liste déroulante google sheet - Accueil - Guide bureautique
- Site dangereux liste - Guide
4 réponses
Salut.
Il faut utiliser l'événement "Not in list" associé à ta liste déroulante modifiable. Si le nom saisi ne figure pas dans la liste, il sera ajouté automatiquement via cet événement. Il faut que la liste soit liée à une table et que la colonne de la liste soit liée ou dépendante du champ dans lequel le nom sera ajouté (pas sur d'être très clair sur ce coup là.)
Voici un bout de code qui devrait t'aider
Private Sub Nomdemaliste_NotInList(NewData As String, Response As Integer)
'Ajoute la saisie de l'utilisateur à la liste des joueurs
Dim db As Database
Dim enr As Recordset
Set db = Application.CurrentDb
Set enr = db.OpenRecordset("Nomdematable", dbOpenTable, dbAppendOnly)
Response = acDataErrAdded
' Ajoute la chaîne de l'argument NouvDonnée au contenu.
With enr
.AddNew
.Fields("Nomduchamp").Value = NewData
.Update
End With
Set db = Nothing
Set enr = Nothing
End Sub
Il faut remplacer Nomdemaliste par le nom de ta liste déroulante, Nomdematable par le nom de la table où tu veux stocker les noms des joueurs et Nomduchamp par le nom du champ dans la table où sont enregistrés les noms.
Bon courage
IC
Il faut utiliser l'événement "Not in list" associé à ta liste déroulante modifiable. Si le nom saisi ne figure pas dans la liste, il sera ajouté automatiquement via cet événement. Il faut que la liste soit liée à une table et que la colonne de la liste soit liée ou dépendante du champ dans lequel le nom sera ajouté (pas sur d'être très clair sur ce coup là.)
Voici un bout de code qui devrait t'aider
Private Sub Nomdemaliste_NotInList(NewData As String, Response As Integer)
'Ajoute la saisie de l'utilisateur à la liste des joueurs
Dim db As Database
Dim enr As Recordset
Set db = Application.CurrentDb
Set enr = db.OpenRecordset("Nomdematable", dbOpenTable, dbAppendOnly)
Response = acDataErrAdded
' Ajoute la chaîne de l'argument NouvDonnée au contenu.
With enr
.AddNew
.Fields("Nomduchamp").Value = NewData
.Update
End With
Set db = Nothing
Set enr = Nothing
End Sub
Il faut remplacer Nomdemaliste par le nom de ta liste déroulante, Nomdematable par le nom de la table où tu veux stocker les noms des joueurs et Nomduchamp par le nom du champ dans la table où sont enregistrés les noms.
Bon courage
IC
Merci de ta réponse aussi rapide, je vais essayer de comprendre ta réponse et de l'adapter a mon problème, merci beaucoup.
J'ai essayé ton code, mais rien ne se passe, peut être parce que quelque chose m'échappe. J'ai donc fait des recherches et je suis tombé sur ceci ( ListeDeroulanteNomJoueur est le nom de ma zone de liste déroulante):
Private Sub ListeDeroulanteNomJoueur_AfterUpdate()
Const NB_ITEMS As Long = 20 'Nombre d'éléments archivés dans la liste
Dim b As Byte
'Maj de la liste des derniers critères recherchés
With ListeDeroulanteNomJoueur
'Si la valeur saisie est un Null _
ou une chaîne de longeur nulle _
ou égale au premier item, _
alors aucune Maj de la liste n'est nécessaire.
If Nz(.Value, "") = "" Or .Value = .Column(0, 0) Then Exit Sub
'Etant donné qu'on ne souhaite pas de doublons, _
on va parcourir tous les éléments _
pour éliminer un éventuel doublon avant d'ajouter notre valeur en haut de liste.
For b = 1 To .ListCount - 1
If .Column(0, b) = .Value Then .RemoveItem b: Exit For
Next b
'Ajoute la nouvelle saisie
.AddItem Item:=.Value, Index:=0
'Limite la liste à NB_ITEMS éléments
If .ListCount = NB_ITEMS Then .RemoveItem NB_ITEMS - 1
End With
End Sub
Mais des problèmes subsistent:
-Lorsque je rentre en nom dans ma liste, et que je valide en appyuant sur "entrer", j'ai un message d'erreur "erreur d'execution '6' Depassement de capacité' et la ligne " For b = 1 To .ListCount - 1" se met en surbrillance jaune.
-J'ai donc supprimer cette partie qui evite les doublons. Le code marche mais en fait je souhaite que les noms soient conservés si l'on change de formulaire, or ce n'est pas le cas. Il s'accumule que si l'on ne change pas de formulaire. Comment faire pour les sauvegarder?
Private Sub ListeDeroulanteNomJoueur_AfterUpdate()
Const NB_ITEMS As Long = 20 'Nombre d'éléments archivés dans la liste
Dim b As Byte
'Maj de la liste des derniers critères recherchés
With ListeDeroulanteNomJoueur
'Si la valeur saisie est un Null _
ou une chaîne de longeur nulle _
ou égale au premier item, _
alors aucune Maj de la liste n'est nécessaire.
If Nz(.Value, "") = "" Or .Value = .Column(0, 0) Then Exit Sub
'Etant donné qu'on ne souhaite pas de doublons, _
on va parcourir tous les éléments _
pour éliminer un éventuel doublon avant d'ajouter notre valeur en haut de liste.
For b = 1 To .ListCount - 1
If .Column(0, b) = .Value Then .RemoveItem b: Exit For
Next b
'Ajoute la nouvelle saisie
.AddItem Item:=.Value, Index:=0
'Limite la liste à NB_ITEMS éléments
If .ListCount = NB_ITEMS Then .RemoveItem NB_ITEMS - 1
End With
End Sub
Mais des problèmes subsistent:
-Lorsque je rentre en nom dans ma liste, et que je valide en appyuant sur "entrer", j'ai un message d'erreur "erreur d'execution '6' Depassement de capacité' et la ligne " For b = 1 To .ListCount - 1" se met en surbrillance jaune.
-J'ai donc supprimer cette partie qui evite les doublons. Le code marche mais en fait je souhaite que les noms soient conservés si l'on change de formulaire, or ce n'est pas le cas. Il s'accumule que si l'on ne change pas de formulaire. Comment faire pour les sauvegarder?
Salut.
En fait, si tu veux enregistrer les informations de la liste, soit tu utilises un fichier soit une table. Dans ce cas, avant toute chose, tu initialises ta liste en la chargeant avec les données lues dans le fichier ou dans une table d'une base de données.
Avant de fermer le formulaire, tu enregistres les nouvelles valeurs dans le fichier ou la table.
Mais normalement l'événement NotInList sert à ajouter la saisie utilisateur au contenu d'une liste et aussi dans la table à laquelle la liste est liée.
Pour que le code que je t'ai donné fonctionne, il faut que ta base de données Access contienne une table "Joueurs" par exemple qui contienne elle même 2 champs "IdJoueur" et "NomJoueur"
IdJoueur est de type autoincrémenté
NomJoueur est de type chaine (string)
Il te faut ensuite une liste modifiable nommée par exemple LM_Joueurs. Les propriétés suivantes doivent être définies comme suit pour cette liste
"Nombre de colonnes" = 2
"Largeur des colonnes" = 0cm;3cm
"Source controle" = "NomJoueur"
"Origine source" = "table/requete"
"Contenu" = "SELECT IdJoueur, NomJoueur FROM Joueurs ORDER BY NomJoueur ASC"
"Colonne liée"= 1
"Limiter à la liste" = oui
Ensuite, il faut que le formulaire dans lequel se situe cette zone de liste soit associé à une requête qui renvoie les champs IdJoueur et NomJoueur, sinon tu auras des problèmes, je pense avec la propriété "source controle" de la zone de liste.
Et enfin, tu associes le code suivant à l'événement NotInList
Private Sub LM_Joueurs_NotInList(NewData As String, Response As Integer)
'Ajoute la saisie de l'utilisateur à la liste des joueurs
Dim db As Database
Dim enr As Recordset
Set db = Application.CurrentDb
Set enr = db.OpenRecordset("Joueurs", dbOpenTable, dbAppendOnly)
Response = acDataErrAdded
' Ajoute la chaîne de l'argument NouvDonnée au contenu.
With enr
.AddNew
.Fields("NomJoueur").Value = NewData
.Update
End With
Set db = Nothing
Set enr = Nothing
End Sub
Et normalement, quand tu saisis un nom qui n'est pas dans la liste, il est ajouté automatiquement à la liste et à la table Joueurs. Désolé, mais c pas évident à expliquer en ligne.
Bon courage
IC
En fait, si tu veux enregistrer les informations de la liste, soit tu utilises un fichier soit une table. Dans ce cas, avant toute chose, tu initialises ta liste en la chargeant avec les données lues dans le fichier ou dans une table d'une base de données.
Avant de fermer le formulaire, tu enregistres les nouvelles valeurs dans le fichier ou la table.
Mais normalement l'événement NotInList sert à ajouter la saisie utilisateur au contenu d'une liste et aussi dans la table à laquelle la liste est liée.
Pour que le code que je t'ai donné fonctionne, il faut que ta base de données Access contienne une table "Joueurs" par exemple qui contienne elle même 2 champs "IdJoueur" et "NomJoueur"
IdJoueur est de type autoincrémenté
NomJoueur est de type chaine (string)
Il te faut ensuite une liste modifiable nommée par exemple LM_Joueurs. Les propriétés suivantes doivent être définies comme suit pour cette liste
"Nombre de colonnes" = 2
"Largeur des colonnes" = 0cm;3cm
"Source controle" = "NomJoueur"
"Origine source" = "table/requete"
"Contenu" = "SELECT IdJoueur, NomJoueur FROM Joueurs ORDER BY NomJoueur ASC"
"Colonne liée"= 1
"Limiter à la liste" = oui
Ensuite, il faut que le formulaire dans lequel se situe cette zone de liste soit associé à une requête qui renvoie les champs IdJoueur et NomJoueur, sinon tu auras des problèmes, je pense avec la propriété "source controle" de la zone de liste.
Et enfin, tu associes le code suivant à l'événement NotInList
Private Sub LM_Joueurs_NotInList(NewData As String, Response As Integer)
'Ajoute la saisie de l'utilisateur à la liste des joueurs
Dim db As Database
Dim enr As Recordset
Set db = Application.CurrentDb
Set enr = db.OpenRecordset("Joueurs", dbOpenTable, dbAppendOnly)
Response = acDataErrAdded
' Ajoute la chaîne de l'argument NouvDonnée au contenu.
With enr
.AddNew
.Fields("NomJoueur").Value = NewData
.Update
End With
Set db = Nothing
Set enr = Nothing
End Sub
Et normalement, quand tu saisis un nom qui n'est pas dans la liste, il est ajouté automatiquement à la liste et à la table Joueurs. Désolé, mais c pas évident à expliquer en ligne.
Bon courage
IC