1. Introduction▲
Ce document est destiné à toute personne désireuse d'approcher la mise en forme conditionnelle sous Access, quel que soit son niveau. La mise en forme conditionnelle est à utiliser, par exemple, quand vous voulez distinguer graphiquement les enregistrements figurant dans un formulaire continu. Voici un cas type de ce que vous désirez obtenir.
Ici, les produits épuisés apparaissent en rouge.
La création d'une mise en forme conditionnelle passe nécessairement par la définition des trois points suivants :
1) Choix du contrôle concerné.
2) Choix des critères en vertu desquels un format particulier sera appliqué au contrôle concerné.
3) Choix du format à appliquer en fonction des choix 1) et 2).
La plupart du temps, c'est l'utilisateur lui-même qui définira tout ceci, à l'aide de la boîte de dialogue prévue dans les menus (l'assistant).
Cependant, il peut arriver que dans votre application, vous souhaitiez simplifier cette boîte de dialogue pour en ôter certaines fonctions superflues ou trop complexes pour vos utilisateurs. VBA vous permettra alors de programmer une mise en forme conditionnelle en ne laissant à l'utilisateur que le contrôle d'une ou deux des étapes décrites ci-dessus, voire aucune.
Dans la première partie de ce tutoriel, nous allons étudier son paramétrage à l'aide de l'assistant via quelques exemples et applications pratiques. Puis, dans la seconde, nous aborderons le paramétrage dynamique de la mise en forme conditionnelle en utilisant VBA.
Remarque : La mise en forme conditionnelle n'est disponible que depuis la version 2000 d'Access.
2. Paramétrage de la mise en forme conditionnelle en utilisant l'assistant▲
2-1. Présentation de l'assistant▲
L'assistant est accessible par le menu Format - Mise en forme conditionnelle. Vous devez au préalable sélectionner un composant capable d'accepter la mise en forme conditionnelle. Ces composants sont : les zones de texte, les zones de liste et les zones de liste modifiable.
Comme vous pouvez le voir, l'assistant se compose de plusieurs sections horizontales. La première section concerne la définition du format par défaut, les suivantes, nommées condition X (il peut y en avoir de 1 à 3), permettent de définir chaque condition.
2-2. Définir le format par défaut▲
Il s'agit du format d'origine appliqué au contrôle quand aucune condition de la mise en forme n'est vérifiée.
Vous pouvez modifier ce format grâce aux boutons habituels de mise en forme. Il est possible aussi d'activer/désactiver le contrôle.
2-3. Une ligne Condition X▲
Nous allons maintenant nous intéresser aux autres sections de la fenêtre. Toutes fonctionnent selon le même principe, chacune permettant de définir une condition ainsi que le format à appliquer lorsque cette condition est vraie. Les boutons Ajouter et Supprimer permettent respectivement d'ajouter et supprimer ces sections.
2-3-1. Le type de la mise en forme ▲
La première zone de liste vous donne le choix entre trois types de condition pour appliquer une mise en forme.
2-3-1-1. Condition de type Champ Activé▲
Cette option permet d'appliquer une mise en forme spécifique chaque fois que le contrôle reçoit le focus. C'est-à-dire, en général, quand l'utilisateur est prêt à saisir des données dans le contrôle. Si vous souhaitez utiliser ce type de condition, vous devrez le définir impérativement dans la section Condition 1.
2-3-1-2. Condition de type Expression▲
Il est également possible d'appliquer une mise en forme spécifique, lorsque le résultat d'une expression est vrai. Pour cela, il faut sélectionner la valeur Expression dans la zone de liste. L'expression saisie peut faire appel à n'importe quelle fonction Access prédéfinie ou bien à une fonction personnalisée et faire référence à tout contrôle ou champ disponible dans les formulaires ou les états ouverts.
Une expression peut combiner plusieurs opérateurs pour comparer ses différentes parties. Si aucun opérateur de comparaison n'est utilisé, l'expression est comparée à la valeur True (Vrai).
Les fonctions disponibles sont diverses et variées. Vous pouvez par exemple utiliser des fonctions sur les dates. Voici, par exemple, une expression qui retourne True quand la date du champ LaDate est un samedi :
PartDate
(
"e"
;[LaDate])=
7
Vous pouvez aussi utiliser des opérateurs logiques (AND / OR / NOT) pour effectuer des opérations complexes.
Ainsi l'expression suivante renvoie True si la valeur du champ LaDate est un week-end :
PartDate
(
"e"
;[LaDate])=
7
OR
PartDate
(
"e"
;[LaDate])=
1
Vous pouvez remarquer que contrairement à VBA le séparateur des paramètres des fontions dans les versions françaises du logiciel est le point virgule. C'est donc le point virgule qui doit être utilisé dans les expressions de la mise en forme conditionnelle.
2-1-3-3. Condition de type Valeur du champ▲
En sélectionnant ce type de condition, le critère de votre choix sera comparé à la valeur du contrôle concerné par la mise en forme conditionnelle. Dans ce cas, une deuxième zone de liste est disponible, pour vous permettre de choisir l'opérateur en fonction duquel se fera la comparaison. Si le résultat de l'expression ainsi constituée est vrai, alors le format sera appliqué.
2-3-2. Définir le format à appliquer ▲
La méthode à employer est exactement la même que celle pour définir le format par défaut. A savoir, utiliser les boutons et visualiser le résultat dans l'aperçu.
2-3-3. Ordre des conditions▲
Les versions d'Access 2000 et XP permettent d'ajouter jusqu'à trois conditions de mise en forme. Mais attention, l'ordre d'insertion est primordial. Prenons un exemple :
Une zone de texte qui s'affiche en bleu quand le texte commence par un c et en rouge quand sa longueur est égale à 5 caractères :
C'est la première mise en forme dont la condition est respectée qui est utilisée.
Ainsi, coupe s'affichera en bleu et loupe s'affichera en rouge.
2-3-4. Conseils▲
Parfois dans une expression, on peut faire référence à une valeur soit en pointant sur un contrôle, soit en pointant sur le champ source de ce contrôle (si le contrôle est dépendant).
Par exemple :
Formulaire![txtQuantité]=
0
Formulaire![Quantité]=
0
Ces deux expressions sont valides sauf que la première (qui fait référence à un contrôle) mettra à jour la mise en forme plus efficacement : dès l'événement AfterUpdate du contrôle concerné, sa valeur sera prise en compte dans l'expression. Tandis que si on fait référence au champ directement, toute nouvelle valeur ne sera prise en compte que lors de l'événement AfterUpdate (événement Form_AfterUpdate) de l'enregistrement lui-même, donc parfois, bien tard...
Enfin, une astuce qui fonctionne sous Access 97 pour mettre en forme un contrôle sans utiliser la mise en forme conditionnelle :
Tout contrôle ayant la propriété Style Fond = Transparent apparaîtra :
- fond transparent lorsqu'il n'a pas le focus.
- fond de la couleur choisie (propriété Couleur fond), lorqu'il a le focus.
Cela permet d'attirer vraiment l'attention sur le contrôle actif c'est le seul qui soit en couleur.
2-4. Quelques exemples en pratique▲
Voici quelques exemples de mise en situation.
2-4-1. La gestion des stocks▲
Reprenons notre premier exemple sur la gestion des stocks. Pour afficher le champ stock en rouge, nous pouvons utiliser une mise en forme conditionnelle de type Valeur du champ.
Par contre, pour les autres contrôles, nous devons utiliser une mise en forme conditionnelle de type Expression pour évaluer le champ stock.
Pour appliquer à plusieurs contrôles à la fois une mise en forme conditionnelle identique, il suffit de sélectionner tous les contrôles concernés, puis d'ouvrir la fenêtre de l'assistant pour y définir les conditions communes de mises en forme.
2-4-2. Désactiver un contrôle en fonction d'une case à cocher▲
Parfois, il est souhaitable de désactiver une zone de texte quand l'utilisateur a décoché une case. Plutôt que d'avoir à traiter cela en VBA, il est tout à fait possible d'utiliser la mise en forme conditionnelle. Il suffit d'appliquer à la zone de texte une mise en forme de type expression qui, quand la case à cocher est décochée, désactive la zone de texte.
Voici le résultat :
3. Paramétrage de la mise en forme en utilisant VBA▲
Comme la plupart des objets et fonctionnalités que propose Access, il est possible de modifier par programmation la mise en en forme conditionnelle et les objets VBA qui lui correspondent. Nous allons voir, dans cette partie, quels sont ces objets et leurs méthodes.
3-1. La collection FormatConditions▲
C'est une collection qui regroupe l'ensemble des mises en forme conditionnelles associées à un contrôle. Elle est ainsi composée d'objets FormatCondition dont le nombre ne peut excéder 3 sous les versions 2000 et XP.
Comme toute collection, la collection FormatConditions offre la possibilité de supprimer, d'ajouter ou d'accéder à un objet spécifique via son index dans la collection. Notons tout de même que le premier index de cette collection est zéro.
3-2. L'objet FormatCondition▲
L'objet FormatCondition est l'équivalent d'une section dans la fenêtre de l'assistant de mise en forme conditionnelle.
3-2-1. Propriétés▲
Propriété | Description |
---|---|
BackColor | Long. Définit la couleur de remplissage du contrôle lorsque l'expression est vérifiée |
Enabled | Booléen. Définit si le format conditionnel est actif ou non |
Expression1 | String. Définit la première partie de l'expression à évaluer pour appliquer la mise en forme conditionnelle |
Expression2 | String. Définit la deuxième partie de l'expression à évaluer pour appliquer la mise en forme conditionnelle |
FontBold | Booléen. Définit si le texte du contrôle doit apparaître en gras lorsque l'expression est vérifiée. |
FontItalic | Booléen. Définit si le texte du contrôle doit apparaître en italique lorsque l'expression est vérifiée. |
FontUnderline | Booléen. Définit si le texte du contrôle doit apparaître en souligné lorsque l'expression est vérifiée. |
ForeColor | Long. Définit la couleur du texte lorsque l'expression est vérifiée. |
Operator | Enumération. Définit le type d'opérateur utilisé pour évaluer l'expression. |
Type | Enumération. Définit le type de la mise en forme conditionnelle. |
3-2-2. Membres de l'énumération acFormatConditionOperator▲
Constante | Description |
---|---|
acBetween (par défaut) | Compris entre Expression1 et Expression2 |
acEqual | Egale à Expression1 |
acGreaterThan | Plus grand que Expression1 |
acGreaterThanOrEqual | Plus grand que ou égal à Expression1 |
acLessThan | Plus petit que Expression1 |
acLessThanOrEqual | Plus petit que ou égal à Expression1 |
acNotBetween | Non compris entre Expression1 et Expression2 |
acNotEqual | Différent de Expression1 |
3-2-3. Membres de l'énumération acFormatConditionType▲
Constante | Description |
---|---|
acExpression | Expression |
acFieldHasFocus | Activation |
acFieldValue | Valeur |
3-3. Ajouter une mise en forme conditionnelle à un contrôle▲
Supposons que nous disposons d'un formulaire de commande avec deux zones de texte : Tnom et Tquantite.
Pour ajouter une mise en forme conditionnelle à notre zone de texte Tnom, il va falloir ajouter un objet FormatCondition à sa propriété FormatConditions.
Pour ce faire, on va utiliser la méthode Add de la collection FormatConditions.
expression.Add(Type, Opérateur, Expression1, Expression2)
Les arguments de cette méthode sont les propriétés du nouvel objet FormatCondition que l'on peut retrouver dans le tableau ci-dessus, soit le type, l'opérateur et les deux parties de l'expression.
3-3-1. Ajout d'une mise en forme conditionnelle sur la valeur du champ▲
Ce type de mise en forme conditionnelle permet de changer l'aspect du contrôle en fonction de sa valeur. Pour définir une telle mise en forme, il faut fixer la propriété Type de l'objet FormatCondition à acFieldValue.
Ainsi, si on veut définir une nouvelle mise en forme conditionnelle à notre contrôle Tnom de telle sorte qu'il s'affiche en gras lorsque sa valeur vaut " Dupont ", on aura par exemple sur l'événement clic d'un bouton :
TNom.FormatConditions.Add
acFieldValue, acEqual, "Dupont"
TNom.FormatConditions.item
(
0
).FontBold
=
True
Ainsi, la mise en forme conditionnelle de notre zone de texte Tnom devient :
De même, si on voulait que la valeur de TQuantite s'inscrive en rouge lorsque sa valeur est comprise 10 et 20, on aurait :
TQuantite.FormatConditions.Add
acFieldValue, acBetween, 10
, 20
TQuantite.FormatConditions.item
(
0
).ForeColor
=
VbRed
3-3-2. Ajout d'une mise en forme conditionnelle sur une expression▲
Ce type de mise en forme conditionnelle permet de changer l'apparence d'un contrôle en fonction d'une règle de gestion. Pour définir ce type de mise en forme conditionnelle il nous faut fixer la propriété Type à acExpression.
Lorsque l'on utilise une telle mise en forme, l'opérateur de l'objet FormatConditon n'a pas besoin d'être spécifié, et expression1 est alors une chaîne de caractères telle qu'elle pourrait apparaître dans le générateur d'expression. Cette expression peut utiliser toutes les fonctions Vba disponibles, y compris les fonctions personnalisées.
Exemples :
Nous allons reprendre notre composant Tnom et afficher son texte en gras si la première lettre commence par C.
TNom.FormatConditions.Add
acExpression, , "Left([Tnom];1)= "
+
chr
(
34
) +
"C"
+
chr
(
34
)
TNom.FormatConditions.item
(
0
).FontBold
=
True
Ainsi, la mise en forme conditionnelle de notre zone de texte Tnom devient :
Notons que chr(34) permet d'encadrer une chaîne de caractères avec des guillemets.
De même supposons que nous disposons d'un contrôle Tdate affichant une date et que l'on veuille afficher ce texte en bleu et en italique lorsque l'année de la date est bissextile.
Nous allons devoir utiliser une petite fonction à écrire dans un module qui renvoie le caractère bissextile ou non d'une année.
Function
Est_bissextile
(
LaDate as
string
) as
Boolean
Dim
Y as
integer
Dim
D as
date
D=
DateValue
(
ladate)
Y=
Year
(
D)
Est_bissextile=((
Y mod
4
=
0
) And
Not
(
Y mod
100
=
0
)) Or
(
Y mod
400
=
0
)
End
Function
Ensuite la mise en forme conditionnelle sera définie par :
Tdate.FormatConditions.Add
acExpression, , "Est_bissextile([Tdate])=true"
Tdate.FormatConditions.item
(
0
).FontItalic
=
True
Tdate.FormatConditions.item
(
0
).ForeColor
=
VbBlue
3-3-3. Ajout d'une mise en forme conditionnelle sur l'activation du contrôle▲
Cette mise en forme permet d'améliorer la lisibilité d'un formulaire en changeant l'apparence d'un contrôle lorsque celui ci est actif. Dans ce cas, il n'y a ni besoin de spécifier le paramètre Expression1 ni l'opérateur. Une telle mise en forme est spécifiée en fixant la propriété Type à acFieldHasFocus.
Exemple :
Reprenons notre composant Tnom. Nous souhaitons qu'il devienne vert quand celui-ci est actif.
TNom.FormatConditions.Add
acFieldHasFocus
TNom.FormatConditions.item
(
0
).ForeColor
=
VbGreen
3-4. Modifier la mise en forme conditionnelle d'un contrôle▲
Pour modifier un objet FormatCondition de la collection FormatConditions il faut utiliser la méthode Modify.
expression.Modify(Type, Opérateur, Expression1, Expression2)
Les paramètres sont les mêmes que ceux de la méthodes Add et nous ne nous attarderons pas d'avantage sur cette méthode sinon le temps d'un exemple.
Exemple :
Modifions la première mise en forme conditionnelle de notre zone de texte Tnom pour que l'opérateur ne soit plus acEqual mais acNotEqual
Tnom.FormatConditions.item
(
0
).Modify
acFieldValue, acNotEqual, "Dupont"
3-5. Supprimer toutes les mises en forme conditionnelles d'un contrôle▲
Pour supprimer tous les objets FormatCondition d'un contrôle, il suffit d'utiliser la méthode Delete de la collection FormatConditions.
expression.Delete
Exemple :
Supprimons toutes les mises en formes conditionnelles appliquées à notre zone de texte Tnom.
Tnom.FormatConditions.Delete
3-6. Supprimer une mise en forme conditionnelle d'un contrôle▲
Pour supprimer un objet FormatCondition il suffit d'utiliser la méthode Delete de cet objet
expression.Delete
Exemple :
Supprimons la première mise en forme conditionnelle appliquée à notre zone de texte Tnom.
Tnom.FormatConditions.Item
(
0
).Delete
3-7. Quelques remarques ▲
3-7-1. Ordre d'insertion des objets FormatConditions.▲
Lorsque vous ajoutez un objet FormatCondition, l'index de celui ci dans la collection FormatConditions est incrémenté de 1 par rapport au précédent objet ajouté.
3-7-2. Nombre d'objet FormatCondition▲
Vous pouvez récupérer le nombre d'objets FormatCondition d'une collection FormatConditions à l'aide de la propriété Count de cette dernière.
Msgbox
Tnom.FormatConditions.Count
3-7-3. Accéder au dernier objet FormatCondition ajouté.▲
La collection FormatConditions est indexée au départ à zéro. De ce fait, l'objet FormatCondition le plus récent dans la collection est égal à : FormatConditions.count-1
Dans nos exemples, nous avons toujours utilisé des collections vides. Donc l'index de l'élément ajouté était égal à zéro. Nous aurions pu utiliser :
Dim
N as
integer
With
Tnom.FormatConditions
.Add
acFieldHasFocus
N=
.count
.item
(
N).ForeColor
=
VbGreen
End
With
4. Quelques inconvénients▲
Même si vous voilà conquis par les possibilités de la mise en forme conditionnelle, sachez toutefois que le résultat retourné est parfois bien loin de ce que vous auriez souhaité. En effet la mise en forme est appliquée ligne par ligne. Il se peut alors, si vous utilisez des expressions complexes dans vos critères, que le traitement se produise de manière sacadée et visible (une ligne puis une autre, ...). Cela donnera une mauvaise impression à l'utilisateur (manque de performance, désagréable, etc.).
De plus, de nombreux bugs d'affichage sont recensés sur les versions XP et 2000. Certains champs se retrouvent d'une couleur alors que leurs expressions sont fausses, etc … Veillez donc bien à tester votre formulaire avant de distribuer votre application.
Heureusement, la majorité de ces bugs ont disparu avec la version 2003.
5. Conclusion▲
L'ergonomie est un point important dans le développement de logiciel. Au-delà de la l'aspect ludique voire gadget que certains peuvent reprocher à la mise en forme conditionnelle,
elle apportera toujours un réel plus à la présentation de vos applications pour peu quelle soit correctement paramétrée.
Sachez aussi qu'il n'existe pas aujourd'hui de moyen plus simple pour mettre en forme si efficacement des données dans un formulaire ou un état.
Je reste à votre entière disposition pour d'éventuelles erreurs que vous auriez remarquées dans ce tutoriel.
Bon développement.
6. Remerciements▲
Un grand merci aux membres de l'équipe Access pour leur collaboration et plus particulièrement à FRED.G pour son travail de relecture et ses précieux conseils, ainsi qu'à Bestiol pour ses corrections.