FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Comment éliminer la barre de défilement horizontale lors de l'utilisation d'une zone de liste sur plusieurs colonnes ?
- Comment dans une zone de liste modifiable, supprimer le message d'erreur "le texte entré n'appartient pas à la liste" ?
- Comment désélectionner les valeurs d'une liste à choix multiples ?
- Comment proposer d'ajouter une valeur manquante dans la table source d'une liste déroulante ?
- Comment remettre l'affichage d'une zone de liste modifiable à blanc ?
- Comment connaître le nombre de lignes d'une zone de liste ?
- Comment sélectionner une ligne d'une zone de liste modifiable en VBA ?
- Comment sélectionner une ligne d'une zone de liste en VBA ?
- Pourquoi est-il impossible de changer la valeur d'une liste ou boîte de texte ?
- Comment rafraîchir les données de ma zone de liste ?
- Comment modifier la requête source d'une zone de liste modifiable ?
- Comment savoir quelle ligne d'une zone de liste modifiable est sélectionnée ?
- Comment ajouter un ou des éléments à une zone de liste ?
- Comment récupérer la valeur d'une colonne de la ligne sélectionnée dans une zone de liste ?
- Comment autoriser plusieurs sélections dans une zone de liste ?
- Comment sélectionner tous les éléments d'une zone de liste en VBA ?
- Comment empêcher la mise à jour (modification) d'une zone de liste modifiable tout en permettant la sélection de ligne dans la liste ?
- Comment sélectionner une ligne dans une zone de liste en fonction du texte d'une de ses colonnes ?
- Comment empêcher la saisie au clavier dans une zone de liste ?
- Comment vérifier qu'une valeur existe dans une zone de liste ?
- Comment faire correspondre deux zones de liste ?
- Comment faire en sorte que le contenu d'une zone de liste déroulante dépende de la valeur d'une autre liste ?
- Comment vider le contenu une zone de liste modifiable ?
- Comment récupérer la valeur d'une colonne dans une zone de liste pour une ligne quelconque ?
- Comment archiver les dernières valeurs saisies dans une liste ? (Pratique pour les champs de recherche.)
- Comment conserver la sélection lors d'un affichage de requêtes dans zones de liste ?
- Comment dérouler une liste modifiable lors de sa réception du focus ?
- Comment dérouler une liste déroulante sur le survol de la souris ?
- 7.1.1.1. Zones de liste et zones de liste modifiable Trucs et Astuces (3)
Il suffit de paramétrer convenablement la largeur des colonnes et celle de la liste.
Il faut utiliser l'événement NotInList de la zone de liste :
Private
Sub
MaListe_NotInList
(
NewData As
String
, Response
As
Integer
)
Response
=
acDataErrContinue
End
Sub
Dim
VarLr As
Variant
For
Each
VarLr In
Me!MaListe.ItemsSelected
Me!MaListe.Selected
(
VarLr) =
False
Next
VarLr
En VBA bibliothèque Access :
Private
Sub
Modifiable0_NotInList
(
NewData As
String
, Response
As
Integer
)
If
MsgBox
(
"Voulez-vous ajouter "
&
NewData &
" à la liste des prénoms ?"
, _
vbYesNo
+
vbQuestion
+
vbDefaultButton2
, "Ajout"
) =
vbYes
Then
DoCmd.RunSQL
"INSERT INTO tblPrenoms ( Prénom ) SELECT """
&
NewData &
""";"
Response
=
acDataErrAdded
Else
Response
=
acDataErrContinue
Modifiable0.Undo
End
If
End
Sub
En VBA bibliothèque ADO :
Private
Sub
Modifiable0_NotInList
(
NewData As
String
, Response
As
Integer
)
dim
cn as
adodb.connection
set
cn =
currentproject.connection
If
MsgBox
(
"Voulez-vous ajouter "
&
NewData &
" à la liste des prénoms ?"
, _
vbYesNo
+
vbQuestion
+
vbDefaultButton2
, "Ajout"
) =
vbYes
Then
cn.execute
"Insert into tblPrenoms values(\'"
&
NewData &
"\');"
Response
=
acDataErrAdded
Else
Response
=
acDataErrContinue
Modifiable0.Undo
End
If
End
Sub
MaZoneDeListe.Value
=
Null
Lien : Comment vider le contenu une zone de liste modifiable ?
La propriété ListCount d'une zone de liste (ou de zone de liste modifiable) retourne le nombre d'éléments de celle-ci.
Vous pouvez donc interroger cette propriété avec une syntaxe similaire à :
Msgbox
MaZoneDeListe.ListCount
Sélectionner la première ligne :
Me.Modifiable
=
Me.Modifiable.ItemData
(
0
)
Sélectionner la dernière ligne :
Me.Modifiable
=
Me.Modifiable.ItemData
(
Me.Modifiable.ListCount
-
1
)
Lien : Comment sélectionner une ligne d'une zone de liste en VBA ?
Sélectionner la première ligne :
Me.Liste.Selected
(
0
) =
True
Sélectionner la dernière ligne :
Me.Liste.Selected
(
Me.Liste.ListCount
-
1
) =
True
Lien : Comment savoir quelle ligne d'une zone de liste modifiable est sélectionnée ?
Lien : Comment sélectionner une ligne d'une zone de liste modifiable en VBA ?
1- Regardez si le contrôle n'est pas verrouillé, dans les propriétés Données > Verrouillé ou, en VBA : NomControle.Locked = False.
2- Vérifiez que la source du contrôle (propriété Données > Source contrôle) n'est pas liée à un champ calculé (non modifiable).
La source elle-même ne doit évidemment contenir aucun calcul (type <= [Nom] & " " & [Prénom]>, ou bien <= [PrixUnitaire] * [Quantite]>).
3- Vérifiez si le formulaire n'est pas verrouillé, propriétés Données > Modif autorisée = Non ou, en VBA, NomFormulaire.AllowEdits = False.
4- Vérifiez que la propriété Données > Type Recordset du formulaire n'est pas un Instantané (non modifiable), mais bien un Recordset dynamique.
("Feuille de réponse dynamique" ou bien "Feuille rép.dyn.(MAJ globale)").
5- Vérifiez que la requête source du formulaire (propriété Données > Source du formulaire) n'est pas verrouillée (parce que trop complexe ?),
en l'ouvrant directement et en essayant d'y modifier une valeur dans le champ source de ce contrôle (celui du point 2).
Vous possédez une zone de liste contenant les données d'une table.
Vous insérez alors une ligne dans cette même table, mais elle n'apparaît pas dans la liste.
Il suffit de rafraîchir les données de la zone de liste en utilisant la méthode requery.
' Me.Refresh sert dans le cas où le contenu de la zone de liste
' prend en compte les données actuelles du formulaire.
' Comme par exemple si une zone de liste utilise dans sa requête source
' la valeur d'une autre zone de liste du formulaire.
Me.Refresh
Me.MaZoneListe.Requery
Il suffit de modifier la propriété RowSource de la zone de liste modifiable :
Me.MaListe.RowSource
=
"Select ...."
MsgBox
Me.MaListe.ListIndex
NouvelElement est l'élément à ajouter à la liste :
Me!MyList.RowSource
=
Me!MyList.RowSource
&
";NouvelElement"
Pour ajouter plusieurs éléments :
Private
Sub
Form_Open
(
Cancel As
Integer
)
' Initialisation de la liste, elle contient deux colonnes pays et ville
Me!list.ColumnHeads
=
True
Me!list.ColumnCount
=
2
Me!list.ColumnWidths
=
"4320;4320"
'on détermine la largeur des colonnes
Me!list.RowSource
=
"Pays;Capitale;Chine;Beijing;Brésil;Brasilia "
End
Sub
Private
Sub
Command_Click
(
)
Me!list.RowSource
=
Me!list.RowSource
&
";Nouveau pays;Nouvelle ville"
End
Sub
Command est le bouton que l'on presse pour ajouter les éléments à la liste.
Attention : il s'agit d'une liste de type Liste de valeurs.
Sachant que l'indice de la première colonne est 0 :
NomListe.Column
(
PositionDeLaColonne -
1
)
Donc pour la colonne 2 on aura :
NomListe.Column
(
1
)
Lien : Comment récupérer la valeur d'une colonne dans une zone de liste pour une ligne quelconque ?
Définir la propriété SelectionMultiple (MultiSelect) à "étendue" ou "simple" suivant la méthode de sélection souhaitée.
Exemple de code pour un bouton appelé cmdSelectAll et une liste lstRes
:
Private
Sub
cmdSelectAll_Click
(
)
Dim
i As
Long
For
i =
0
To
Me.lstRes.ListCount
-
1
Me.lstRes.Selected
(
i) =
True
Next
i
End
Sub
Private
Sub
MaListeModifiable_BeforeUpdate
(
Cancel As
Integer
)
Cancel =
True
End
Sub
Voici une petite fonction qui peut faire l'affaire :
Function
Selectionner
(
Liste As
ListBox, Colonne As
Integer
, Chercher As
String
)
Dim
i As
Integer
Dim
Trouve As
Boolean
For
i =
0
To
Liste.ListCount
-
1
If
Liste.Column
(
Colonne, i) =
Chercher And
Not
Trouve Then
Me.Liste.Selected
(
i) =
True
If
Liste.MultiSelect
=
0
Then
Trouve =
True
Else
Me.Liste.Selected
(
i) =
False
End
If
Next
i
End
Function
Utilisation :
Selectionner Liste0, 1
, "Monsieur"
Ceci sélectionne les valeurs Monsieur dans la deuxième colonne. Cela sélectionnera une ligne si la zone de liste n'accepte pas la sélection multiple ou bien plusieurs si elle le permet.
Sur l'événement Touche Appuyée de la zone de liste :
Private
Sub
Maliste_KeyDown
(
KeyCode As
Integer
, Shift As
Integer
)
KeyCode =
0
End
Sub
Cette fonction renvoie True si la valeur passée en paramètre est trouvée dans la zone de liste qui figure dans le premier paramètre.
Private
Function
verifliste
(
Liste As
ListBox, Valeur As
String
) As
Boolean
Dim
i As
Integer
For
i =
0
To
Liste.ListCount
-
1
If
Liste.ItemData
(
i) =
Valeur Then
verifliste =
True
Exit
Function
End
if
Next
i
End
Function
Utilisation :
Vérifier que toto fait ou non partie de la zone de liste ZL3 :
Private
Sub
Commande0_Click
(
)
MsgBox
verifliste
(
Me.ZL3
, "toto"
)
End
Sub
Créez votre formulaire. Placez la première liste déroulante qu'on nommera lstville et à l'aide de l'assistant récupérez le CP et le code section donc dans contenu vous devriez avoir une requête qui ressemble à ceci :
Select
DISTINCT [Table1].
[Code des sections], [Table1].CP
FROM [Tables1] Inner Join
[Table2] On
[Table1].
[Code des sections] =
[Table2].
[Code Section];
Cette requête vous permettra d'obtenir la liste de toutes les villes (en supposant qu'il s'agisse des CP puisqu'il n' y a pas de champ ville).
Ensuite pour la liste des rues qu'on nommera lstrue dans la propriété Arrow Données Arrow Contenu, mettez cette requête :
Select
DISTINCT [Table2].Rue
From [Table2]
Where (((
[Table2].
[Code Section])=
[forms]![formulaire1]![lstville]));
Où formulaire1 est le nom de votre formulaire. Pour terminer, il faut une mise à jour de votre 2e liste (lstRue) :
Private
Sub
lstville_AfterUpdate
(
)
Me.lstRue.Value
=
Null
Me.lstRue.Requery
End
Sub
Imaginons que nous ayons les zones de liste lstPays et lstVilles qui contiennent respectivement une liste de pays et une liste de villes.
Bien évidemment, lorsque nous sélectionnons un pays nous voulons que seules les villes appartenant à ce pays apparaissent dans lstVille.
Nous supposons que ces deux zones de liste sont basées sur les tables TPays et TVille, et qu'elles sont dans un formulaire que nous appellerons F_Geographie.
Une fois les deux zones de liste basées sur les deux tables, nous modifierons la source de données de lstVille :
- Propriétés ;
- onglet Données ;
- Contenu :
Select
TVille.ID, TVille.Nom From
TVille Where
TVilles.IDPays =
Forms!F_Geographie.lstPays
Où ID est l'identifiant de la ville, Nom son nom et IDPays la clé étrangère contenant l'identifiant du pays auquel appartient la ville.
Et comme vous l'aurez compris, Forms!F_Geographie.lstPays fait référence à la zone de liste lstPays appartenant au formulaire F_Geographie.
Il vous reste alors à rafraîchir les données de la zone de liste lstVille lorsqu'un nouveau pays est sélectionné :
Private
Sub
lstPays_Change
(
)
Me.lstVille.Requery
End
Sub
Et le tour est joué !
Lien : À quoi correspond le Me. que je vois devant le nom de certains objets dans des lignes de code ?
MaZoneDeListe.RowSource
=
""
Lien : Comment remettre l'affichage d'une zone de liste modifiable à blanc ?
Sachant que les indices de la première ligne et de la première colonne sont 0 :
NomListe.Column
(
PositionDeLaColonne -
1
, PositionDeLaLigne -
1
)
Donc pour la colonne 2, ligne 3 on aura :
NomListe.Column
(
1
,2
)
Lien : Comment récupérer la valeur d'une colonne de la ligne sélectionnée dans une zone de liste ?
Version : Office VBA >=2002 (à cause des méthodes AddItem et RemoveItem)
Description : ce code enregistre dans la liste d'une zone de liste déroulante, les valeurs saisies dans ce même contrôle.
- * La dernière valeur saisie est placée en haut de la liste.
- * Les doublons sont évités.
- * La constante NB_ITEMS permet de définir le nombre de valeurs archivées.
- * Les valeurs Null ou chaînes de longueur nulle sont ignorées.
- * Les valeurs saisies sont traitées sous le type String.
Conditions
- * La propriété RowSourceType doit être à Value List.
- * Les propriétés ColumnCount & BoundColumn doivent être à 1.
- * Dans cet exemple, la zone de liste s'appelle MyComboBox.
Private
Sub
MyComboBox_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
MyComboBox
' Si la valeur saisie est un Null _
ou une chaîne de longueur 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
' Étant 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
Lorsque l'on affiche une requête dans une zone de liste (propriété rowsource de la liste),
et que l'on change cette requête par programme (ordre de tri, filtre...) il suffit de déclarer
dans la propriété "colonne liée" de la zone de liste un champ unique (sans doublon).
Ainsi lors d'un changement d'ordre de tri ou autre, la ligne sélectionnée le reste
(pas besoin de faire de nouvelles recherches par boucle dans un Recordset par exemple).
Pour dérouler une liste modifiable lors de la réception du focus il faut dans son événement Réception Focus mettre ce code :
Private
Sub
Modifiable_GotFocus
(
)
Me.Modifiable.Dropdown
End
Sub
Lien : Comment dérouler une liste déroulante sur le survol de la souris ?
Le code suivant permet de donner le focus à la liste déroulante cboLaListe et de la dérouler, lors de son simple survol par la souris.
Private
Sub
cboLaliste_MouseMove
(
Button As
Integer
, Shift As
Integer
, X As
Single
, Y As
Single
)
With
Me.cboLaliste
.SetFocus
.Dropdown
End
With
End
Sub
Ensuite sur l'événement MouseMove de la zone détail du formulaire, mettre le focus sur un autre contrôle.
Private
Sub
Détail_MouseMove
(
Button As
Integer
, Shift As
Integer
, X As
Single
, Y As
Single
)
Me.cmdTest.SetFocus
End
Sub
Lien : Comment dérouler une liste modifiable lors de sa réception du focus ?