Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Accueil Access Forum Access F.A.Q Access F.A.Q VBA Tutoriels Sources Outils Livres Access TV Access 2007

De nouvelles listes pour vos formulaires Access

Date de publication : 17/02/2008 , Date de mise à jour : 17/02/2008

Par Philippe JOCHMANS (home page de Starec)
 

Le but de cet article est de vous montrer comment réaliser de nouvelles listes dans vos formulaires Access. Des zones de listes avec mise en forme conditionnelle et case à cocher, et des listes déroulantes avec mise en forme conditionnelle.

I. INTRODUCTION
II. PREREQUIS
III. UNE ZONE DE LISTE AVEC DES CASES A COCHER ET AVEC UNE MISE EN FORME CONDITIONNELLE ILLIMITE
III-A. Cahier des Charges
III-B. Préparation du terrain
III-B-1. Le contrôle OWC
III-B-2. Les boutons de commandes
III-C. Le code
III-C-1. Déclaration des variables
III-C-2. Préparation de la liste
III-C-3. Ajout des données
III-C-4. Finalisation de la liste
III-C-5. Les cases à cocher
III-C-6. Remise à zéro
III-C-7. Récupération de la sélection
IV. ZONE DE LISTE DEROULANTE AVEC UNE MISE EN FORME CONDITIONNELLE ILLIMITE
IV-A. Cahier des Charges
IV-A-1. Le contrôle OWC
IV-A-2. Le bouton de commande
IV-B. Le code
IV-B-1. Déclaration des variables
IV-B-2. Préparation de la liste
IV-B-3. Ajout des données et finalisation
IV-B-4. Dérouler et réduire la liste
IV-B-5. Récupération de la sélection
V. CONCLUSION
VI. TELECHARGEMENT
VII. REMERCIEMENTS


I. INTRODUCTION

Cet article a pour but de vous montrer comment réaliser une zone de liste avec des cases à cocher et un formatage particulier, ainsi qu'une liste déroulante avec formatage. Nous allons donc répondre à deux questions qui reviennent régulièrement dans le forum Access.

  • Comment mettre des cases à cocher dans une zone de liste.
  • Comment formater les lignes d'une zone de liste ou d'une liste déroulante.
En effet le contrôle zone de liste d'Access ne permet pas de réaliser les deux fonctions demandées, et les zones de listes déroulantes ne permettent pas le formatage conditionnel.

info La zone de liste Ms Forms 2.0 ListBox permet l'utilisation des cases à cocher.
Pour cela, nous allons utiliser un complément fourni gratuitement par Microsoft Microsoft Office Web Components.

Ce composant permet de faire 3 choses :

En fait, nous allons détourner le composant de sa fonction initiale pour lui faire faire d'autres choses, car ce composant est une feuille de calcul. Nous allons donc profiter d'une partie des propriétés héritées d'Excel.

Tous les essais et codes que vous trouverez ont été réalisés avec Access 2002.


II. PREREQUIS

Une bonne connaissance de VBA est nécessaire pour comprendre l'essentiel de cet article.

Bien que cet article soit pour une utilisation de notre composant sous Access, une bonne partie de code que vous verrez comprend du VBA Excel, une bonne connaissance est donc nécessaire pour la compréhension.

Pour l'implantation du composant et le chargement de celui-ci, je vous invite à aller voir l'article suivant : La mise en forme conditionnelle illimitée dans Access


III. UNE ZONE DE LISTE AVEC DES CASES A COCHER ET AVEC UNE MISE EN FORME CONDITIONNELLE ILLIMITE


III-A. Cahier des Charges

Réaliser une zone de liste représentant le personnel d'une société, cette liste devra permettre une sélection multiple (par case à cocher).

De plus, cette liste devra permettre de visualiser facilement les éléments suivants :

  • Les noms devront être classés par ordre alphabétique.
  • Chaque service devra avoir sa couleur.
En plus de la case à cocher, chaque sélection devra être mise en surbrillance et de couleur jaune (comme avec un surligneur).

On pourra grâce à un bouton remettre la liste dans sa position initiale.

info Vous trouverez cette zone de liste et tout son code dans le formulaire frm_ListeCaseCocher qui se trouve dans la base en téléchargement en bas de cet article.

III-B. Préparation du terrain

Le formulaire sera composé du composant OWC et de deux boutons de commandes.


III-B-1. Le contrôle OWC

Nous allons paramétrer le contrôle manuellement, cependant, dans le code du formulaire, vous trouverez le code pour le faire par programmation, il est toujours utile de connaître les deux.

Pour accéder aux propriétés du contrôle, il faut faire un clic droit (menu contextuel), et sélectionner Microsoft Office SpreadSheet xx.0, et dans le sous-menu sélectionner Commands et Options.

Onglet Feuille : Dans cet onglet nous allons décocher :

  • En-têtes de lignes (DisplayRowHeadings de l'objet Windows).
  • En-têtes de colonnes (DisplayColumnHeadings de l'objet Windows).
  • Quadrillage (DisplayGridlines de l'objet Windows).
  • Pour figer les volets, nous allons nous positionner sur la cellule A2, et cliquer sur l'icône Figer les volets.
Onglet Classeur : Dans cet onglet nous allons décocher :

  • Barre de défilement horizontale (DisplayGridlines de l'objet Windows).
  • Sélecteur de feuille (DisplayWorkbookTabs de l'objet Windows).
  • Barres d'outils (DisplayToolbar de l'objet SpreadSheet).
  • Nous allons supprimer les feuilles 2 et 3 pour ne garder que la feuille 1.
De plus nous nommerons le contrôle : spreadListe


III-B-2. Les boutons de commandes

Nous allons donc mettre deux boutons de commandes standard sur notre formulaire.

Réinitialisation de la liste :

  • Nom : cmdReset
  • Caption : RAZ
Affichage de la sélection :

  • Nom : cmdAffichageSelection
  • Caption : Affichage de la sélection

III-C. Le code

Nous allons maintenant décortiquer tout le code qui nous permettra de réaliser la zone de liste.


III-C-1. Déclaration des variables

Nous allons déclarer deux variables en entête du module de formulaire (elles seront donc accessibles partout dans celui-ci).

  • Public wksOwc As OWC10.Spreadsheet : Cette variable va représenter le composant feuille de calcul du composant OWC.
  • Public wksSheet As OWC10.Worksheet : Cette variable va représenter la feuille en elle-même.
Les affectations de ces deux variables se feront dans l'évènement Load de notre formulaire avant l'appel des routines qui permettront la réalisation de notre zone de liste.
VBA

Private Sub Form_Load()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : Form_Load
    ' DateTime      : 12/02/2008 19:00
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Au chargement on initilase wksOwc, et on lance les routines au fur et
    '                 à mesure
    '=======================================================================================
    
    ' ===== affectation =====
    Set wksOwc = Me.spreadListe.Object
    Set wksSheet = wksOwc.Worksheets("Feuille1")
    
    ' ===== formatage général du composant =====
    Call PrepaOWC
    
    Call AjoutDonnees
    
    Call FinalisationListe
    
End Sub
info Le fait de déclarer ces variables nous permettra de bénéficier de l'Intellisense.

III-C-2. Préparation de la liste

Nous allons ici voir le code qui permettra de préformater la liste.
VBA

Public Sub PrepaOWC()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : PrepaOWC
    ' DateTime      : 12/02/2008 18:59
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Cette routine va permettre de préparer le composant en enlevant ce
    '                 qui ne nous convient pas, et on prépare l'entête
    '=======================================================================================
    
   ' ===== préparation de l'aspect =====
    With wksOwc
        .DisplayToolbar = False                      ' on désactive la barre d'outils
        With .Windows(1)
            .DisplayHorizontalScrollBar = False      ' on désactive la barre de défilement horizontale
            .DisplayWorkbookTabs = False             ' on désactive la visualisation des onglets
            .DisplayColumnHeadings = False           ' on désactive les entêtes de colonnes
            .DisplayRowHeadings = False              ' on désactive les entêtes de lignes
            .DisplayGridlines = False                ' désactivation du quadrillage
        End With
        .Worksheets("Feuille2").Delete               ' on supprime la feuille 2
        .Worksheets("Feuille3").Delete               ' on supprime la feuille 3
        .Windows(1).ViewableRange = "A1:G200000"
    End With
    
    
    ' ===== on affecte les noms aux entêtes de colonnes =====
    With wksSheet
        .Range("A1").Value = "Choix"
        .Range("B1").Value = "ID"
        .Range("C1").Value = "Civilité"
        .Range("D1").Value = "Nom"
        .Range("E1").Value = "Prénom"
        .Range("F1").Value = "Service"
        .Range("G1").Value = "Fonction"
    End With
    
    ' ===== formatage de l'entête =====
    With wksOwc.Range("A1:G1")
        .Interior.Color = RGB(220, 200, 250)        ' on colorie l'entête en violet
        .Borders.LineStyle = xlContinuous           ' on encadre les cellules
        .Font.Bold = True                           ' on met le texte en gras
    End With
    
End Sub

Ce code nous permet donc de :

  • Préparer l'aspect de notre liste (barres, etc. ) par le code.
  • Mettre les entêtes de colonnes
  • Formater cette entête (couleur, police, cadrage).
info Nous avons figé les volets manuellement, ce qui permettra de laisser toujours notre entête visible.

III-C-3. Ajout des données

Nous allons maintenant ajouter les données à notre liste, pour cela nous allons utiliser la technologie DAO, et réaliser le remplissage de notre feuille.

info Vous trouverez les données dans la base en téléchargement.
VBA

Public Sub AjoutDonnees()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : AjoutDonnees
    ' DateTime      : 12/02/2008 20:01
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Cette procédure va permettre d'ajouter les données
    '=======================================================================================
    
    ' ===== déclaration =====
    Dim rst As DAO.Recordset
    Dim strSql As String
    Dim i As Long
    
    ' ===== affectation =====
    strSql = "SELECT tbl_Personnel.IdPersonnel, tbl_Civilite.strCivAbrege, tbl_Personnel.strNom, tbl_Personnel.strPrenom, " & _
             " tbl_Service.strService, tbl_Fonction.strFonction, tbl_Service.lngCouleur " & _
             "FROM tbl_Service INNER JOIN (tbl_Fonction INNER JOIN (tbl_Civilite INNER JOIN tbl_Personnel " & _
             "ON tbl_Civilite.IdCivilite = tbl_Personnel.IdCivilite) " & _
             "ON tbl_Fonction.IdFonction = tbl_Personnel.IdFonction) " & _
             "ON tbl_Service.IdService = tbl_Personnel.IdService " & _
             "ORDER BY tbl_Personnel.strNom;"
    Set rst = CurrentDb.OpenRecordset(strSql)
    
    ' ===== on met les données dans la feuille =====
    i = 2
    While Not rst.EOF
        With wksSheet
            ' affectation des données et formatage
            With .Range("A" & i)
                .HorizontalAlignment = xlHAlignCenter
                .Font.Bold = True
            End With
            .Range("B" & i).Value = rst("IdPersonnel")
            .Range("C" & i).Value = rst("strCivAbrege")
            .Range("D" & i).Value = rst("strNom")
            .Range("E" & i).Value = rst("strPrenom")
            .Range("F" & i).Value = rst("strService")
            .Range("G" & i).Value = rst("strFonction")
            ' on affecte à la ligne la couleur du service
            .Range("A" & i & ":G" & i).Interior.Color = rst("lngCouleur")
            ' on entoure les cellules
            .Range("A" & i & ":G" & i).Borders.LineStyle = xlContinuous
        End With
        i = i + 1
        rst.MoveNext
    Wend
    
    ' ===== libération =====
    rst.Close
    Set rst = Nothing
    
End Sub

Des petits commentaires s'imposent :

  • La requête SQL nous permet de récupérer toutes nos données dans les tables composants la base, vous noterez que nous récupérons le champ lngCouleur de la table tbl_Service. En effet, chaque service ayant sa propre couleur.
  • Ensuite grâce à une boucle While .. Wend, nous remplissons notre grille, et vous noterez donc que nos dernières lignes intègrent la couleur, et réalisent le quadrillage.

III-C-4. Finalisation de la liste

Nous allons maintenant finaliser notre liste.
VBA

Public Sub FinalisationListe()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : FinalisationListe
    ' DateTime      : 13/02/2008 05:21
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Le but de cette routine est de finaliser la liste
    '=======================================================================================
    
    Dim lngDerRow As Long
    lngDerRow = wksSheet.Range("B1").End(xlDown).Row
    
    ' ===== enlever les lignes et les colonnes non  remplies =====
    wksOwc.Windows(1).ViewableRange = "A1:G" & lngDerRow
    
    ' ===== réduire la colonne Id pour que celle-ci ne soit pas visible =====
    wksSheet.Range("B:B").ColumnWidth = 0
    
    ' ===== empêcher l'utilisateur de saisir dans la grille =====
    wksSheet.Protection.Enabled = True
    
End Sub

Ce code permet donc de (dans l'ordre) :

  • Récupérer la dernière ligne.
  • Enlever les lignes et les colonnes non remplies pour ne permettre que l'affichage des lignes nécessaires.
  • Mettre la largeur de la colonne B à 0 (pour cacher le champ ID qui est la clé).
  • Protéger la feuille pour éviter toute saisie.
Voici maintenant l'aspect final de notre liste.

info La largeur finale de la liste a été faite manuellement.

III-C-5. Les cases à cocher

Le but de notre liste (en plus de la mise en forme conditionnelle) est de nous permettre de faire des sélections qui doivent être représentées par des cases à cocher et les lignes doivent être mises en surbrillance (comme avec un surligneur).

Pour cela nous allons agir sur l'évènement Click du composant.

Voici donc le code qui va nous permettre de réaliser cette opération.
VBA

Private Sub spreadListe_Click()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : spreadListe_Click
    ' DateTime      : 13/02/2008 05:31
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Nous allons utiliser l'évènement click pour mettre la ligne en évidence
    '=======================================================================================
    
    ' ====== déclaration =====
    Dim lngRow As Long ' pour stocker la ligne sélectionnée
    
    ' ====== affectation =====
    lngRow = wksOwc.ActiveCell.Row
    
    ' ====== réalisation de la ligne sélectionnée sur le click ======
    If wksSheet.Range("A" & lngRow).Value = "x" Then
        ' on a déjà coché la case, donc on reprend les formatages d'origine
        wksSheet.Protection.Enabled = False
        With wksSheet
            .Range("A" & lngRow).Value = ""
            With .Range("A" & lngRow & ":G" & lngRow)
                .Interior.Color = CLng(DLookup("lngCouleur", "tbl_Service", "strService='" & wksSheet.Range("F" & lngRow).Value & "'"))
            End With
        End With
        wksSheet.Protection.Enabled = True
    Else
        ' on met en évidence la ligne et on coche la case
        wksSheet.Protection.Enabled = False
        With wksSheet
            .Range("A" & lngRow).Value = "x"
            With .Range("A" & lngRow & ":G" & lngRow)
                .Interior.Color = vbYellow
            End With
        End With
        wksSheet.Protection.Enabled = True
    End If
End Sub

Quelques commentaires sur le principe :

Nous allons donc dans la colonne A mettre la lettre x qui représentera une croix, donc de visualiser que la case est cochée.

Nous détectons si la cellule contient cette lettre x.

Si elle contient cette lettre :

  • On enlève le x et on met une chaîne vide.
  • On remet la couleur du service en cherchant dans la table tbl_Service la couleur correspondante à l'aide de la fonction de domaine DLookup
Si la cellule ne contient pas de x

  • Nous mettons un x dans la cellule A de la ligne
  • Nous mettons la couleur de fond de toute la ligne en jaune.
info Avant de réaliser les opérations de modification, nous déprotégeons la feuille, et ensuite nous la reprotégeons.
Voici donc le résultat visuel avec des lignes cochées.


III-C-6. Remise à zéro

Nous allons maintenant créer un code qui nous permettra de ré initialiser notre liste.

Le code est le suivant :
VBA

Private Sub cmdReset_Click()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : cmdReset_Click
    ' DateTime      : 13/02/2008 19:33
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Le click sur ce bouton va réinitialiser la liste
    '=======================================================================================
    
    ' ===== déclaration =====
    Dim lngDerRow As Long ' pour stocker la dernière ligne
    Dim i As Long ' pour boucler sur les lignes
    
    ' ====== affectation =====
    lngDerRow = wksSheet.Range("B1").End(xlDown).Row
    
    ' ====== réinitialisation des lignes =====
    ' on enlève la protection
    
    wksSheet.Protection.Enabled = False
    For i = 2 To lngDerRow
        With wksSheet
            .Range("A" & i).Value = ""
            With .Range("A" & i & ":G" & i)
                .Font.Color = vbBlack
                .Interior.Color = CLng(DLookup("lngCouleur", "tbl_Service", "strService='" & wksSheet.Range("F" & i).Value & "'"))
            End With
            DoEvents
        End With
    Next i
    ' on remet la protection
    wksSheet.Protection.Enabled = True

End Sub

Nous allons tout simplement parcourir la liste et remettre la couleur en fonction du service grâce à la fonction de domaine DLookup, et remplacer la croix par une chaine vide.


III-C-7. Récupération de la sélection

Maintenant que nous avons coché nos lignes, il nous faut les récupérer, cela sera réalisé avec le code suivant.
VBA

Private Sub cmdAffichageSelection_Click()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_ListeCaseCocher // Procédure : cmdAffichageSelection_Click
    ' DateTime      : 13/02/2008 19:49
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Va permettre d'afficher les lignes sélectionnées
    '=======================================================================================

    ' ===== déclaration =====
    Dim lngDerRow As Long       ' pour récupérer la dernière ligne
    Dim i As Long               ' pour réaliser la boucle sur l'ensemble des lignes
    Dim strMessage As String    ' préparation du message qui donnera les lignes sélectionnés
    
    ' ===== affectation =====
    lngDerRow = wksSheet.Range("B1").End(xlDown).Row
    
    ' ====== boucle sur les lignes ======
    For i = 2 To lngDerRow
        If wksSheet.Range("A" & i).Value = "x" Then
            strMessage = "Identifiant : " & wksSheet.Range("B" & i).Value & _
                         " Nom : " & wksSheet.Range("D" & i).Value & vbCrLf & strMessage
        End If
    Next i
    
    ' ====== affichage des lignes sélectionnées =====
    MsgBox "Les lignes sélectionnées" & vbCrLf & vbCrLf & strMessage, vbOKOnly
    
    
End Sub

Nous allons juste parcourir les lignes, détecter la présence du x, stocker les données dans une chaîne et les afficher dans une msgbox (bien sûr en fonctionnement normal, on affiche pas de boites de dialogue).


IV. ZONE DE LISTE DEROULANTE AVEC UNE MISE EN FORME CONDITIONNELLE ILLIMITE

Nous allons voir comment, sur le même principe, réaliser une liste déroulante (Combobox) qui possède bien sûr une mise en forme conditionnelle.


IV-A. Cahier des Charges

Réaliser une liste déroulante représentant le personnel d'une société.

Cette liste devra permettre de visualiser facilement les éléments suivants (Nom, Prénom).

  • Les noms devront être classés par ordre alphabétique.
  • Chaque service devra avoir sa couleur.
info Vous trouverez cette liste déroulante et tout son code dans le formulaire frm_LiseDeroulante qui se trouve dans la base en téléchargement en bas de cet article.

IV-A-1. Le contrôle OWC

Nous allons préparer ce contrôle de la même manière que la zone de liste, ce contrôle sera nommé spreadCombo.


IV-A-2. Le bouton de commande

Nous allons donc mettre un bouton de commande standard sur notre formulaire, celui-ci simulera la flêche d'une liste déroulante.

Nous nommerons notre bouton cmdDropDownListe.

Pour avoir une flêche vers le bas, nous allons tout simplement utiliser la police Wingdings 3 et la lettre q en minuscule.

info Vous avez d'autres possibilités avec des images, etc.

IV-B. Le code


IV-B-1. Déclaration des variables

La déclaration est identique à la zone de liste.


IV-B-2. Préparation de la liste

Voici le code qui permet de préparer la liste déroulante, celui-ci est en tout point similaire à celui de la zone de liste.
VBA

Public Sub PrepaCombo()
    ' ======================================================================================
    ' Procedure     : Module :Form_frm_LiseDeroulante // Procédure : PrepaCombo
    ' DateTime      : 16/02/2008 07:10
    ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
    ' Description   : Ce code va permettre de préparer les entêtes de la liste
    '=======================================================================================
    
    
    ' ===== on met les entêtes =====
    With wksSheet
        .Range("A1") = "Id"
        .Range("B1") = "Nom"
        .Range("C1") = "Prénom"
        With .Range("A1:C1")
            .Interior.Color = RGB(180, 180, 240)
            .Borders.LineStyle = xlContinuous
        End With
    End With
    
End Sub

IV-B-3. Ajout