Mise en surbrillance d'un enregistrement dans un formulaire

Jean-Philippe AMBROSINO

Ce document a pour but de vous montrer comment mettre en évidence un enregistrement dans un formulaire. Vous devez maîtriser la conception de formulaire et connaître le langage Visual Basic for Application pour mettre en œuvre cet exemple et savoir manipuler plus particulièrement les RecordSets et DAO.

Commentez ♪

- Titre : Mise en surbrillance d'un enregistrement dans un formulaire

- Auteur : Jean-Philippe AMBROSINO

- Parution : 24 février 2005

- Mise à jour : 24 mai 2006

- Licence : Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- I. Avant-propos

- I-A. Remerciements

- I-B. Contact

- II. Présentation du formulaire exemple

- II-A. Création du formulaire

- II-A-1. Conception du formulaire avec l'assistant

- II-A-2. Conception du formulaire manuellement

- II-A-3. Mise en forme des champs

- III. Création de la fonction retournant le N° de ligne

- III-A. Visual Basic Editor

- III-B. Événement sur le formulaire

- III-B-1. L'événement Sur Clic (Form_Click)

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

- III-B-3. La propriété SelTop

- IV. Passage en mode formulaire pour visualiser

- IV-A. Modification des propriétés du contrôle txtBackground

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

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

- VI. Conclusion

- VII. Téléchargement

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

I-A - Remerciements

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

I-B - Contact

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

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

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.

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.

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

=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 construire 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'occurrence 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 majuscule

ou un j minuscule 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.

II-A - 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.

II-A-1 - Conception du formulaire avec l'assistant

Étape 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

Étape 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 inclus 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.

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

Cliquez sur Suivant

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

Cliquez sur Suivant

Étape 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 pastel 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

Étape 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 possibilité, 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.

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-la ;

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

II-A-2 - Conception du formulaire manuellement

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

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 ultérieurement.

Cliquez sur OK

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

Étape 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.

Étape 3
Depuis la barre d'outils, localisez le bouton 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 pour afficher la Liste des champs correspondants.

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

Étape 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.

Étape 6
Voyez comment vous allez ranger vos champs.

Étape 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.

Ensuite, choisissez dans le menu Édition 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 Édition 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 ressemble à 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.

Étape 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.

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.

II-A-3 - Mise en forme des champs

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

Étape 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.

Étape 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. La police : Terminal ;

2. La couleur de la police : bleu, mais vous pouvez en choisir une autre en fonction de la couleur de fond de votre formulaire ;

3. La taille : 20 (il est probable que vous ayez besoin d'une taille supérieure ; vous ajusterez en fonction de vos besoins) ;

4. La couleur de fond : Aucune (Transparente) ;

5. Le nom : txtBackground (n'importe quel nom fera l'affaire, mais choisissez un nom circonstanciel).

Vous devez obtenir alors :

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

Étape 5 Vous sélectionnez le champ (huit points d'ancrage délimitent ce dernier).
Vous affichez ensuite, par l'intermédiaire du bouton 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

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

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

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

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

1. La source de contrôle (ControlSource) : =fnctGetLineNumber() (vu en détail ci-après) ;

2. Le nom : ctlCurline (n'importe quel nom fera l'affaire, mais choisissez un nom circonstanciel)

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 (Étape 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é.

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

Étape 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. La source de contrôle (ControlSource) : Aucune ;

2. Le nom : ctlSelTop (n'importe quel nom fera l'affaire, mais choisissez un nom circonstanciel) ;

3. Largeur : 0 (comme pour le contrôle ctlCurline) ;

4. Haut : 0 (Top) ;

5. Gauche : 0 (Left) ;

6. Visible : Non (False).

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

Étape 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.

C'est terminé pour la partie formulaire.

III - Création de la fonction retournant le N° de ligne

Pour créer la fonction retournant le numéro de ligne, vous devez connaître le langage VBA. Enfin, quand je dis connaître, c'est préférable pour vous dans le sens où cet exercice est suffisamment explicite pour que vous puissiez le mettre en application même si ce langage 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.

III-A - Visual Basic Editor

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

1. La combinaison de touche ATL + F11 ;

2. Le menu contextuel de la fenêtre sur la partie grise où vous choisissez Créer code événement ;

3. Le bouton Créer situé dans la barre d'outils ;

4. La fenêtre de propriétés depuis l'onglet Événement.

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

Fonction fnctGetLineNumber retournant la ligne de l'enregistrement actif

Function fnctGetLineNumber() As Long
'''-----------------------------------------------------------
''' Mise en surbrillance 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

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 quel, car nous ne nous servirons pas de cet événement dans ce tutoriel.

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

III-B - É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.

III-B-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 :

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

III-B-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 multiutilisateur.
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 enregistrements 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 :

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

III-B-3 - La proprié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 correspondants.

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ée 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.

IV - 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.
Choisissez dans le menu Affichage la commande Formulaire ou bien cliquez sur le bouton qui se substitue au bouton mode Création représenté par une équerre bleue.

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

IV-A - 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.

IV-A-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.

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.

V - 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 1re condition

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

VI - 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'enregistrements ne remplit pas assez bien, selon moi et visuellement parlant, son rôle.

VII - Téléchargement

Bien que je pense que ce tutoriel est suffisamment 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