Le grenier Access

Aller au contenu | Aller au menu | Aller à la recherche

Formulaires - Listes

Fil des billets - Fil des commentaires

jeudi 8 juillet 2010

Liste des tables - Version 2

Voici une suite à l'article "Liste des tables" paru l'année dernière. Dans cette article, il était question d'afficher la liste des tables Access dans la fenêtre Exécution. Question d'un lecteur sur cet article : "peut-on faire autre chose de cette liste, au lieu de simplement l'afficher dans la fenêtre Exécution ?". Voici qui devrait donner de nouvelles pistes...

Lire la suite...

mercredi 11 février 2009

Afficher des colonnes extraites d'une liste déroulante

J'ai mis en place une liste déroulante sur un formulaire, mais celle-ci ne m'affiche qu'une seule valeur. Comment faire apparaître dans le formulaire les autres colonnes de la liste ?

Dans l'exemple ci-dessous, une liste affiche différents clients. Après le choix d'un client, il faudrait afficher le code client (ce qui est automatiquement géré par la liste déroulante), mais également le nom et le prénom du client.

Mise en place

L'une des méthodes pour récupérer la valeur d'une colonne de liste déroulante consiste à créer un champ calculé.
On suppose que vous vous avez construit la liste déroulante. Pour afficher les 2 autres colonnes de cette liste, procédez comme suit :

  1. Ouvrez votre formulaire en mode Création.
  2. Cliquez sur votre liste déroulante.
  3. Cliquez sur l'icône Propriétés en haut de l'écran
  4. Dans la boîte de propriétés, cliquez sur l'onglet Autres.
  5. Cliquez dans la propriété "Nom", et donnez un nom à votre liste déroulante (par ex. : lstClients). 
  6. Si nécessaire, faites apparaître la boîte à outils, via le menu Affichage / Boîte à outils.
  7. Cliquez sur l'icône Zone de texte puis cliquez quelque part sur le formulaire (une zone de texte indépendante devrait apparaître).
  8. Cliquez dans cette zone, et tapez : =[lstClients].Column(1)
  9. Cliquez sur l'icône Zone de texte puis cliquez à nouveau sur le formulaire.
  10. Cliquez dans cette zone, et tapez : =[lstClients].Column(2)
  11. Vous pouvez également, via la boîte de propriétés, donner des noms plus clairs à vos 2 zones de texte (par ex. : txtNom et txtPrenom).

Notes
  • La fonction Column() sera peut-être retraduite en français par Access.
  • Les colonnes sont numérotées de 0 à n-1 (dans mon exemple, les numéros de clients représentent la colonne 0, les noms la colonne 1, et les prénoms la colonne 2).

mardi 10 février 2009

Ajouter un élément statique à une liste déroulante

Dans un formulaire, j'ai une liste déroulante indépendante (basée sur une liste de valeurs tapées manuellement, et non pas basée sur une table). Je souhaiterais en VBA ajouter des éléments à cette liste. Comment faire ?

Info
Si votre liste déroulante est alimentée par une table, consultez plutôt cet autre article.

Lire la suite...

mardi 30 septembre 2008

Présélection dans une liste déroulante

Dans une liste déroulante, comment faire en sorte que le 1er élément soit automatiquement sélectionné ? Et le dernier ?

Sélectionner le 1er élément de la liste

Pour que le premier élément de la liste soit automatiquement sélectionné :

  1. Faites apparaître les propriétés de la liste déroulante (clic droit / Propriétés), particulièrement l'onglet Données.
  2. Réglez la valeur par défaut en y tapant :
    =[Nom de la liste].ItemData(0)

Sélectionner le dernier élément de la liste

Si vous souhaitez au contraire que ce soit le dernier élément de la liste qui soit sélectionné, tapez :
=[Nom de la liste].ItemData([Nom de la liste].ListCount-1)

Sélectionner un élément quelconque par sa valeur

Imaginez une liste de clients. Vous savez que le client Tartempion porte le numéro 100 (sachant que le numéro est la clef primaire de la table Clients). Dans ce cas, il suffit de renseigner ce numéro comme valeur par défaut.

mercredi 25 juin 2008

Manipuler les colonnes d'une liste

Dans un formulaire, j'ai une liste (déroulante ou non). Comment obtenir des informations sur la ligne sélectionnée ?

La liste

Voici un formulaire contenant une liste d'acteurs.
Lorsqu'on clique sur le bouton Afficher, on obtient une boîte avec certaines informations données par la liste.

La liste est un objet Zone de liste, ou ListBox ; on aurait pu aussi utiliser un objet Liste déroulante, ou ComboBox (le principe est le même). La liste se nomme lstActeurs, et elle a été construite via l'Assistant Zone de liste. Pour information, la requête SQL qui l'alimente est :

SELECT [tbl Acteurs].[Numéro Acteur],
  [tbl Acteurs].[Nom Acteur],
  [tbl Acteurs].[Prénom Acteur],
  [tbl Acteurs].Sexe
FROM [tbl Acteurs]
ORDER BY [tbl Acteurs].[Nom Acteur],
  [tbl Acteurs].[Prénom Acteur];

Toujours pour info, voici quelques autres propriétés typiques de la liste :

  • Nom = lstActeurs
  • Nbre colonnes = 4
  • En-têtes colonnes = Non
  • Largeurs colonnes = 0cm;3cm;3.5cm;1cm
    La première colonne - [Numéro Acteur] - a une taille de 0 cm, elle est donc masquée.
  • Origine source = Table/Requête
  • Contenu = SELECT ... (la requête SQL ci-dessus)
  • Colonne liée = 1
    Ceci implique que, lorsqu'on sélectionne un acteur, la liste prend pour valeur le numéro de cet acteur (soit le 1er champ de la requête SQL).

Le bouton

Le bouton placé sous la liste affiche les informations sélectionnées dans la liste. Voici le code de son événement Sur clic :

Private Sub btnAffichage_Click()
' Vérifier si un acteur a bien été sélectionné
If Me.lstActeurs.ListIndex = -1 Then
  MsgBox "Aucune ligne n'a été sélectionnée !", vbInformation
  Exit Sub
End If

' Afficher quelques infos sur l'acteur
MsgBox "Ligne sélectionnée : " & Me.lstActeurs.ListIndex & vbCrLf _
  & "Nombre de lignes : " & Me.lstActeurs.ListCount & vbCrLf _
  & "Numéro de l'acteur : " & Me.lstActeurs.Column(0) & vbCrLf _
  & "Nom de l'acteur : " & Me.lstActeurs.Column(1) & vbCrLf _
  & "Prénom de l'acteur : " & Me.lstActeurs.Column(2)
End Sub

Un peu d'explications

  • Si aucune ligne n'est sélectionnée, la propriété ListIndex de la liste vaut -1 (on en profite ici pour sortir de la procédure).
    Sinon, elle donne le numéro de la ligne sélectionnée, sachant que la première ligne est numérotée 0.
  • La propriété ListCount, elle, donne le nombre de lignes dans la liste. Vous avez également une propriété ColumnCount qui donne... le nombre de colonnes (dingue, non ?).
  • La propriété Column(x) renvoie la valeur de la colonne x, pour la ligne sélectionnée, sachant que x démarre également à 0. Donc lstActeurs.Column(0) donne le numéro de l'acteur sélectionné (même si cette colonne est masquée). Et ainsi de suite...
  • Column() peut s'écrire également avec 2 paramètres au lieu d'un seul. Dans ce cas, le premier paramètre est toujours le numéro de colonne, le second est le numéro de la ligne. Donc l'instruction MsgBox Me.lstActeurs.Column(1, 3) afficherait le nom (2ème colonne) de l'acteur numéro 4 dans la liste.
  • Vous pouvez en fait simplifier Me.lstActeurs.Column(0) en écrivant seulement Me.lstActeurs. Vous obtiendrez la même valeur, du fait que la première colonne - donc la colonne 0 ! - donne sa valeur à la liste (rappelez-vous de la propriété Colonne liée, plus haut).
Rappel
La constante vbCrLf provoque un retour à la ligne dans la boîte MsgBox.

mercredi 3 octobre 2007

Liste à sélection multiple

Comment mettre en place une liste à sélection multiple, et la gérer en Visual Basic ?

Construire la liste

On suppose qu'une table Clients (par exemple) est créée.

  1. Ouvrez un formulaire en mode Création.
  2. Si nécessaire, faites apparaître la boîte à outils (par le menu Affichage / Boîte à outils ou l'icône ).
  3. Vérifiez que l'Assistant Contrôle  est activé.
  4. Cliquez sur l'icône Liste modifiable  puis cliquez sur le formulaire.
  5. Suivez les étapes de l'assistant pour construire votre liste, basée sur la table Clients.
  6. Une fois la liste terminée, cliquez dessus (le formulaire étant toujours en mode Création) puis faites apparaître ses propriétés en cliquant sur l'icône 
  7. Dans les propriétés de l'onglet Autres, donnez à la propriété Nom la valeur lstClients.
  8. Toujours dans ces propriétés, donnez à la propriété Sélection multiple la valeur Simple (ou Etendu).

Si vous testez maintenant votre formulaire, il est possible de sélectionner plusieurs clients dans la liste.

Lister les éléments sélectionnés

  1. Réouvrez le formulaire en mode Création.
  2. Créez maintenant un bouton de commande (sans assistant).
  3. Grâce aux propriétés, nommez le bouton btnListe.
  4. Dans l'événement Sur clic du bouton, tapez le code suivant, qui se charge d'afficher l'un après l'autre les clients sélectionnés (ou un message d'avertissement si aucun client n'a été sélectionné) :
Private Sub btnListe_Click()
  Dim varI As Variant

  If Me.lstClients.ItemsSelected.Count = 0 Then
    MsgBox "Aucun client n'a été sélectionné"
  Else
    For Each varI In Me!lstClients.ItemsSelected
      MsgBox Me!lstClients.ItemData(varI)
    Next varI
  End If
End Sub
A vous maintenant d'aménager pour en faire bon usage ! Vous pouvez par exemple vous en servir pour filtrer un formulaire ou un état (voir les commandes OpenForm ou OpenReport). Pour plus de détails, consultez bien sûr l'aide d'Access concernant la collection ItemsSelected et la propriété ItemData.

Ouvrir un formulaire en fonction de la sélection

Allez, à la demande générale, voici un exemple complémentaire : le listing ci-dessus est aménagé pour ouvrir un formulaire en fonction des clients sélectionnés.
Private Sub btnListe_Click()
  Dim varI As Variant
  Dim strFiltre As String

  strFiltre = ""
  If Me.lstClients.ItemsSelected.Count = 0 Then
    MsgBox "Aucun client n'a été sélectionné"
  Else
    For Each varI In Me!lstClients.ItemsSelected
      If strFiltre <> "" Then strFiltre = strFiltre & " OR "
        strFiltre = strFiltre & "[Numéro Client]='" & _
          Me!lstClients.ItemData(varI) & "'"
      Next varI
      DoCmd.OpenForm "frm Clients", acNormal, , strFiltre
  End If
End Sub
Quelques compléments :
  • Le formulaire à ouvrir s'appelle frm Clients, le champ sur lequel s'établit le filtre est [Numéro Client].
  • Les clients sélectionnés sont combinés par un OU (OR) : il s'agit d'ouvrir le formulaire en cherchant l'un des clients sélectionnés. Remplacez éventuellement le OR par un AND si vous souhaitez cumuler les critères (ici, ça n'aurait aucun sens).
  • Nous avons supposé que les critères de filtre étaient de type Texte. Si vous filtrez sur un champ numérique, supprimez les apostrophes dans la ligne qui construit le filtre.

jeudi 27 septembre 2007

Ajouter un élément dans une liste déroulante

J'ai une liste déroulante basée sur une table. Si l'utilisateur tape une valeur qui ne figure pas dans la liste, je voudrais l'ajouter automatiquement dans la table (et dans la liste). Comment faire ?

L'événement NotInList

La liste déroulante est dotée d'un événement Sur absence dans liste (NotInList). Voici comment l'utiliser :

  1. Créez une table comportant un champ Intitulé, de type Texte. Nommez cette table tblIntitulés. Renseignez éventuellement quelques valeurs dans cette table, à titre d'essai.
  2. Créez ensuite un formulaire (non basé sur la table tblIntitulés).
  3. Sur le formulaire, placez une liste déroulante, qui sera construite sur la table tblIntitulés.
  4. Faites apparaître les propriétés de la liste déroulante (par un clic droit sur la liste). Définissez le nom (cmbListe par exemple), et réglez la propriété Limiter à liste sur Oui (sinon, l'événement Sur absence dans liste ne sera pas déclenché).
  5. Enfin, écrivez le code Visual Basic suivant dans l'événement Sur absence dans liste :
Private Sub cmbListe_NotInList(NewData As String, _
  Response As Integer)
  Dim rst As DAO.Recordset

  If MsgBox("L'élément [" & _
    NewData & "] ne figure pas dans la liste. Voulez-vous l'ajouter ?", _
    vbQuestion + vbYesNo) = vbYes Then
      ' Ajouter l'élément à la liste
      Set rst = CurrentDb.OpenRecordset("tblIntitulés")
      rst.AddNew
        rst!Intitulé = NewData
      rst.Update
      rst.Close
      Set rst = Nothing
End If

' Annuler le message d'erreur d'Access
Response = acDataErrAdded
End Sub
Important
L'exemple de code ci-dessus fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit être associée à votre base de données pour que le programme fonctionne.
 
Pour plus de détails sur les références, consultez cette page.

Quelques compléments

  • Le code Visual Basic ajoute l'élément nouveau dans la table (via un Recordset), puis définit la variable Response à acDataErrAdded de façon à ce que le message d'erreur d'Access ne se produise pas et que la liste soit mise à jour.
  • L'événement NotInList ne reçoit qu'un seul argument NewData. Ca veut dire que le bout de code ci-dessus n'est pratique que si la table à alimenter ne contient qu'un seul champ (l'intitulé, ici). S'il s'agit d'une table plus complexe, il vaut mieux prévoir un formulaire pour l'alimenter.
  • Pour plus de détails, consultez l'aide en ligne sur l'objet Recordset et sur l'événement NotInList.

mercredi 5 septembre 2007

Listes déroulantes liées

Comment combiner 2 listes déroulantes, de façon à ce qu'un choix dans la première filtre automatiquement la seconde ?

Dans l'exemple ci-dessous, une liste propose les différentes activités   possibles pour un client (Plongée, Pêche, Cabotage...). La seconde liste n'affiche que les clients liés à cette activité.

Info
Il y a plusieurs manières de réaliser cette synchronisation de listes. Cet article décrit l'approche graphique, avec le moins de programmation possible.

Lire la suite...

mardi 4 septembre 2007

Liste auto-déroulante

Comment dérouler automatiquement une liste lorsqu'on clique dessus ou lorsqu'on s'y déplace avec le clavier ?

  1. Ouvrez votre formulaire en mode Création.
  2. Faites un clic droit sur la liste déroulante, puis sur l'option Propriétés.
  3. Cliquez sur l'onglet Autres pour vérifier le nom de la liste déroulante (par ex. : cmbPays)
  4. Cliquez sur l'onglet Evénements.
  5. Définissez l'événement Sur réception focus sur Procédure événementielle.
  6. Cliquez sur les points de suspension à droite de Procédure événementielle.
  7. Tapez le code suivant :
Me![cmbPays].DropDown