1. Avant propos

Ce document a pour but de vous montrer comment mettre en évidence un enregistrement dans un formulaire.
En effet, dans une liste d'enregistrements, seule la flèche située à gauche (pour peu que vous l'ayez affichée) est seule à même de vous donner la position de l'enregistrement en cours. Ce document montre comment colorier l'arrière plan de l'enregistrement actif.

1-1. Remerciements

Je tiens à remercier tout particulièrement Messieurs Maxence Hubiche et Olivier alias Bestiol ainsi que toutes celles et ceux qui ont participé à la relecture de ce document en y incluant leurs remarques.

1-2. Contact

Pour tous renseignements complémentaires, veuillez me contacter directement (Argyronet) par MP.

2. Présentation du formulaire exemple

L'objectif de ce tutoriel est de vous montrer qu'il est possible de mettre en évidence un enregistrement (qui est l'enregistrement actif) par l'intermédiaire d'une bande de couleur, ce qui permet de le visualiser immédiatement.

Le formulaire en mode formulaire

Vous pouvez constater que ce formulaire est volontairement dépourvu du sélecteur et du diviseur d'enregistrements.
J'ai également pour les mêmes raisons d'esthétique, supprimé les boutons de déplacement.

Image non disponible

Le formulaire en mode création (Design)

Lorsque l'on passe en Mode Création, vous pouvez remarquer que derrière les champs se trame une espèce de zone illisible bleue (couleur que j'ai choisie). C'est cette même zone qui va nous servir de bande colorée.

Image non disponible

Détail des éléments utilisés

Pour mettre en application ce tutoriel, vous avez besoin de deux champs cachés et un champ principal représentant la bande colorée...
Nous allons aborder au pas à pas chaque étape pour aboutir au résultat final.

Image non disponible

Le champ représentant la bande colorée est une zone de texte dont vous déterminez la couleur et dans lequel vous insérez une formule:

 

Formule du champ indépendant txtBackGround

 
Formule du champ txtBackground
Sélectionnez

=VraiFaux([SelTop]=[ctlCurline];"ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";Null)

Pourquoi utiliser le caractère Û ?

Eh bien dans la police utilisée par la zone de texte qui contient cette formule, le Û renvoie un carré plein.

Je ne sais si vous avez eu l'occasion de développer sous DOS, mais à l'époque (ouh là je suis vieux !) où moi-même je le faisais, le seul moyen de contruire des cadres d'écran (eh oui, on ne parlait pas de formulaire en ce temps là) consistait à exploiter les caractères de la table ASCII concernés.

En l'occurence et pour n'en citer que quelques uns, le jeu compris entre 170 et 223.

Il s'avère que la police qui permet d'afficher ces caractères est encore disponible: il s'agit de la police Terminal.

Il est probable que selon la version de Windows que vous utilisez, la police Terminal ne soit pas disponible,
son vrai nom étant vga850.fon ou encore vgaoem.fon, il apparaît qu'elle n'est pas présente dans les versions ultérieures à Windows 98 et les seuls privilégiés qui risquent de la détenir sont ceux qui ont procédé à une mise à niveau de leur système vers 2000 ou XP.
Vous pouvez alors utiliser la police Arial Alternative Symbol à la place mais il vous faudra remplacer le Û par un T majucule
ou un j minusucule et jouer avec un nombre un peu plus grand de caractères que prévu...
=> Vous pouvez télécharger l'une ou l'autre police en fin de document.

Note:
Il vous faudra déterminer le nombre de caractères Û.
Ici, j'en ai mis 100. Après quelques essais, il s'avérait que c'était le nombre nécessaire pour qu'il ne subsiste aucun blanc de part et d'autre du formulaire. Je suis pointilleux sur l'aspect finition des formulaires. Il s'agit d'une police écran et non pas d'une police dite True Type.

Deux champs cachés réduits à zéro en largeur (voir image ci-dessous) sont dédiés à recevoir respectivement le résultat d'une fonction pour l'un et le résultat d'une propriété pour l'autre. Cette fonction détermine la position de l'enregistrement en cours. Quant à la propriété, elle détermine le rectangle de sélection correspondant également à l'enregistrement en cours...

Image non disponible

2-1. Création du formulaire

Si vous souhaitez mettre en place cette fonctionnalité sur un formulaire existant, passez directement à la section 2.1.3.
Vous pouvez indifféremment construire votre formulaire manuellement ou à l'aide de l'Assistant.
Bien entendu, l'exemple traité ne reflétera pas les champs qui composent votre propre formulaire.

2-1-1. Conception du formulaire avec l'assistant

Etape 1
Depuis la fenêtre Base de donnée, choisissez Nouveau
L'image ci-après apparaît et vous sélectionnez alors Assistant Formulaire
Vous sélectionnez ensuite une table ou une requête dans la liste du dessous qui sera la source du formulaire.

Cliquez sur Suivant

Image non disponible

Etape 2
Les deux zones de liste représentent respectivement les champs disponibles (ceux issus de votre table ou de votre requête) et les champs à incorporer dans le formulaire.
Dans mon exemple, j'ai choisi une requête où j'avais préalablement inclu les champs qui m'intéressaient. J'ai donc cliqué sur le bouton >> qui a pour effet d'envoyer l'ensemble des champs dans la liste de droite.

A vous de déterminer dans votre propre formulaire ceux dont vous avez besoin.

Cliquez sur Suivant

Image non disponible

Etape 3
Le choix de la présentation se détermine dans cette étape où vous choisissez Tabulaire.

Cliquez sur Suivant

Image non disponible

Etape 4
Ici, vous sélectionnez la couleur de l'arrière plan de votre formulaire. Les images issues de la liste des fonds disponibles sont limitées à 9 par défaut.
Personnellement, je préfère définir mes arrières plan moi-même en sélectionnant des couleurs plutôt pastels en mode création.
Ici, vous êtes contraint d'en choisir un puisque vous êtes passé par l'Assistant. Pour cet exemple, nous choisirons "Expédition"

Cliquez sur Suivant

Image non disponible

Etape 5
Vous donnez alors un titre à votre formulaire (qui sera également le nom du formulaire).

Là je précise que personnellement, je ne nomme jamais mes objets avec des espaces. Bien qu'Access autorise cette possiblité, elle est contraignante car elle oblige à poser des crochets autour des noms de ces derniers lorsque vous utilisez ces objets en VBA pour coder une fonction ou une procédure.

Vous cochez ensuite l'option "Modifier la structure du formulaire" et cliquez sur Terminer.

Image non disponible

Formulaire généré
Le formulaire est donc prêt à être modifié:

  1. - Agrandissez la section Détail
  2. - Si la barre d'outils Boîte à outils n'est pas visible, affichez-là
  3. - Sélectionnez le bouton Zone de texte
  4. - Amenez votre pointeur de souris sur la zone libre de la section détail et dessinez un rectangle comme l'illustre l'image de la section 2-1-3. Mise en forme des champs


Image non disponible

2-1-2. Conception du formulaire manuellement

Au cas où vous souhaiteriez concevoir le formulaire manuellement, depuis la fenêtre Base de donnée, choisissez Nouveau
L'image ci-après apparaît et vous sélectionnez alors Mode création

Image non disponible

Vous pouvez d'entrée sélectionner une table ou une requête dans la liste du dessous qui sera la source du formulaire mais vous pourrez également la sélectionner utlérieurement.

Cliquez sur OK

Etape 1
Le formulaire se présente vide avec seulement la section Détail visible.

Image non disponible

Etape 2
Dans le menu affichage, sélectionnez En-tête/pied de formulaire de manière à subdiviser la section en trois parties, opération indispensable pour passer en Mode Continu.

Image non disponible

Etape 3
Depuis la barre d'outils, localisez le bouton Image non disponible pour afficher les propriétés du formulaire.

Dans l'onglet Toutes, pointez sur la propriété Source afin de sélectionner la table ou la requête correspondante.

Depuis la barre d'outils, localisez le bouton Image non disponible pour afficher la Liste des champs correpondants.

Image non disponible

Etape 4
La liste des champs va vous permettre de poser les champs sur le formulaire comme l'illustre la figure ci-dessous.

Image non disponible

Etape 5
Une fois posés, vous devez les agencer de manière à les répartir équitablement sur les différentes zones.
Profitez en pour élargir la zone Détail en amenant votre pointeur sur le bord droit de la section détail et en tirant sur la droite comme ci-dessous.

Image non disponible

Etape 6
Voyez comment vous allez ranger vos champs.

Image non disponible

Etape 7
Dans cette étape, vous devez à la fois agencer la section Détail et couper les étiquettes de l'ensemble des champs en deux opérations successives. Commencez par dessiner un rectangle autour des étiquettes en prenant soin de ne pas toucher les zones de texte, comme ci-dessous.

Image non disponible

Ensuite, choisissez dans le menu Edition la commande Couper ou bien à l'aide du raccourci clavier, tapez Ctrl + X
Les champs disparaissent alors...
Cliquez sur la section En-tête de Formulaire et choisissez dans le menu Edition la commande Coller ou bien à l'aide du raccourci clavier, tapez Ctrl + V

Une fois cela fait, prenez les étiquettes une à une et placez-les de telle sorte que l'agencement global ressembe à un tableau.

Si nécessaire, redimensionnez la section Détail
Vous pouvez prendre plusieurs étiquettes ensemble à l'aide de la touche Shift (Maj) au moment où vous cliquez dessus.

Image non disponible

Etape 8
Une fois terminé, vous devez obtenir quelque chose qui ressemble à ceci... Dans notre exemple, le champ IDMember (qui est la clé primaire de la table) va être masqué et sa largeur sera réduite à zéro.
Il sera par là-même, placé sur le bord gauche de la section détail.

Image non disponible

Souvent, le champ de clé primaire est un compteur et il est parfois inutile de le voir apparaître sur le formulaire ; En tout cas, c'est notre cas ici. Je supprimerai donc également son étiquette...
Bien qu'invisible, il est impératif de laisser ce champ disponible car il sert non seulement à localiser l'enregistrement à mettre en surbrillance mais il peut aussi servir à localiser un enregistrement à partir d'un autre formulaire.

Vous avez maintenant terminé la première partie...
Il nous reste à mettre en place les champs, les formules et le code conséquent à cet exercice.

 

2-1-3. Mise en forme des champs

Etape 1
Commencez par sélectionner l'outil Zone de Texte et dessiner une rectangle sur la partie libre de la section Détail que vous aurez préalablement agrandie.

Image non disponible

Etape 2
Vous obtenez un champ avec son étiquette.

Access numérote de façon incrémentielle paire ou impaire les contrôles et ce dans la session en cours.

Image non disponible

Etape 3
Nous allons donc affecter différentes propriétés à notre contrôle qui est dédié à être la bande colorée de l'enregistrement actif.
Vous appliquerez donc à ce contrôle, les propriétés suivantes:

  1. 1. La police: Terminal
  2. 2. La couleur de la police: Bleue, mais vous pouvez en choisir une autre en fonction de la couleur de fond de votre formulaire.
  3. 3. La taille: 20 (Il est probable que vous ayez besoin d'une taille supérieure ; Vous ajusterez en fonction de vos besoins)
  4. 4. La couleur de fond: Aucune (Transparente)
  5. 5. Le nom: txtBackground (N'importe quel nom fera l'affaire mais choississez un nom circonstanciel)


Vous devez obtenir alors:

Image non disponible

Etape 4
Vous supprimez l'étiquette qui est absolument inutile pour ce champ.

Image non disponible

Etape 5 Vous sélectionnez le champ (8 points d'ancrage délimitent ce dernier).
Vous affichez ensuite, par l'intermédiaire du bouton Image non disponible situé sur la barre d'outils, les propriétés de ce champ.
Vous pointez la propriété Source contrôle (ControlSource) et entrez la formule suivante:

Formule du champ txtBackground
Sélectionnez

=VraiFaux([SelTop]=[ctlCurline];"ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";Null)

Ainsi que je l'ai expliqué ci-avant, il vous faudra déterminer le nombre de caractères Û à saisir.

Image non disponible

Etape 6
Nous allons créer un second contrôle qui est dédié à recevoir le numéro de ligne de l'enregistrement en cours.

Image non disponible

Nous allons lui affecter les propriétés suivantes:

  1. 1. La source de contrôle (ControlSource): =fnctGetLineNumber() (vu en détail ci-après)
  2. 2. Le nom: ctlCurline (N'importe quel nom fera l'affaire mais choississez un nom circonstanciel)


Image non disponible

Ensuite, vous devez réduire la largeur de ce champ à zéro. En effet, ce champ ne doit pas et d'une, encombrer votre environnement de travail et de deux, être visible car bien que réduit à zéro, il reste à vue.
Vous afficherez donc ses propriétés à nouveau et dans l'onglet Format (Etape 7 ci-après), posez respectivement les valeurs Non pour Visible et 0 pour la Largeur. Vous pouvez toutefois réduire le contrôle à la souris comme illustré.

Image non disponible

Etape 7
C'est ici que vous définissez les propriétés du champ.
Vous pouvez voir que le contrôle positionné en haut et à gauche.

Image non disponible

Etape 8
Nous allons créer le troisième et dernier champ comme précédemment.
Pour ce champ, vous définissez les propriétés suivantes:

  1. 1. La source de contrôle (ControlSource): Aucune
  2. 2. Le nom: ctlSelTop (N'importe quel nom fera l'affaire mais choississez un nom circonstanciel)
  3. 2. Largeur: 0 (Comme pour le contrôle ctlCurline)
  4. 2. Haut: 0 (Top)
  5. 2. Gauche: 0 (Left)
  6. 2. Visible: Non (False)


Pour ce dernier, vous supprimerez également l'étiquette qui est inutile.

Image non disponible

Etape 9
Il ne vous reste plus qu'à juxtaposer ce champ txtBackground à la Section Détail et de ramener la section Pied de formulaire juste au dessous.
Vous ajusterez de façon identique la section En-tête de formulaire.
Vous pouvez attribuer une police différente pour les étiquettes, changer les différentes couleurs de fond etc.

Image non disponible

C'est terminé pour la partie formulaire...

3. Création de la fonction retourant le N° de ligne

Pour créer la fonction retournant le numéro de ligne, vous devez connaître le language VBA. Enfin, quand je dis connaître, c'est préférable pour vous dans le sens où cet exercice est suffisament explicite pour que vous puissiez le mettre en application même si ce language reste un mystère.
Disons que pour un confort d'utilisation et de maintenance, vous devez vous familiariser avec les procédures événementielles, les objets Recordset, les boucles et les gestions d'erreurs.

3-1. Visual Basic Editor

Pour la partie code VBA, vous allez appeler l'éditeur Visual Basic Editor (VBE) selon plusieurs possibilités :

  1. 1. La combinaison de touche ATL + F11
  2. 2. Le menu contextuel de la fenêtre sur la partie grise où vous choisissez Créer code événement.
  3. 3. Le bouton Créer Image non disponible situé dans la barre d'outils
  4. 4. La fenêtre de propriétés depuis l'onglet Événement


Image non disponible

Dans la partie centrale, vous recopiez la fonction ci-dessous.

 
Fonction fnctGetLineNumber retournant la ligne de l'enregistrement actif
Sélectionnez

Function fnctGetLineNumber() As Long
'''-----------------------------------------------------------
''' Mise en subrillance des enregistrements
''' Source : Developpez.com
'''-----------------------------------------------------------
Dim oRS As Recordset
Dim oForm As Form
Dim strPKFieldName As String
Dim lngLineNumber As Long
Dim lngValueToMatch As Long

  Set oForm = Form
  strPKFieldName = "IDMember"
  lngValueToMatch = Me!IDMember
  
  On Error GoTo L_ErrLineNumber
  Set oRS = oForm.RecordsetClone
  oRS.FindFirst "[" & strPKFieldName & "] = " & lngValueToMatch
    Do Until oRS.BOF
      lngLineNumber = lngLineNumber + 1
      oRS.MovePrevious
    Loop
  oRS.Close
L_ExLineNumber:
  fnctGetLineNumber = lngLineNumber
  Set oRS = Nothing
  Set oForm = Nothing
  Exit Function
L_ErrLineNumber:
  lngLineNumber = 0
  Resume L_ExLineNumber
End Function

Ce qui donne alors

Image non disponible

Puis vous choisissez dans la liste des objets, l'objet Form.
Cette sélection va créer un événement qui, par défaut pour celui-ci, est Form_Load().
Vous laissez tel que car nous ne nous servirons pas de cet événement dans ce tutoriel...

Image non disponible

Vous pointez la liste des événements à droite puis sélectionnez respectivement les événements Click() et Current().

Image non disponible

3-2. Événement sur le formulaire

Pour provoquer l'effet coloré sur l'enregistrement, vous devrez appliquer à l'objet Form deux événements.
Ceci est nécessaire pour que la propriété SelTop soit réaffectée à chaque fois que l'on clique sur une ligne d'enregistrement.

3-2-1. L'événement Sur Clic (Form_Click)

L'événement Clic (Click) se produit lorsque l'utilisateur appuie puis relâche un bouton de la souris sur un objet.
Dans notre cas, c'est l'événement Clic (Click) de la section Détail qui nous intéresse.

Vous écrirez donc pour l'événement Click :

 
Sélectionnez

Private Sub Form_Click()
	Me!ctlSelTop = Me.SelTop
End Sub

3-2-2. L'événement Sur Activation (Form_Current)

L'événement Activation (Current) se produit lorsque le focus passe à un enregistrement donné pour en faire l'enregistrement en cours ou bien lorsque le formulaire est Actualisé par un autre événement. L'événement qui provoque le fait que le formulaire est actualisé sous entend qu'un certain nombre d'opérations ont été effectuées par vous-même ou par un tiers en environnement Multi-Utilisateurs.
Je sous-entends ici que les enregistrements ajoutés sont affichés autant que ceux qui ont été supprimés disparaissent et bien entendu, les enregsitrements ayant été mis à jour s'actualisent par la même occasion, toutes ces opérations ayant lieu en même temps.

Vous écrirez donc pour l'événement Current :

 
Sélectionnez

Private Sub Form_Current()
	Me!ctlSelTop = Me.SelTop
End Sub

3-2-2. La proppriété SelTop

La propriété SelTop détermine ou spécifie quelle ligne d'enregistrement se trouve en haut du rectangle de sélection.
Le rectangle de sélection est défini par les lignes et les colonnes sélectionnées dans la feuille de données d'une table ou d'une requête ou d'un formulaire en mode continu.
Pour notre cas, la propriété est sollicitée dans le formulaire en mode continu.

La propriété SelTop est un Entier de type Long (Long Integer) dont la valeur est comprise entre 1 et le nombre d'enregistrements total représenté par la source de données (RowSource) dans le formulaire en cours.
Si le formulaire est filtré ou est ouvert avec une condition WHERE, la valeur maximum de la propriété SelTop sera égale au nouveau nombre d'enregistrements correspondant.

Si aucune sélection dans le formulaire n'est effectuée, la valeur de la propriété SelTop est alors égale à la ligne représenté par l'enregistrement actif.

Dans notre exemple, j'ai sollicité un contrôle Zone de Texte (Textbox) que j'ai nommé txtBackground et qui compare la valeur de cette propriété par rapport à celle retournée par la fonction fnctGetLineNumber() qui est renseignée dans le champ ctlCurline.
Cette comparaison est établie par une fonction Microsoft Access interne VraiFaux (IIf) vue ci-avant et qui renvoie VRAI ou FAUX selon le cas.

4. Passage en mode formulaire pour visualiser

Une fois ces procédures correctement écrites ou copiées, fermez l'éditeur VBE et réaffichez votre formulaire, toujours en mode Création.
Choissez dans le menu Affichage la commande Formulaire ou bien cliquez sur le bouton Image non disponible qui se substitue au bouton mode Création réprésenté par une équerre bleue.

Image non disponible

Cliquez sur un enregistrement au hasard et l'arrière plan de ce dernier devient bleu (pour ce cas).

4-1. Modification des propriétés du contrôle txtBackground

En effectuant un jeu de clics successifs, vous vous apercevrez vite qu'il y a un schmurtz...
En effet, de temps à autre, le contrôle txtBackground passe par-dessus les autres champs ce qui provoque un effet non attendu. Il vous faut alors dans un premier temps lui passer la propriété Arrêt tabulation à Non et ensuite lui affecter un événement.

4-1-1. Création d'un autre événement pour le contrôle txtBackground

Il vous faut alors ajouter un petit bout de code sur l'événement GotFocus() en sollicitant un autre contrôle dès que ce denier reçoit le focus...

 
Sélectionnez

Private Sub txtBackground_GotFocus()
  Me.FirstName.SetFocus
End Sub

L'événement Réception focus (GotFocus) se produit lorsqu'un contrôle ou le formulaire lui-même est activé par l'intermédiaire de la souris ou du clavier.

J'ai choisi le contrôle FirstName mais libre à vous de sélectionner n'importe quel contrôle susceptible de recevoir le focus par défaut, le but étant de faire en sorte que la bande bleue représentée par la Zone de Texte txtBackground ne le reçoive jamais.

5. Colorier les champs sans la zone d'arrière plan

Effectivement, il n'est pas obligatoire de poser une zone colorée à l'arrière...
Il est tout à fait possible de solliciter la Mise en Forme Conditionnelle et colorier les champs eux-mêmes.
Pour ce faire, vous devez alors entrer l'expression dans la zone de 1ère condition...

Image non disponible

Vous validez ensuite et les champs se coloriront en conséquence de la mise en forme choisie mais vous devez poser la condition pour chacun des champs visibles, évidemment...

6. Conclusion

Cette fonctionnalité peut s'avérer utile pour les développeurs exigeants qui souhaitent fournir des formulaires avec un aspect professionnel.
J'ai été amené à mettre en place cette fonctionnalité à la demande d'un client pour une grosse application de gestion et depuis, je l'applique quasi systématiquement à tous mes formulaires sous forme de liste.
C'est une bonne parade à l'environnement Access en mode Formulaire car il faut avouer que le Diviseur d'enregistrement ne remplit pas assez bien, selon moi et visuellement parlant, son rôle.

7. Téléchargement

Bien que je pense que ce tutoriel est suffisament explicite pour que vous puissiez mettre en application sur vos applications Access, vous pouvez télécharger la base exemple pour vous guider dans vos premiers pas en cliquant ici.

Téléchargement des polices

- La police Terminal
- La police Arial Alternative Symbol