IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021 

 
OuvrirSommaireFormulairesContrôlesZones de liste et zones de liste modifiableZones de liste et zones de liste modifiable Trucs et Astuces

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

 
Sélectionnez
    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
Créé le 10 mai 2005  par Maxence HUBICHE


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 :

 
Sélectionnez
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
Remarque : pour optimiser les performances on peut, le cas échéant, créer une table permanente (appelons la TableListe) avec les deux champs suivants :
  • 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 :

 
Sélectionnez
[Tous]
[Toutes]
[Aucun]
...

Ensuite, le SQL de notre requête Union servant pour la source de nos listes ressemblera à :

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

Mis à jour le 14 octobre 2007  par FRED.G

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 :

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

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

Créé le 14 octobre 2007  par Philippe JOCHMANS

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