Excel - Couleur en fonction du contenu

Résolu
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014 - 11 févr. 2012 à 16:45
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014 - 14 févr. 2012 à 15:26
bonjour,
j'ai une macro qui fonctionne très bien et qui me donne dans une colonne suivant un chiffre une couleur :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Column = 2 Then Exit Sub
Dim Cel As Range
For Each Cel In Target
'pour chaque cellule de la plage modifiée
Select Case LCase(Cel)
'mettre en "case" la valeur de la cellule en minuscules
Case "1"
Cel.Interior.ColorIndex = 4
Case "2"
Cel.Interior.ColorIndex = 40
Case "3"
Cel.Interior.ColorIndex = 34
Case "4"
Cel.Interior.ColorIndex = 27
Case "5"
Cel.Interior.ColorIndex = 34
Case "6"
Cel.Interior.ColorIndex = 39
Case "7"
Cel.Interior.ColorIndex = 24
Case "8"
Cel.Interior.ColorIndex = 22
Case "9"
Cel.Interior.ColorIndex = 7
Case "10"
Cel.Interior.ColorIndex = 33
Case "11"
Cel.Interior.ColorIndex = 38
Case "12"
Cel.Interior.ColorIndex = 46
Case Else
'si aucun des cas précédent
Cel.Interior.ColorIndex = xlNone
'couleur de fond en automatique
End Select
Next Cel
End Sub
Je voudrais obtenir la même chose sur la colonne 5 mais plus avec un chiffre mais avec un nom.
Est ce possible, je vous remercie par avance de votre avis

50 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 10:55
Bon.
1) Merci d'être revenu sans être effrayé
2) Renfield a eu raison de me reprocher d'être "sec". C'est hélàs ma manière de "secouer" pour "obliger". Je suis ainsi depuis mon tout jeune âge. Excuse-moi.

3) explique bien cette phrase :
Je recherche le même principe dans la colonne 5 avec un nom (virement, banque, etc....) lorsque je saisirai j'obtiendrais une couleur.

Veut-elle exactement dire que tu souhaites que la cellule dans laquelle tu saisis par exemple "virement" se colore alors dans une couleur détérminée ?
Si oui : la réponse de Renfield est la bonne (à adapter juste un peu pour le cas où, comme le montre le renier extrait de ton code dans mon message précédent, la même couleur serait à appliquer pour deux mots différents).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
12 févr. 2012 à 11:06
Veut-elle exactement dire que tu souhaites que la cellule dans laquelle tu saisis par exemple "virement" se colore alors dans une couleur détérminée ? EXACTEMENT

Si oui : la réponse de Renfield est la bonne (à adapter juste un peu pour le cas où, comme le montre le renier précédent,
extrait de ton code dans mon message....JE NE COMPRENDS PAS

......la même couleur serait à appliquer pour deux mots différents)....NON
je souhaite que chaque mot est une couleur différente
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 11:37
extrait de ton code dans mon message....JE NE COMPRENDS PAS

C'est à cet extrait de ton code (repris dans mon précédent message) que je me référais
Case "3"
Cel.Interior.ColorIndex = 34       '<<<<<<=========== dans le cas ou valeur saisie = 3
Case "4"
Cel.Interior.ColorIndex = 27
Case "5"
Cel.Interior.ColorIndex = 34    '<<<<<<<<<<<=========  même couleur mais avec autre saisie 

On y voit nettement que la même couleur (34) est attribuée à la saisie de "3" et à la saisie de "5".
Est-ce que ce genre de cas ( une même couleur pour deux saisies différentes ) pourra également exister avec les saies de la colonne 5 ?
Telle est la question.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
12 févr. 2012 à 11:50
d'avoir choisi la couleur 34 pour les saisies 3 et 5 est un mauvais choix de ma part, il faut entendre que chaque saisie doit avoir une couleur différente
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 13:19
Bon.
La réponse et l'exemple de Renfield me paraissent dans ce cas parfaitement adaptés.

Reste maintenant à savoir si :
1) tu es venu pour apprendre ===>> la réponse Renfield est la plus simple à comprendre et à mettre en oeuvre en conscience de ce que tu fais. Et je laisse Renfield continuer.
ou
2)tu es venu chercher simplement de quoi faire, sans forcément comprendre, que tu obtiennes ton résultat ===>> et alors on va passer par l'utilisation d'un dictionnaire et tu n'auras plus qu'à copier/coller.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
12 févr. 2012 à 14:23
Je pense que désormais mon problème est compris.
Je veux bien apprendre avec l'aide de Renfield mais est cela ne va pas être une charge importe de temps et de travail. A la fois il me semble comprendre qu'il existe un dictionnaire, comment je peux en prendre connaissance
merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 16:26
un dictionnaire, c'est l'objet Scripting.Dictionary
il sert à y stocker des paires de données (une clé, unique, d'une part, et, d'autre part, la donnée correspondant à cette clé).
exemple de paire, dans ton cas :
"rouge" (pour la clé)
et
vbRed (pour l'élément/valeur associé(e) à cette clé)
Ses méthodes et propriétés sont exposées dans l'aide VBA (sous la rubrique Dictionary, Objet)

Pour ce qui est du code suggéré par Renfield : tu l'as déjà !




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 17:23
Tu veux que je te fasse vite fait bien fait un petit exemple avec un dico ?
Tu verras comment çà marche avec très peu de lignes de code pour gérer tes deux colonnes et tout et tout !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2012 à 17:33
Voilà ===>>>
Dans cet exemple, j'ai traité, dans la colonne 2, les saisie "1", "2" et "3" et dans la colonne 5, les saisies (en minuscules ou majuscules) des mots "debit", "instance" et "paiement"

Private Sub Worksheet_Change(ByVal Target As Range)
 Static d As Object
 If d Is Nothing Then
   Set d = CreateObject("Scripting.Dictionary")
   mescouleurs = Array("1", 4, "DEBIT", 4, "2", 40, "INSTANCE", 40, "3", 34, "PAIEMENT", 34)
   For i = 0 To UBound(mescouleurs) - 1 Step 2
     d.Add mescouleurs(i), mescouleurs(i + 1)
   Next
 End If
 Dim vabene As Boolean
 Select Case Target.Column
   Case 2
     If IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
   Case 5
     If Not IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
 End Select
 If vabene Then Target.Interior.ColorIndex = d.Item(UCase(Target.Text))
End Sub


Et tu complètes comme tu veux et à ta guise le contenu de l'array mescouleurs
fastoche, non ?
Allez. Bon dimanche
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 16:22
bonjour ucfoutu
d'abord merci de m'avoir concocter ton exemple...
j'ai bien essayé de comprendre ton code mais c'est pas "gagné". j'ai fait une application pour comprendre à quoi correspondaient "1", 4, "DEBIT", 4, en changeant les couleurs 4, 40 , 34
changeant les termes debit, instance, paiement
en compléant apres "3", 34, "PAIEMENT", 34) ce que tu avait déjà fait
rien n'a changé....donc pour moi pas facile à exploiter. Pour faire court je te fais parvenir une partie de ce que j'ai commencé à exploité sur xl
par ailleurs dans ton code je dispose toujours des mêmes couleurs pour la colonne 2 ainsi que pour la colonne 5 ....est ce que les couleurs pourraient être différentes
je voulais te faire parvenir une capture d'une partie de mon fichier mais le site ne l'accepte pas. si tu as une solution je te l'envoie
merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 févr. 2012 à 16:40
Le principe d'un forum est que tant les problèmes que leur(s) solution(s) doivent être connus de tous.
Sinon : aucune discussion ne serait utile à personne d'autre qu'au demandeur.
- Montre le code que tu as écrit.

Pour ta partie 2 :
- dis à quelle couleur tu voudrais faire correspondre :
--- chacun des chiffres (de ta colonne 2) . Ex : "3" ===>> 40
--- chacune des "mots" concernés de ta colonne 5 . Ex : "toto" ===>> 27
et tu auras du tout cuit, mais je me vois mal me lancer ici dans toute une tirade pour t'exposer un mécanisme qui ne peut, dans l'état actuel de tes connaissances (aucune, nous dis-tu) qu'échapper pour l'instant à ta compréhension.

Je te rappelle ce que je t'ai dit plus haut :
2)tu es venu chercher simplement de quoi faire, sans forcément comprendre, que tu obtiennes ton résultat ===>> et alors on va passer par l'utilisation d'un dictionnaire et tu n'auras plus qu'à copier/coller.





____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 févr. 2012 à 17:22
Juste une autre question (car je commence à avoir un doute) :
As-tu bien compris que l'évènement WorkSheet_change (celui que tu as choisi) n'intervient que lorsque tu modifies une valeur de la colonne 2 ou une valeur de la colonne 5, au moment où, après avoir modifié, tu vas sur une autre cellule ?

Il est clair que cet évènement (celui de ton choix) n'intervient qu'à ce moment là !
Est-ce bien ce que tu voulais ?



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 17:24
autant pour moi, j'ai du faire une erreur tout à l'heure car j’obtiens maintenant des débuts de résultat.
voilà ce que j'ai écrit,
Private Sub Worksheet_Change(ByVal Target As Range)
Static d As Object
If d Is Nothing Then
Set d = CreateObject("Scripting.Dictionary")
mescouleurs = Array("1", 5, "VIREMENT", 5, "2", 40, "INSTANCE", 40, "3", 34, "PAIEMENT", 34, "4", 10, "CHEQUES", 10)
For i = 0 To UBound(mescouleurs) - 1 Step 2
d.Add mescouleurs(i), mescouleurs(i + 1)
Next
End If
Dim vabene As Boolean
Select Case Target.Column
Case 2
If IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
Case 5
If Not IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
End Select
If vabene Then Target.Interior.ColorIndex = d.Item(UCase(Target.Text))
End Sub

mais est ce que je suis obligé d'avoir une relation du point de vue des couleurs entre :
1 >> virement
2 >> instance
3 >> paiement
4 >> chèques
est ce que je peux avoir sur le texte des couleurs différentes...
merci
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 17:31
pour répondre à ta question je n'ai pas compris
"que l'évènement WorkSheet_change (celui que tu as choisi) n'intervient que lorsque tu modifies une valeur de la colonne 2 ou une valeur de la colonne 5"
je l'ai choisi sans savoir.... car comme tu le sais j'ai fais un cop/coller qui lui a fonctionner car le forum (je ne sais plus lequel) présentais une réponse à la question que je me posais.
Je l'apprends donc maintenant
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 17:32
fonctionner, traduire fonctionné
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 févr. 2012 à 17:41
C'est toi ET TOI SEUL qui en décides, comme tu l'entends ! Il n'y a absolument aucune relation entre les couleurs de tes chiffres de la colonne 2 et celles de tes "mots" de la colonne 5 !
dans l'array,
Et il n'y a ni ordre obligatoire, ni obligation d'avoir autant de "mots" que de "chiffres"
Il te suffit d'y mettre tes "paires" =)==>>
exemple :
mescouleurs = Array("1", 5, "VIREMENT", 5, "2", 40, "INSTANCE", 40, "3", 34, "PAIEMENT", 34, "4", 10, "CHEQUES", 10) 


exemples

"VIREMENT", 5 constitue une paire (mot virement ===>> couleur 5
"2", 40 constitue une paire (chiffre "2" ===>> couleur 40

peut aussi bien s'écrire :
mescouleurs = Array("1", 5, "2", 40,  "3", 34, "PAIEMENT", 34, "4", 10, "CHEQUES", 10, "VIREMENT", 5, "INSTANCE", 40) 

et si tu ne veux pas de "CHEQUES" =)==>>
mescouleurs = Array("1", 5, "2", 40,  "3", 34, "PAIEMENT", 34, "4", 10, "VIREMENT", 5, "INSTANCE", 40) 


C'est tout et extrêmement souple !

J'ai par contre oublié d'ajouter 2 lignes de code pour faire face au cas où tu remplacerais une valeur à colorier par une valeur qui ne l'est pas. Ajoute-les ===>>
Private Sub Worksheet_Change(ByVal Target As Range)
 Static d As Object
 If d Is Nothing Then
   Set d = CreateObject("Scripting.Dictionary")
   mescouleurs = Array("1", 4, "DEBIT", 4, "2", 40, "INSTANCE", 40, "3", 34, "PAIEMENT", 34)
   For i = 0 To UBound(mescouleurs) - 1 Step 2
     d.Add mescouleurs(i), mescouleurs(i + 1)
   Next
 End If
 Dim vabene As Boolean
 If Target.Column <> 2 And Target.Column <> 5 Then Exit Sub '<<<<<<<<<<<<<<<<<Target.Interior.ColorIndex xlNone '<<<<<<<<<<<===============================
 Select Case Target.Column
   Case 2
     If IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
   Case 5
     If Not IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
 End Select
 If vabene Then Target.Interior.ColorIndex = d.Item(UCase(Target.Text))
End Sub


ce sont les deux lignes signalées par '<<<<<<<<<<<<<<<============ en commentaires du code
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 18:51
j'ai essayé de mettre en forme ce que tu m'as transmis.

Private Sub Worksheet_Change(ByVal Target As Range)
Static d As Object
If d Is Nothing Then
Set d = CreateObject("Scripting.Dictionary")
mescouleurs = Array("1",4,"2",40,"3",34,"4",27,"5",36,"6",39,"7",24,"8",22'"9",7","10",33","11",38,"12",46,"distributeur",5,"chèques",8,"pass",13,"hsbc",14,"virement créditeur",15,"remise chèques",16,"prélèvement",17))
For i = 0 To UBound(mescouleurs) - 1 Step 2
d.Add mescouleurs(i), mescouleurs(i + 1)
Next
End If
Dim vabene As Boolean
If Target.Column <> 2 And Target.Column <> 5 Then Exit Sub '<<<<<<<<<<<<<<<<<Target.Interior.ColorIndex xlNone '<<<<<<<<<<<===============================
Select Case Target.Column
Case 2
If IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
Case 5
If Not IsNumeric(Target.Text) And d.Exists(UCase(Target.Text)) Then vabene = True
End Select
If vabene Then Target.Interior.ColorIndex = d.Item(UCase(Target.Text))
End Sub

j'ai volontairement utilisé des couleurs différentes et que je pourrais changer par la suite.
Pas que je veuille esquiver ton problème mais comme tu le comprends je fais un compte bancaire et j'utiliserais toujours tous les mois (1/12) ainsi que tous les types de retrait. J’avoue quand même que je ne sais pas répondre.mais faut il alors supprimer ces deux lignes ??
Est ce que là je suis bon ????
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 18:54
comment on localise dans ton code les colonnes 2 et 5 ??
0
mibri Messages postés 23 Date d'inscription vendredi 10 février 2012 Statut Membre Dernière intervention 28 janvier 2014
13 févr. 2012 à 18:55
excuse moi je pense que c'est case 2, case 5
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 févr. 2012 à 19:02
Ne les supprime pas ! Laisse les en paix

Je regrette par contre que tu aies mis en minuscules les morts dans l'Array === >> ne marchera pas ainsi .
Ou alors : on passe vraiment tout en minuscules et il faut changer une partie de code
Je te conseille de les mettre dans l'Array en Majuscules et de laisser le code tel quel, ce qui te permettra de saisir en minuscules ou majuscules et le code ira chercher là où il faut dans le dico.
Je te conseille également d'éviter les lettres accentuées, à moins que tu ne saches les mettre en majuscules dans l'array

Voilà.
Moi, j'arrête ici car je ne peux transformer (excuse-moi) cette discussion en roman sans fin.
J'ai testé et retesté le code que je t'ai donné et n'ai rien à y changer ===>> il tourne sans faille
Lorsque tu seras arrivé à le comprendre et l'utiliser, n'oublie pas de cliquer "réponse acceptée" là où se trouve le code.
Bonne chance. Je te quitte là.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous