FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 17 mars 2013 

 
OuvrirSommaireFormulairesContrôlesZones de liste et zones de liste modifiable

Il suffit de paramétrer convenablement la largeur des colonnes et celle de la liste.

Créé le 25 octobre 2004  par Drosera

Il faut utiliser l'événement NotInList de la zone de liste :

 
Sélectionnez
Private Sub MaListe_NotInList(NewData As String, Response As Integer)
    Response = acDataErrContinue
End Sub
Créé le 25 octobre 2004  par Team Access
 
Sélectionnez

Dim VarLr As Variant
For Each VarLr In Me!MaListe.ItemsSelected
    Me!MaListe.Selected(VarLr) = False
Next VarLr
Créé le 25 octobre 2004  par Rdesfx

En VBA bibliothèque Access :

 
Sélectionnez

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 :

 
Sélectionnez

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 
Créé le 25 octobre 2004  par Maxence HUBICHE


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 à :

 
Sélectionnez

Msgbox MaZoneDeListe.ListCount
Mis à jour le 29 août 2006  par Team Access

Sélectionner la première ligne :

 
Sélectionnez
Me.Modifiable = Me.Modifiable.ItemData(0)  

Sélectionner la dernière ligne :

 
Sélectionnez
Me.Modifiable = Me.Modifiable.ItemData(Me.Modifiable.ListCount - 1) 
Créé le 3 septembre 2004  par gripoil

Lien : Comment sélectionner une ligne d'une zone de liste en VBA ?

Sélectionner la première ligne :

 
Sélectionnez
Me.Liste.Selected(0) = True  

Sélectionner la dernière ligne :

 
Sélectionnez
Me.Liste.Selected(Me.Liste.ListCount - 1) = True  
Créé le 3 septembre 2004  par gripoil

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).

Mis à jour le 28 mai 2008  par Papy Turbo

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.

 
Sélectionnez

' Me.Refresh sert dans le cas  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
Mis à jour le 10 octobre 2005  par Demco, FRED.G

Il suffit de modifier la propriété RowSource de la zone de liste modifiable :

 
Sélectionnez
Me.MaListe.RowSource = "Select ...."
Créé le 12 mai 2004  par Demco
 
Sélectionnez
MsgBox Me.MaListe.ListIndex
Créé le 1er avril 2004  par Demco

NouvelElement est l'élément à ajouter à la liste :

 
Sélectionnez
Me!MyList.RowSource=Me!MyList.RowSource & ";NouvelElement"

Pour ajouter plusieurs éléments :

 
Sélectionnez
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.

Créé le 29 décembre 2003  par Team Access

Sachant que l'indice de la première colonne est 0 :

 
Sélectionnez
NomListe.Column(PositionDeLaColonne -1)

Donc pour la colonne 2 on aura :

 
Sélectionnez
NomListe.Column(1)
Créé le 29 décembre 2003  par Demco

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.

Créé le 1er avril 2003  par Team Access

Exemple de code pour un bouton appelé cmdSelectAll et une liste lstRes :

 
Sélectionnez
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 
Créé le 3 septembre 2004  par cafeine
 
Sélectionnez
Private Sub MaListeModifiable_BeforeUpdate(Cancel As Integer)
    Cancel = True
End Sub
Créé le 1er janvier 2005  par Gaël Donat

Voici une petite fonction qui peut faire l'affaire :

 
Sélectionnez
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 :

 
Sélectionnez
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.

Créé le 10 mai 2005  par Tofalu

Sur l'événement Touche Appuyée de la zone de liste :

 
Sélectionnez
Private Sub Maliste_KeyDown(KeyCode As Integer, Shift As Integer)
   KeyCode = 0
End Sub
Créé le 10 mai 2005  par Tofalu

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.

 
Sélectionnez
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 :

 
Sélectionnez
Private Sub Commande0_Click()
MsgBox verifliste(Me.ZL3, "toto")
End Sub
Créé le 10 mai 2005  par Tofalu

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 :

 
Sélectionnez
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 :

 
Sélectionnez
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) :

 
Sélectionnez
Private Sub lstville_AfterUpdate()
Me.lstRue.Value = Null
Me.lstRue.Requery
End Sub
Créé le 10 mai 2005  par Petogaz

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 :
 
Sélectionnez
Select TVille.ID, TVille.Nom From TVille Where TVilles.IDPays = Forms!F_Geographie.lstPays

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é :

 
Sélectionnez

Private Sub lstPays_Change()
Me.lstVille.Requery
End Sub

Et le tour est joué !

Créé le 20 novembre 2005  par Demco

Lien : À quoi correspond le Me. que je vois devant le nom de certains objets dans des lignes de code ?

 
Sélectionnez

MaZoneDeListe.RowSource = ""
Créé le 20 novembre 2005  par Demco

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 :

 
Sélectionnez

NomListe.Column(PositionDeLaColonne -1, PositionDeLaLigne -1)

Donc pour la colonne 2, ligne 3 on aura :

 
Sélectionnez

NomListe.Column(1,2)
Créé le 20 novembre 2005  par Tofalu

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.
 
Sélectionnez

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
Créé le 14 mai 2006  par FRED.G


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).

Créé le 14 octobre 2007  par Rom4u

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 :

 
Sélectionnez
Private Sub Modifiable_GotFocus()
Me.Modifiable.Dropdown
End Sub
Créé le 14 octobre 2007  par Faw

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.

 
Sélectionnez

					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.

 
Sélectionnez

				Private Sub Détail_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
	    		Me.cmdTest.SetFocus
				End Sub
			
Mis à jour le 15 mai 2011  par Philippe JOCHMANS

Lien : Comment dérouler une liste modifiable lors de sa réception du focus ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.