Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

liste déroulante

5 réponses
Avatar
Leyley39
Bonjour

j'ai réalisé des menus déroulants qui interragissent entre eux, c'est-à-dire
que le choix dans le premier menu détermine la liste de choix du deuxième. Ca
fonctionne bien dans un formulaire simple mais ca se complique dans une
formulaire continu où plusieurs ligne d'enregistrements sont visible.
Tant que je change pas de choix dans le premier menu déroulant, tout va
bien. Cependant, si je fait une autre sélection dans le prmier menu
déroulant, mes choix dans le deuxième menu fait dans les enregistrements
précédents s'effacent du formulaire (et non de la table). C'est un problème
pour les utilisateurs qui croient que les enregistrements sont perdus. Si on
ouvre de nouveau le formulaire, les enregistrements réapparaissent. Troublant.

Voici mon code (ca concerne des secteurs scolaire et des niveaux soclaires) :

Private Sub cmbSecteurScolaire_AfterUpdate()
Dim IngIDCat As Long
Dim SQL As String

''Vérifie que l'on a cliqué sur un secteur pour éviter le null''
If Not IsNumeric(Me!cmbSecteurScolaire) Then Exit Sub
Me.Tag = Me.cmbSecteurScolaire.Value
''Affecte la valeur de IDSecteurScolaire à la variable IngIDCat''
IngIDCat = Me!cmbSecteurScolaire
''Construit la chaîne SQL avec le niveau concerné''
SQL = "SELECT IDNiveauScolaire, NiveauScolaire, IDSecteurScolaire FROM
Scolaire_Niveau WHERE IDSecteurScolaire = " & IngIDCat & ""

''Affecte la chaîne SQL à la liste des niveaux ''
cmbNiveauScolaire.RowSource = SQL
'' Déverrouille la liste des niveaux ''
cmbNiveauScolaire.Enabled = True
''Donne le focus la liste des niveaux''
cmbNiveauScolaire.SetFocus
''Déroule la liste des niveaux''
cmbNiveauScolaire.Dropdown
End Sub
--
Merci de votre aide

Leyley39

5 réponses

Avatar
TopJB
Bonjour,

J'ai déjà été confronté à ce problème, la solution que j'ai trouvé est
de mettre une zone de texte qui semblera être le résultat de ta liste
déroulante et de positionner juste la flèche de la liste déroulante à
coté de ce bouton.

Ensuite il faut que la zone de texte soit reliée à ta valeur dans ta
table et que sur la mise à jour de ta zone de liste tu mettes à jour le
champs dans ta table et dans ton formulaire (soit un refresh ou par code)

Ta zone de liste ne doit pas être liée à ta table de données.

Cela donne au final à l'utilisateur l'impression d'une liste déroulante
et tes enregistrements ne bouge pas dans le formulaire continu.

Cordialement

Leyley39 a écrit :
Bonjour

j'ai réalisé des menus déroulants qui interragissent entre eux, c'est-à-dire
que le choix dans le premier menu détermine la liste de choix du deuxième. Ca
fonctionne bien dans un formulaire simple mais ca se complique dans une
formulaire continu où plusieurs ligne d'enregistrements sont visible.
Tant que je change pas de choix dans le premier menu déroulant, tout va
bien. Cependant, si je fait une autre sélection dans le prmier menu
déroulant, mes choix dans le deuxième menu fait dans les enregistrements
précédents s'effacent du formulaire (et non de la table). C'est un problème
pour les utilisateurs qui croient que les enregistrements sont perdus. Si on
ouvre de nouveau le formulaire, les enregistrements réapparaissent. Troublant.

Voici mon code (ca concerne des secteurs scolaire et des niveaux soclaires) :

Private Sub cmbSecteurScolaire_AfterUpdate()
Dim IngIDCat As Long
Dim SQL As String

''Vérifie que l'on a cliqué sur un secteur pour éviter le null''
If Not IsNumeric(Me!cmbSecteurScolaire) Then Exit Sub
Me.Tag = Me.cmbSecteurScolaire.Value
''Affecte la valeur de IDSecteurScolaire à la variable IngIDCat''
IngIDCat = Me!cmbSecteurScolaire
''Construit la chaîne SQL avec le niveau concerné''
SQL = "SELECT IDNiveauScolaire, NiveauScolaire, IDSecteurScolaire FROM
Scolaire_Niveau WHERE IDSecteurScolaire = " & IngIDCat & ""

''Affecte la chaîne SQL à la liste des niveaux ''
cmbNiveauScolaire.RowSource = SQL
'' Déverrouille la liste des niveaux ''
cmbNiveauScolaire.Enabled = True
''Donne le focus la liste des niveaux''
cmbNiveauScolaire.SetFocus
''Déroule la liste des niveaux''
cmbNiveauScolaire.Dropdown
End Sub


Avatar
Leyley39
J'ai compris ton astuce. Très brillant. Mais comme je suis nule en code,
est-ce que tu pourrais me dire ce que je dois écrire dans le code de Après
Maj ?
--
Merci de votre aide

Leyley39


"TopJB" a écrit :

Bonjour,

J'ai déjà été confronté à ce problème, la solution que j'ai trouvé est
de mettre une zone de texte qui semblera être le résultat de ta liste
déroulante et de positionner juste la flèche de la liste déroulante à
coté de ce bouton.

Ensuite il faut que la zone de texte soit reliée à ta valeur dans ta
table et que sur la mise à jour de ta zone de liste tu mettes à jour le
champs dans ta table et dans ton formulaire (soit un refresh ou par code)

Ta zone de liste ne doit pas être liée à ta table de données.

Cela donne au final à l'utilisateur l'impression d'une liste déroulante
et tes enregistrements ne bouge pas dans le formulaire continu.

Cordialement

Leyley39 a écrit :
> Bonjour
>
> j'ai réalisé des menus déroulants qui interragissent entre eux, c'est-à-dire
> que le choix dans le premier menu détermine la liste de choix du deuxième. Ca
> fonctionne bien dans un formulaire simple mais ca se complique dans une
> formulaire continu où plusieurs ligne d'enregistrements sont visible.
> Tant que je change pas de choix dans le premier menu déroulant, tout va
> bien. Cependant, si je fait une autre sélection dans le prmier menu
> déroulant, mes choix dans le deuxième menu fait dans les enregistrements
> précédents s'effacent du formulaire (et non de la table). C'est un problème
> pour les utilisateurs qui croient que les enregistrements sont perdus. Si on
> ouvre de nouveau le formulaire, les enregistrements réapparaissent. Troublant.
>
> Voici mon code (ca concerne des secteurs scolaire et des niveaux soclaires) :
>
> Private Sub cmbSecteurScolaire_AfterUpdate()
> Dim IngIDCat As Long
> Dim SQL As String
>
> ''Vérifie que l'on a cliqué sur un secteur pour éviter le null''
> If Not IsNumeric(Me!cmbSecteurScolaire) Then Exit Sub
> Me.Tag = Me.cmbSecteurScolaire.Value
> ''Affecte la valeur de IDSecteurScolaire à la variable IngIDCat''
> IngIDCat = Me!cmbSecteurScolaire
> ''Construit la chaîne SQL avec le niveau concerné''
> SQL = "SELECT IDNiveauScolaire, NiveauScolaire, IDSecteurScolaire FROM
> Scolaire_Niveau WHERE IDSecteurScolaire = " & IngIDCat & ""
>
> ''Affecte la chaîne SQL à la liste des niveaux ''
> cmbNiveauScolaire.RowSource = SQL
> '' Déverrouille la liste des niveaux ''
> cmbNiveauScolaire.Enabled = True
> ''Donne le focus la liste des niveaux''
> cmbNiveauScolaire.SetFocus
> ''Déroule la liste des niveaux''
> cmbNiveauScolaire.Dropdown
> End Sub



Avatar
TopJB
Leyley39 a écrit :
J'ai compris ton astuce. Très brillant. Mais comme je suis nule en code,
est-ce que tu pourrais me dire ce que je dois écrire dans le code de Après
Maj ?



Bonjour,

Voila ce que j'ai fait trois champs dans mon formulaire.

- Le premier étant ton premier champ à mettre à jour (Liste déroulante1)
- Le second champ est un champ text avec comme valeur par défaut la
valeur de ta liste déroulante2 'me.ListeDeroulante2.column([Numéro de
colonne si ce n'est pas la première colonne de ta requête d'alimentation
de ta seconde liste déroulante])
- Le troisième champ que tu réduit pour ne laisser apparent que la
fléche est ta liste déroulante paramétré selon ta première liste.

Sur la première liste déroulante tu associe une table ou une requête
permettant de lister tes données possibles dans cette liste et le champ
correspondant dans ta table de stockage.

exemple : Sur le formulaire continu, tu as, je pense, une requête
Donc tu lie la ListeDeroulante1 au champ de ta requête
Ensuite tu créer ou utilise une requête pour alimenter la
ListeDeroulante1 avec les valeurs possibles, il faut que tu mettes aussi
le numéro de la colonne qui contient l'information qui te permet de
paramétrer ta seconde liste déroulante comme colonne liée dans le
propriétés.

Ensuite

tu créé ton champ Texte1 qui sera visible comme une zone indépendante de
ta requête de formulaire continu

Tu créé ensuite ta seconde liste déroulante ListeDeroulante2 que tu
position sous ton Texte1

tu mets comme valeur par défaut de ton champ Texte1
'me.ListeDeroulante2.column([Numéro de colonne si ce n'est pas la
première colonne de ta requête d'alimentation de ta seconde liste
déroulante]'

Tu créé ensuite ta seconde liste déroulante 'ListeDeroulante2'
Tu lie ce champ avec le champ de ta requête de formulaire continu
contenant la valeur à afficher

Puis sur l'événement réceptionFocus tu mets le code suivant (avec les
modif nécessaires biensûr)

Private Sub ListeDeroulante2_GotFocus()
'Vérification que la liste 1 n'est pas vide (Valeur sélectionnée)
If Not IsNull(Me.ListeDeroulante1) Then
'Mise à jour de la requête de sélection (Alimentation de la
liste déroulante 2)
Me.ListeDeroulante2.RowSource = "SELECT [CHAMPS] FROM [Table]
WHERE [Condition]"
end if
End Sub

L'événement après MAJ est OPTIONNEL
Sur l'événement Après MAJ tu mets le code suivant et ca devrait fonctionner

Private Sub ListeDeroulante2_AfterUpdate()
Me.Texte1.refresh 'ou me.texte1.requery
End Sub

Si ton application est comme je pense et comme décrite précédemment je
pense que ce code devrait te suffire tu auras donc une ListeDeroulante1
qui te permettra de conditionner ta ListeDeroulante2 et au moment de ta
mise à jour de ta ListeDeroulante2, ton champ Texte1 devrait se mettre à
jour. Par contre, tes autres lignes auront toujours les valeurs de
départ dans le champ Texte1 mais par contre ta liste déroulante n'aura
pas de valeur si ta valeur n'est pas dans cette nouvelle liste, seules
les lignes qui seront modifiées seront mise à jour. Les autres ne seront
pas modifiées.

je sais pas si je suis clair dans mes propos mais c'est pas si facile a
expliquer mon code est assez compliqué, mais tu dois avoir le nécessaire
dans ce que je t'ai donné ici.

Cordialement
Avatar
Leyley39
Bonjour TopJB

J'ai essayé ton code. Il doit me manquer un trucs. La liste déroulante2
fonctionne mais la zone de texte n'enregistre pas la sélection de la liste 2.
J'ai pourtant mis ce que tu m'as donné et mis en valeur par défault
me.nom_la_liste_2.column2

Il manque peut être un code à la zone de contrôle texte pour prendre en
compte la valeur sélectionné.
--
Merci de votre aide

Leyley39


"TopJB" a écrit :

Leyley39 a écrit :
> J'ai compris ton astuce. Très brillant. Mais comme je suis nule en code,
> est-ce que tu pourrais me dire ce que je dois écrire dans le code de Après
> Maj ?

Bonjour,

Voila ce que j'ai fait trois champs dans mon formulaire.

- Le premier étant ton premier champ à mettre à jour (Liste déroulante1)
- Le second champ est un champ text avec comme valeur par défaut la
valeur de ta liste déroulante2 'me.ListeDeroulante2.column([Numéro de
colonne si ce n'est pas la première colonne de ta requête d'alimentation
de ta seconde liste déroulante])
- Le troisième champ que tu réduit pour ne laisser apparent que la
fléche est ta liste déroulante paramétré selon ta première liste.

Sur la première liste déroulante tu associe une table ou une requête
permettant de lister tes données possibles dans cette liste et le champ
correspondant dans ta table de stockage.

exemple : Sur le formulaire continu, tu as, je pense, une requête
Donc tu lie la ListeDeroulante1 au champ de ta requête
Ensuite tu créer ou utilise une requête pour alimenter la
ListeDeroulante1 avec les valeurs possibles, il faut que tu mettes aussi
le numéro de la colonne qui contient l'information qui te permet de
paramétrer ta seconde liste déroulante comme colonne liée dans le
propriétés.

Ensuite

tu créé ton champ Texte1 qui sera visible comme une zone indépendante de
ta requête de formulaire continu

Tu créé ensuite ta seconde liste déroulante ListeDeroulante2 que tu
position sous ton Texte1

tu mets comme valeur par défaut de ton champ Texte1
'me.ListeDeroulante2.column([Numéro de colonne si ce n'est pas la
première colonne de ta requête d'alimentation de ta seconde liste
déroulante]'

Tu créé ensuite ta seconde liste déroulante 'ListeDeroulante2'
Tu lie ce champ avec le champ de ta requête de formulaire continu
contenant la valeur à afficher

Puis sur l'événement réceptionFocus tu mets le code suivant (avec les
modif nécessaires biensûr)

Private Sub ListeDeroulante2_GotFocus()
'Vérification que la liste 1 n'est pas vide (Valeur sélectionnée)
If Not IsNull(Me.ListeDeroulante1) Then
'Mise à jour de la requête de sélection (Alimentation de la
liste déroulante 2)
Me.ListeDeroulante2.RowSource = "SELECT [CHAMPS] FROM [Table]
WHERE [Condition]"
end if
End Sub

L'événement après MAJ est OPTIONNEL
Sur l'événement Après MAJ tu mets le code suivant et ca devrait fonctionner

Private Sub ListeDeroulante2_AfterUpdate()
Me.Texte1.refresh 'ou me.texte1.requery
End Sub

Si ton application est comme je pense et comme décrite précédemment je
pense que ce code devrait te suffire tu auras donc une ListeDeroulante1
qui te permettra de conditionner ta ListeDeroulante2 et au moment de ta
mise à jour de ta ListeDeroulante2, ton champ Texte1 devrait se mettre à
jour. Par contre, tes autres lignes auront toujours les valeurs de
départ dans le champ Texte1 mais par contre ta liste déroulante n'aura
pas de valeur si ta valeur n'est pas dans cette nouvelle liste, seules
les lignes qui seront modifiées seront mise à jour. Les autres ne seront
pas modifiées.

je sais pas si je suis clair dans mes propos mais c'est pas si facile a
expliquer mon code est assez compliqué, mais tu dois avoir le nécessaire
dans ce que je t'ai donné ici.

Cordialement



Avatar
TopJB
Bonjour,

Essaye "me.nom_la_liste_2.column(2)", n'oublies pas les '(' et ')'

Cordialement

Leyley39 a écrit :
Bonjour TopJB

J'ai essayé ton code. Il doit me manquer un trucs. La liste déroulante2
fonctionne mais la zone de texte n'enregistre pas la sélection de la liste 2.
J'ai pourtant mis ce que tu m'as donné et mis en valeur par défault
me.nom_la_liste_2.column2

Il manque peut être un code à la zone de contrôle texte pour prendre en
compte la valeur sélectionné.
--
Merci de votre aide

Leyley39


"TopJB" a écrit :

Leyley39 a écrit :
J'ai compris ton astuce. Très brillant. Mais comme je suis nule en code,
est-ce que tu pourrais me dire ce que je dois écrire dans le code de Après
Maj ?


Bonjour,

Voila ce que j'ai fait trois champs dans mon formulaire.

- Le premier étant ton premier champ à mettre à jour (Liste déroulante1)
- Le second champ est un champ text avec comme valeur par défaut la
valeur de ta liste déroulante2 'me.ListeDeroulante2.column([Numéro de
colonne si ce n'est pas la première colonne de ta requête d'alimentation
de ta seconde liste déroulante])
- Le troisième champ que tu réduit pour ne laisser apparent que la
fléche est ta liste déroulante paramétré selon ta première liste.

Sur la première liste déroulante tu associe une table ou une requête
permettant de lister tes données possibles dans cette liste et le champ
correspondant dans ta table de stockage.

exemple : Sur le formulaire continu, tu as, je pense, une requête
Donc tu lie la ListeDeroulante1 au champ de ta requête
Ensuite tu créer ou utilise une requête pour alimenter la
ListeDeroulante1 avec les valeurs possibles, il faut que tu mettes aussi
le numéro de la colonne qui contient l'information qui te permet de
paramétrer ta seconde liste déroulante comme colonne liée dans le
propriétés.

Ensuite

tu créé ton champ Texte1 qui sera visible comme une zone indépendante de
ta requête de formulaire continu

Tu créé ensuite ta seconde liste déroulante ListeDeroulante2 que tu
position sous ton Texte1

tu mets comme valeur par défaut de ton champ Texte1
'me.ListeDeroulante2.column([Numéro de colonne si ce n'est pas la
première colonne de ta requête d'alimentation de ta seconde liste
déroulante]'

Tu créé ensuite ta seconde liste déroulante 'ListeDeroulante2'
Tu lie ce champ avec le champ de ta requête de formulaire continu
contenant la valeur à afficher

Puis sur l'événement réceptionFocus tu mets le code suivant (avec les
modif nécessaires biensûr)

Private Sub ListeDeroulante2_GotFocus()
'Vérification que la liste 1 n'est pas vide (Valeur sélectionnée)
If Not IsNull(Me.ListeDeroulante1) Then
'Mise à jour de la requête de sélection (Alimentation de la
liste déroulante 2)
Me.ListeDeroulante2.RowSource = "SELECT [CHAMPS] FROM [Table]
WHERE [Condition]"
end if
End Sub

L'événement après MAJ est OPTIONNEL
Sur l'événement Après MAJ tu mets le code suivant et ca devrait fonctionner

Private Sub ListeDeroulante2_AfterUpdate()
Me.Texte1.refresh 'ou me.texte1.requery
End Sub

Si ton application est comme je pense et comme décrite précédemment je
pense que ce code devrait te suffire tu auras donc une ListeDeroulante1
qui te permettra de conditionner ta ListeDeroulante2 et au moment de ta
mise à jour de ta ListeDeroulante2, ton champ Texte1 devrait se mettre à
jour. Par contre, tes autres lignes auront toujours les valeurs de
départ dans le champ Texte1 mais par contre ta liste déroulante n'aura
pas de valeur si ta valeur n'est pas dans cette nouvelle liste, seules
les lignes qui seront modifiées seront mise à jour. Les autres ne seront
pas modifiées.

je sais pas si je suis clair dans mes propos mais c'est pas si facile a
expliquer mon code est assez compliqué, mais tu dois avoir le nécessaire
dans ce que je t'ai donné ici.

Cordialement