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→Zones de liste et zones de liste modifiable Trucs et AstucesDans l'événement Avant Mise à jour de votre liste, collez ceci (en prenant soin de remplacer lstChamps par le nom de votre zone de liste) :
On Error GoTo GestErr
Static lngItems() As Long
Dim lngLoop As Long
Dim varItems As Variant
lstChamps.Selected(0) = False
lstChamps.Selected(1) = False
If lstChamps.ItemsSelected.Count > 10 Then
Cancel = True
' Désactiver tous les champs
For lngLoop = 2 To lstChamps.ListCount - 1
lstChamps.Selected(lngLoop) = False
Next
' Réactiver uniquement la sélection précédente
For lngLoop = 0 To UBound(lngItems)
lstChamps.Selected(lngItems(lngLoop)) = True
Next
Else
' Redéfinir la sélection en cours
ReDim lngItems(lstChamps.ItemsSelected.Count - 1)
For lngLoop = 0 To lstChamps.ItemsSelected.Count - 1
lngItems(lngLoop) = lstChamps.ItemsSelected(lngLoop)
Next
Cancel = False
End If
FinProg:
Exit Sub
GestErr:
If Err.Number = 91 Then
For lngLoop = 0 To lstChamps.ListCount
lstChamps.Selected(lngLoop) = False
Next
End If
Resume FinProg
Pour ajouter "[Tous]" (ou tout autre texte) en premier choix d'une zone de liste
(déroulante ou pas), il est possible d'utiliser une requête UNION dans la propriété
Contenu (RowSource) du contrôle.
Imaginons que l'on veuille afficher et trier toutes les valeurs du champ Champ1 de la table Table1, mais faire précéder ces valeurs par la mention "[Tous]", le SQL notre requête pourrait être :
SELECT A.Champ1
FROM (SELECT B.Champ1, 1 AS IndexTri FROM Table1 AS B
Union
SELECT TOP 1 "[Tous]", 0 FROM Table1 AS C) AS A
ORDER BY A.IndexTri, A.Champ1- EnTête (Type : String; Null Interdit : Oui ; chaîne vide autorisée : Non ; Index : Sans doublon) ;
- IndexTri (Type : Byte; Null Interdit : Oui ; Valeur par défaut : 0 ; Valide Si : =0).
On utilise cette table en créant un enregistrement pour chaque valeur d'entête que l'on veut rendre disponible dans sa base, par exemple :
[Tous]
[Toutes]
[Aucun]
...Ensuite, le SQL de notre requête Union servant pour la source de nos listes ressemblera à :
SELECT A.Champ1
FROM (SELECT B.Champ1, 1 AS Position FROM Table1 AS B
Union
SELECT TableListe.Entête, TableListe.IndexTri FROM TableListe WHERE TableListe.Entête="[Tous]") AS A
ORDER BY A.IndexTri, A.Champ1
À noter aussi, concernant les performances, que d'une manière générale, pour les requêtes complexes
ou ciblant plusieurs dizaines ou centaines de milliers d'enregistrements, il est préférable
d'enregistrer sa requête plutôt que d'exécuter à la volée son équivalent SQL
(si les tables sources bénéficient d'index). Dans ce dernier cas, on n'écrira plus l'instruction
SQL dans la propriété RowSource de la zone de liste, mais simplement le nom de la requête enregistrée.
Le but d'une application est de durer dans le temps, sans avoir à retoucher le code à chaque changement d'année.
Souvent on choisit une année à l'aide d'une liste déroulante, ce que l'on fait c'est que dans la propriété Contenu (RowSource) on saisit les années.
Ce que je vous propose, c'est que cela soit fait automatiquement.
Dans les deux cas que je vais vous proposer, il faut que la propriété Origine Source de la liste déroulante soit à Listes Valeurs.
Version Access 2002, 2003 :
Private Sub cboAnnee_GotFocus()
Dim i As Integer
Me.cboAnnee.RowSource = ""
For i = 1 To 5
Me.cboAnnee.AddItem Year(DateAdd("yyyy", i - 2, Date))
Next i
End Sub
Version Access 97 et 2000 :
Je vous propose cette version, car la méthode Additem n'est apparue qu'à partir de 2002.
Private Sub cboAnnee2_GotFocus()
Dim i As Integer
Dim strSource As String
For i = 1 To 5
strSource = strSource & ";" & Year(DateAdd("yyyy", i - 2, Date))
Next i
Me.cboAnnee2.RowSource = Right(strSource, Len(strSource) - 1)
End SubEn 2007, ces exemples vont vous donner cinq années, de 2006 à 2010. L'année suivante, en 2008, vous aurez donc de 2007 à 2011. Etc.



