FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
 Sommaire→Formulaires→Contrôles→Zones de liste et zones de liste modifiable
Sommaire→Formulaires→Contrôles→Zones de liste et zones de liste modifiable- 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) 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 SubDim VarLr As Variant
For Each VarLr In Me!MaListe.ItemsSelected
    Me!MaListe.Selected(VarLr) = False
Next VarLrEn 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 SubEn 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 SubMaZoneDeListe.Value = NullLien : 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.ListCountSé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) = TrueSélectionner la dernière ligne :
Me.Liste.Selected(Me.Liste.ListCount - 1) = TrueLien : 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.RequeryIl suffit de modifier la propriété RowSource de la zone de liste modifiable :
Me.MaListe.RowSource = "Select ...."MsgBox Me.MaListe.ListIndexNouvelElement 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 SubCommand 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 SubPrivate Sub MaListeModifiable_BeforeUpdate(Cancel As Integer)
    Cancel = True
End SubVoici 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 FunctionUtilisation :
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 SubCette 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 FunctionUtilisation :
Vérifier que toto fait ou non partie de la zone de liste ZL3 :
Private Sub Commande0_Click()
MsgBox verifliste(Me.ZL3, "toto")
End SubCré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 SubEt 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 SubLien : 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 SubEnsuite 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 SubLien : Comment dérouler une liste modifiable lors de sa réception du focus ?




