FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Dans 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
Sub
En 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.