[Déplacé .Net --> VBA] Modifier la couleur d'un champ sous condition

Signaler
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010
-
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010
-
Bonjour à tous,

J'ai un formulaire Contact où j'ai différentes informations à propos de sociétés.

J'ai un champ état (chmpetat) qui me donne 3 possibilité et un champ société (chmpsociete) qui se colore en fonction du champ état:

Si "Client" alors Champ Société => Rouge
Si "En cours" alors Champ Société => Vert
Si "Prospect" alors champ Société => Blanc

Voici mon code :

Private Sub chmpetat_AfterUpdate()
If [chmpetat].Value = "Client" Then
Me![chmpsociete].BackColor = vbRed
Else
If [chmpetat].Value = "En cours" Then
Me![chmpsociete].BackColor = vbGreen
Else
If [chmpetat].Value = "Prospect" Then
Me![chmpsociete].BackColor = vbWhite
End If
End If
End If
End Sub

Le problème est le suivant :

Par exemple quand je sélectionne "Client" mon champ Société se colore bien en Rouge mais quand je sélectionne une autre Société dans mon filtre le champ société reste rouge alors que la valeur du champ Etat est "Prospect" donc il devrait être Blanc.
Je sélectionne à nouveau "Prospect" et le champ Société passe en Blanc je retourne sur le société précédente, le champ Société est blanc et non Rouge comme il devrait l'être...

D'où vient le problème ?

Merci d'avance

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Si tu as plus de choix que de conditions de coloriage, ça parait normal.
Deux solutions :
- Compléter ta suite de If-Then-Else avec un Else final, sans condition, qui colorise en blanc
- Utiliser un Select Case en lieu et place du If-Then-Else
   If [chmpetat].Value = "Client" Then 
      Me![chmpsociete].BackColor = vbRed 
   Else 
      If [chmpetat].Value = "En cours" Then 
         Me![chmpsociete].BackColor = vbGreen 
      Else 
         If [chmpetat].Value = "Prospect" Then 
            Me![chmpsociete].BackColor = vbWhite 
         Else  ' Le Else manquant
            Me![chmpsociete].BackColor = vbWhite 
         End If 
      End If 
   End If
qui peut aussi s'écrire
   If [chmpetat].Value = "Client" Then 
      Me![chmpsociete].BackColor = vbRed 
   ElseIf [chmpetat].Value = "En cours" Then 
      Me![chmpsociete].BackColor = vbGreen 
   ElseIf [chmpetat].Value = "Prospect" Then 
      Me![chmpsociete].BackColor = vbWhite 
   Else
      Me![chmpsociete].BackColor = vbWhite 
   End If
et enfin, avec un Select Case
   Select Case Me![chmpetat].Value
      Case "Client" :   Me![chmpsociete].BackColor = vbRed 
      Case "En cours" : Me![chmpsociete].BackColor = vbGreen 
      Case "Prospect" : Me![chmpsociete].BackColor = vbWhite 
      Case Else :       Me![chmpsociete].BackColor = vbWhite 
   End Select

PS : La prochaine fois, utilise la coloration syntaxique (3ème icone à partir de la droite) pour montrer ton code, cela permet de conserver l'indentation = beaucoup plus facile à lire par les lecteurs et moins rébarbatif

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010

Merci Jack pour ta réponse, mais j'ai toujours le même problème, j'ai essayé tes 2 solutions (ajouter le Else manquant et avec le Select Case).

On dirait que lorsque je change de fiche Société, il ne reprend pas la valeur du champ (chmpetat), mais il garde la dernière couleur connu du champ (chmpsociete).

As-tu une idée ?
Messages postés
133
Date d'inscription
dimanche 23 juin 2002
Statut
Membre
Dernière intervention
3 janvier 2015
3
Salut

Dans le reste de ton code appelle tu
chmpetat_AfterUpdate

Salutation
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010

Salut akzo,

oui j'appelle "chmpetat_AfterUpdate" dans mon Form_Load mais il me semble que ce n'est pas necessaire.

J'ai essayé avec ou sans et j'obtiens toujours le même résultat.

Je viens d'essayer avec une Image ça me fait le même problème... :(
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Oui, en effet, je t'ai répondu à côté de la plaque, je n'avais pas pigé qu'il s'agissait d'un dysfonctionnement.
Il faudrait piéger le programme : Ajoute ceci au début de ta Sub chmpetat_AfterUpdate :
Debug.Print Time, "chmpetat_AfterUpdate", [chmpetat].Value
Fais deux ou trois manip et surveille la fenêtre de debug (Ctrl-G)
Si tu peux suivre cette fenêtre de debug, vérifie qu'une ligne d'info s'y ajoute bien à chaque manip.
Si tu fais une manip et que tu ne passes pas par cette Sub, c'est qu'il ne détecte pas le changement de donnée.
Revoir la doc / l'aide concernant le AfterUpdate : peut-être qu'un changement non interface ne déclenche pas cette Sub. Voir peut-être un autre évènement comme _Change (si ça existe)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010

Je viens de faire mes test avec le Debug, et en effet il ne passe pas par cette Sub quand je change de fiche société.

Il semblerait qu'il prenne en compte la valeur changé du champ (chmpetat) pour l'ensemble du formulaire et non uniquement pour chaque fiche société.

Apparemment il ne prend pas en compte la valeur du champ (chmpetat) qui se trouve dans ma base de donnée mais il prend (et garde) la valeur du formulaire au moment de la modification dans ma liste déroulante.

Je sais pas si j'ai été très clair là

Merci d'avance
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Ok
Existe t-il un évènement chmpetat_Change (dans lequel tu pourais transférer ce code) ?
Messages postés
9
Date d'inscription
mercredi 12 mars 2008
Statut
Membre
Dernière intervention
12 mars 2010

Oui il existe et je faisait avec cet événement chmpetat_Change avant justement.

Après avoir essayé pas mal de truc je me suis dit que je devrais peut-être aller chercher la valeur qui se trouve dans ma table et non dans le champ chmpetat de mon formulaire.

J'ai essayé ceci (pour l'image) :
Private Sub chmpetat_AfterUpdate()
  Dim Rs As DAO.Recordset
  Set Rs = CurrentDb.OpenRecordset("Contacts1")

   If Rs.Fields("Etat").Value = "Client" Then
      Me![imgAttention].Visible = True
   ElseIf Rs.Fields("Etat").Value = "En cours" Then
      Me![imgAttention].Visible = True
   ElseIf Rs.Fields("Etat").Value = "Prospect" Then
      Me![imgAttention].Visible = False
   Else
      Me![imgAttention].Visible = False
   End If
End Sub


Et ceci (changement de couleur d'un champ) :
Private Sub chmpetat_AfterUpdate()
  Dim Rs As DAO.Recordset
  Set Rs = CurrentDb.OpenRecordset("Contacts1")

   If Rs.Fields("Etat").Value = "Client" Then
      Me![chmpsociete].BackColor = vbRed
   ElseIf Rs.Fields("Etat").Value = "En cours" Then
      Me![chmpsociete].BackColor = vbGreen
   ElseIf Rs.Fields("Etat").Value = "Prospect" Then
      Me![chmpsociete].BackColor = vbWhite
   Else
      Me![chmpsociete].BackColor = vbWhite
   End If
End Sub


Là j'ai un autre problème mon image n'apparait pas du tout je vois l'emplacement de l'image faire un léger clignotement lors du changement de valeur mais elle n'apparait pas... Même chose pour le changement de couleur du champ chmpsociete.

Aurais-tu une idée jack ?

Merci d'avance

PS: désolé pour l'absence depuis 2 semaines mais j'étais en examen.