Colorier la ligne active dans Access
Comment colorier entièrement la ligne correspondant à l’enregistrement actif, dans un formulaire Access ?
Le scénario
Je dispose d’un formulaire Personnes, illustré ci-dessus. Les champs importent peu, ici, sauf le champ Code Personne
(clef numérique). Le formulaire est affiché en mode Tabulaire… ou « Formulaires multiples« … ou encore « Plusieurs formulaires » ; Microsoft, merci de donner un terme stable et cohérent à ce mode de formulaire ! 😉
L’objectif est donc de colorier la ligne active de ce formulaire, automatiquement bien sûr.
La fausse bonne idée
On pourrait être tenté d’utiliser l’événement Sur activation
(Form_Current
) du formulaire, et d’y placer du code VBA pour appliquer les changements de couleur. Le problème est que cet événement est déclenché de la même manière pour toutes les lignes du formulaire. Ce n’est pas ce que nous voulons !
Pour ceux qui voudraient tenter, imaginons que vous modifiiez l’événement Sur activation
du formulaire pour attribuer une couleur au champ Nom
. Vous écririez par exemple :
1 2 3 |
Private Sub Form_Current() Me.Nom.BackColor = RGB(255, 255, 0) End Sub |
Mais voici ce que vous obtiendriez, quelle que soit la ligne active du formulaire :
La vraie bonne idée
Dans ce cas précis, la mise en forme conditionnelle est votre amie. Mais il faut quand même un peu de mise en place pour détecter l’enregistrement en cours.
Voici la procédure à suivre :
- Ouvrez votre formulaire en mode Création.
- Ajoutez un champ Texte indépendant, que vous appelez par exemple
txtCodePersonneActive
. Ce champ va servir à mémoriser la valeur du champCode Personne
actif. - Ajoutez le code suivant à votre formulaire ; l’idée est de programmer l’événement
Sur activation
, simplement pour transférer la valeurCode Personne
dans le champtxtCodePersonneActive
:
1 2 3 |
Private Sub Form_Current() Me.txtCodePersonneActive = Me.Code_Personne End Sub |
- Sélectionnez les champs du formulaire (la zone Détail plus précisément ; vous pouvez cliquer sur la règle graduée à gauche de cette zone Détail pour faire une sélection rapide).
- Activez l’onglet Format du ruban, puis sur l’icône Mise en forme conditionnelle.
- Cliquez sur le bouton Nouvelle règle.
- Dans la liste déroulante centrale, choisissez Expression.
- Renseignez cette formule à droite de Expression :
1 |
[Code Personne]=[txtCodePersonneActive] |
- Choisissez également votre mise en forme dans la partie basse de la boîte : gras, italique, souligné, couleur de fond, couleur de texte. Mes réglages ressemblent à ça :
Passez en mode Formulaire, déplacez-vous de ligne en ligne : c’est fait ! 🙂
Les finitions
La zone de texte txtCodePersonneActive
, que j’ai placée dans l’en-tête de formulaire, est visible pour l’utilisateur. Ça vous permet aussi de vérifier que tout se passe comme prévu. Une fois vos tests terminés, vous pouvez la masquer :
- En mode Création de formulaire, faites apparaître les propriétés de cette zone de texte.
- Sous l’onglet Format, réglez
Visible = Non
.
J’ai essayé, mais je suis dans un formulaire créé à partir d’une requête et la requête ne contient pas mon champ clé primaire. J’ai donc essayé avec un autre champ contenu dans mon formulaire, sans succès… est-ce que ça doit obligatoirement être la clé primaire?
Idéalement, il vaut mieux utiliser la clef primaire : c’est ce champ qui permet de différencier de façon sûre les lignes.
Il suffit de l’ajouter à la requête sous-jacente au formulaire, et le champ sera disponible sur le formulaire lui-même.
Bonjour Hervé, merci de ton truc pour colorier tous les champs de l’enregistrement courant d’un formulaire. J’avais le même problème que ComputingFroggy, seul le controle sur lequel je cliquais se mettait en couleur. En y regardant de plus près, après avoir sélectionné tous les controles de la section détail, j’ai défini la propriété StyleFond (Onglet format) à Standard au lieu de transparent. Je n’ai plus le problème.
Content que ça fonctionne !
Bonsoir,
Est-il possible d’appliquer une mise en forme conditionnelle à un champ de table ?
Merci.
A priori non : la mise en forme conditionnelle s’applique plutôt aux objets d’interface graphique (formulaires, états).
La table est surtout un espace de stockage.
Bonjour,
Intéressante technique malheureusement avec Access 2010 et Windows 7, j’ai bien la police qui est changé pour toute la ligne mais seulement le fond de la cellule dans laquelle j’ai cliqué est changé toutes les autres cellules de la ligne sont restées avec leur couleur précédente.
Suis-je le seul avec ce bug ?
Une idée pour le corriger ?
Est-ce que tous les champs de la zone Détail étaient bien sélectionnés lors de l’application de la mise en forme conditionnelle ?
Oui (sauf deux champs case à coher), et le changement de couleur de police lui fonctionne bien ! ? ! ?
De fait, j’ai le bug avec un formulaire et pas avec un autre : il doit y avoir quelque chose de spécifique sur ce formulaire … mais je n’ai pas encore trouvé quoi !
Pas facile à diagnostiquer à distance… 😉
L’autre formulaire est du même type, avec la même construction ?
Je confirme que la solution de Rafie fonctionne pour moi aussi : merci à lui !
Bonjour,
Le principe fonctionne parfaitement, j’ai juste un souci pour faire disparaitre le champ indépendant. J’ai tenté Visible=false et ColumnWidth=0 sans succès. Il faut dire que j’affiche une « feuille de données », pas un « formulaire continu ». Une idée ? Merci par avance.
Le Visible = Non (en mode Création de formulaire, pas nécessairement en VBA) ne passe pas ?
Yes ça fonctionne nickel!
Bon courage
Super… et merci ! 🙂
Bonjour Hervé,
Tout d’abord merci pour cet article bien documenté.
Tout fonctionne parfaitement bien sous access 2003 et Windows 7 et il ne se passe rien avec exactement
le même fichier access 2003 mais sur une machine Windows 8.1?
Merci d’avance pour une éventuelle explication
Pour info : c’est aussi un Access 2003 qui est installé sur le poste Windows 8.1 ?
sara > Le champ qui te sert à faire la recherche ne doit pas être le même que celui qui sert à colorier.
Bonjour,
oui c’est ça que j’ai fait les deux cote de vba donc l’article (Se positionner sur un formulaire) cherche le N° et cette article (Colorier la ligne active ) met la couleur. Mais j’ai pas compris quand vous avez dit que « Chaque technique a son code VBA et sa zone de texte (avec des noms différents bien sûr) » donc on cherche le N° et on couleur la ligne d’aprés le N°; est ce que si possible de me faire un exemple ça sera parfait pour que je comprends bien MERCII 🙂 🙂
sara > J’ai vérifié : les 2 techniques sont complètement compatibles. A condition de les suivre comme expliqué, séparément.
Par exemple, tu ne dois pas réutiliser la zone de texte de l’une pour mettre en place l’autre. Chaque technique a son code VBA et sa zone de texte (avec des noms différents bien sûr).
Bonjour,
Oui Hervé je veux cohabiter les 2 articles (à la fois le positionnement + la couleur).comment je peus le faire stp 🙁
sara > En fait, ça dépend de l’objectif : si l’idée est seulement de colorier la ligne active, il faut garder le contenu de cet article et ne pas utiliser l’autre.
Maintenant, s’il y a aussi l’idée de se positionner sur une ligne précise (sans couleur), c’est l’autre article qu’il te faut. 😉
A priori, les 2 articles concernent des points différents, mais qui peuvent aussi cohabiter (si on veut à la fois le positionnement + la couleur).
Dons d’aprés ce que vous dit j’ai compris je doit seulement copier ce code et supprimer l’autre de l’article (Se positionner sur un formulaire) c’est ça ;-(
jahwil > Il me faut plus d’infos pour diagnostiquer… 😉 Qu’est-ce qui ne marche pas ? Quelle version d’Access ? Quelle est l’erreur affichée, s’il y en a une ?
Ne marche pas du tout !?
sara >
txtCodePersonneActive
ne sert pas tout à fait pour trouver la ligne, mais au contraire pour mémoriser sa clef quand on a trouvé la ligne. Comme ce n’est pas le même principe que l’article « Se positionner sur un formulaire », tu devrais créer des objets indépendants, et ne pas réutiliser les autres (ce sont 2 traitements différents).oui le champs ID existe même le code de l’article « Se positionner dans un formulaire ou un sous-formulaire » ca marche parfaitement avec ce champs ID.
Moi je pense que ce code
« Private Sub Form_Current()
Me.txtCodePersonneActive = Me.Code_Personne
End Sub »
sa sert seulement pour trouver la ligne n’est ce pas ? donc si le code de l’article « Se positionner dans un formulaire ou un sous-formulaire » me trouve la ligne demander donc je dois seulement le colorer par le bouton Mise en forme conditionnelle 🙁
sara > Le champ
Id
existe bien dans la table ? (écrit exactement comme ça ?).En principe, quand tu fais
Me.
(Me
suivi du point), tu dois avoir une liste des propriétés et champs du formulaire. Si Id n’est pas dans cette liste, tu as effectivement une erreur.Bonjour Hervé,
Suite à l’article « Se positionner dans un formulaire ou un sous-formulaire » j’ai essayé de faire cette partie mais mon code
« Private Sub Form_Current()
Me.txtNumero = Me.ID
End Sub »
donne des erreurs je ne sais pas pourquoi 🙁 que le champs ID est introuvable par contre il existe déja même j’ai l mets dans le code que j’ai recopier de l’article « Se positionner dans un formulaire ou un sous-formulaire » est sa marche trés bien .
c’est où le soucis :'( ?