Programmer des couleurs dans cellulles selon le resultat d'une autre

bonjour.
cela fait des jours que je rame sur les forums pour trouver une solution
Je suis en train de faire des satistiques .j’ai tout reussi jusque là
j’arrive au point qu’il me reste 4 feuilles ou je dois faire ce qui est demande ci-dessous:

voilà:en feuille1_j’ai un tableau avec 4 colonnes:nom - presence-absence-%.
je voudrai mettre des couleurs dans la colonne"nom" en fonction du resultat en colonne %
gris fonce pour inferieur a24%,gris clair pour 25 a 37% etc

(voi col FGH du dossier joint)

ensuite si possible, reporter ces resultats en feuille2 et feuill3dans les cellulles correspondant aux noms
Au pire je ferai un copier coller
Je travaille avec excel 2000
merci de bien vouloir m’aider

cjoint.com…

Pour colorer les cellules en fonction du résultat, tu peux utiliser la mise en forme conditionnelle. Aucune idée de comment elle fonctionnait sous Excel 2000, mais tu devrais pouvoir trouver ton bonheur sur Google.

Pour copier le résultat d’une cellule dans une autre, vas sur la cellule de destination, tape “=” (sans les guillemets), clique sur la cellule dont tu veux copier le résultat, et valide.
Edité le 21/12/2011 à 20:27

:)Merci de ta reponse Kookiz
mais avec la mise en forme je suis limite pour le nbre de couleurs.je ne sais pas faire

il va falloir passer par une macro.

Bonjour Jiheme:arf:
une macro c’est ce que je pense.
je n’arrete pas de fouiller les forums pour trouver une solution adaptée à mon cas:riva:

cellule.Interior.ColorIndex = 36

‘cellule’ représente la cellule que tu veux modifier
36 est le code de la couleur (donc à modifier pour ton besoin)

après il faut utiliser une boucle for pour parcourir toutes les cellules

par exemple

//va colorer les cellule de la colonne 2, de la ligne 1 à 15 
//avec les valeurs de couleur allant de 3 à 18
colonne = 2
for ligne = 1 to 15
Range(Cells( ligne , colonne)).Interior.ColorIndex = 2 + ligne
next

//ça doit fonctionner en théorie, je n'ai pas le temps de tester

C’est là le hic
tout ce que j’ai pu faire a été fait avec l’enregistreur de macro
maintenant je ne sais pas comment faire (choisir la feuille ,mettre les conditions, boucle etc…)
si on me montre pour 2 couleurs ,je pourrai finir en intercalant les autres couleurs à la suite
Je suis navré d’etre aussi ignare

sous excel 2003, il faut faire la commande Alt + F11 pour accéder au macro et les modifier.
de làn tu pourra insérer le code fourni.

D’abord
Je vous souhaite a tous de joyeuses fetes de fin d’annee

j’ai reussi a copier les couleurs qui m’interessent en D, mais ca ne va pas.
Quand j’applique ma macro cela fonctionne juqu’a qu’il y ait une valeur en texte
genre #VALEUR! ; #DIV/0!;*** Inconnu **
A ce moment la macro s’arrete en debogage.
je ne sais pas faire avec du texte
ensuite je ne sais pas non plus avec les conditions pour ( BetC ) (voir sur le fichier joint)
Quelqu’un peut il m’aider?
Merci d’avance
lien:
www.toofiles.com…

pour le problème des valeurs, il faut commencer par corriger la fonction qui renseigne les cellules, et par exemple mettre 0 si le calcul est impossible/faux.

le terme “#DIV/0!” indique qu’on a voulu faire une division par zéro.
pour le #valeur!, je pense que le résultat inscrit dans la cellule n’est pas un nombre, comme le format de la cellule l’attend.

pour les conditions sur b et c à la fois, au vu de la boucle sur le Range, tu peux utiliser la fonction offset qui te permet de vérifier la valeur d’une cellule décalée en horizontale et verticale.
exemple : cel.offset(-1,0).value = 1 and cel.offset(-2,0).value = 12345678

Pourquoi ta colonne D contient-elle des valeurs en dur ?
Si c’est un pourcentage, tiré des colonnes B et C, elle devrait contenir une formule, du genre =C/B
A partir de là, tu dois pourvoir directement au niveau d’excel traiter les cas d’erreur en sophistiquant un peu la formule avec des si().
Tu dois aussi pouvoir t’en sortir directement avec iserror() au niveau du VBA
En fait, tout dépend de ce que tu veux faire de ces cellules en erreur au niveau des couleurs à appliquer.

si on regarde ton code de plus près :

#VALEUR et #DIV/0 ne sont que des représentations des codes erreur. En fait, ils n’existent pas dans la cellule.
donc au lieu de mettre dans ton code
If cel.Value = “#VALEUR
tu devrais mettre
If cel.Value = CVErr(xlErrValue)

Comment obtiens-tu *Inconnu dans la colonne D ?

Plutôt que de traiter avec des if et des encadrements, utilise un if … elseif (ou un do case, mais pas forcément plus pratique), tu pourras te limiter à un seul test si tu commences par les exceptions (valeurs 100%, puis B>2, puis pourcentages)

As-tu prévu de conserver la partie “légende” (couleurs et valeurs associées, colonnes F et G) dans ton document définitif ?
Ce serait peut être une bonne chose pour l’interprétation finale.
Dans ce cas, plutôt que de mettre les valeurs d’index couleur en dur dans le code VBA, tu pourrais faire référence aux cellules correspondantes.

les valeurs de pourcentage négatives ou > à 100 ont-elles une signification concrète ?

Tu devrais pouvoir baser ton code sur l’exemple ci dessous (non vérifié, et je suis parti du principe que la colonne D contenait des pourcentages)

Sub Couleurs()
Dim cel As Range, catalogue As Range
Set catalogue = Range("F5") ' valeur à ajuster, de même que l'ordre dans le catalogue
For Each cel In Range("D2", Range("D2").End(xlDown))
    Debug.Print cel.Value
    ' cas des valeurs en erreur (#VALEUR? #DIV/0 ...)
    If IsError(cel.Value) Then
        cel.Interior.ColorIndex = catalogue.Interior.ColorIndex
    
    ' cas des 100%
    ElseIf cel.Value = 1 Then
        valb = cel.Offset(0, -2).Value
        valc = cel.Offset(0, -1).Value
        If valb = valc Then
            If valb = 1 Then
                cel.Interior.ColorIndex = catalogue.Offset(2).Interior.ColorIndex
            ElseIf valb = 2 Then cel.Interior.ColorIndex = catalogue.Offset(3).Interior.ColorIndex
            'etc ...
            Else    ' autres cas de 100% avec b=c
                cel.Interior.ColorIndex = catalogue.Offset(5).Interior.ColorIndex
            End If
        Else ' cas 100% général
            cel.Interior.ColorIndex = catalogue.Offset(5).Interior.ColorIndex
        End If
    
    ' traitement du B <=2
    ElseIf cel.Offset(0, -2).Value Then
        cel.Interior.ColorIndex = catalogue.Offset(6).Interior.ColorIndex
        
    ' traitement des pourcentages proprement dits
    ElseIf cel.Value < 0 Or cel.Value > 1 Then
        cel.Interior.ColorIndex = catalogue.Offset(7).Interior.ColorIndex
    ElseIf cel.Value < 0.25 Then
        cel.Interior.ColorIndex = catalogue.Offset(8).Interior.ColorIndex
    ElseIf cel.Value < 0.35 Then
        cel.Interior.ColorIndex = catalogue.Offset(9).Interior.ColorIndex
    'etc ...
    Else
        MsgBox "J'ai raté quelque chose", vbCritical, "tous les cas ne sont pas envisagés"
    End If

    'reporter la couleur de D sur A
    cel.Offset(0, -3).Interior.ColorIndex = cel.Offset.Interior.ColorIndex
Next
End Sub

Edité le 27/12/2011 à 12:57

Bonjour Gcc:hello:
pour répondre a tes questions
J’obtiens #VALEUR! en D [/u]quand je fais la division C/B avec avec le *** Inconnu *** situé en colonne B
en D je n’ai pas de *** Inconnu ***
Quand aux valeurs négatives c’était pour tester les couleurs que ca me mettrai pour les valeurs qui ne seraient pas comprises entre 0 et 100 y compris les( #VALEUR!et #DIV/0! )
j’ai essaye la macro suggérée cela me met la col A de la meme couleur et elle bloque à:

_’ traitement du B <=2
ElseIf cel.Offset(0, -2).Value Then
cel.Interior.ColorIndex = catalogue.Offset(6).Interior.ColorIndex[/b][/i] Maintenant je éplucher tout çà ensuivant tes conseils.
Merci pour tes conseils
:slight_smile:

C’est les deux dernières lignes du code. J’ai dû mal lire l’énoncé, j’étais persuadé que tu voulais reporter la couleur sur la 1e colonne. Il suffit de les supprimer.

ElseIf cel.Offset(0, -2).Value <=2 Then

En dehors des valeurs d’erreur qui sont déjà traitées de manière spécifique, y a-t-il des cas où tu tu risques réellement de rencontrer ces situations ? sinon pas la peine de les envisager.

çà avance
le probleme maintenant c’est que si j’ai plusieurs #VALEUR! dans la colonne les couleurs ne s’affichent plus apres
car je peux avoir #VALEUR! n’importe ou dans la colonne exemple ligne 2,7,15…
les #DIV/0! je m’en fout car ils sont toujours a la fin
Bien sur je pourrai trier les donnees mais comme je dois les reporter ligne pour ligne sur une autre feuille cela complique encore plus les choses pour moi cela me demanderai de faire une autre macro pour recopier les valeurs trouvees

Pas normal, puisque la valeur #VALEUR est traitée à l’intérieur de la boucle foreach
Tu as dû casser une des boucles en modifiant les lignes.
Tu es sûr que tu traites bien UNE ERREUR, et pas du simple texte écrit dans la case ?

Et pour les #DIV/0, il n’y a aucune différence avec les #VALEUR, puisqu’ils sont traités par la même fonction IsError()

re Bonjour gcc
j’ai passe la journee a tenter d’adapter ta macro pour mes besoins (je m’etais mal exprime je ne prenais pas les couleurs selon un catalogue)
[[Set catalogue = Range(“F5”) ’ valeur à ajuster, de même que l’ordre dans le catalogue For Each cel In Range(“D2”, Range(“D2”).End(xlDown))]]
Je n’y arrive pas peut etre que c’est excel 2000?ou suremement moi car je suis nul

-avec la macro ecrite sur le fichier joint je supprime les #VALEUR! et #DIV/0!
_ je mets les couleurs + le report de celles ci enA
_je n’arrive pas a traiter les 100 et les 2de la colonne B
je joins le meme fichier sans fioritures
Merci de ta comprehension

www.toofiles.com…

Je n’ai pas excel 2000 pour vérifier, mais je ne pense pas que la version soit en cause ; tout ce que je t’ai donné fonctionne avec excel 2002, j’ai vérifié.

Ce que j’appelle catalogue, c’est la zone de cellules que tu avais en colonnes F et G et qui décrivaient les couleurs en fonction des valeurs relevées dans la colonne D.
Et dans le code, catalogue n’est pas un nom réservé, c’est simplement celui que j’ai donné à la variable qui va “parcourir” cette zone. J’ai mis “à ajuster”, parce que je ne pensais pas qu’en version finale ton catalogue commence en plein milieu de la page ; je le voyais plutôt en F1 par exemple.

Evidemment dans ce cas ce que je t’ai donné ne risque pas de marcher. Il faut que tu remplaces toutes les références à catalogue par la valeur d’index réelle, comme tu l’as fait dans ton deuxième envoi.

Indépendamment du code, il n’est pas normal que tu sois obligé d’intervenir sur les valeurs de la colonne D, surtout pour supprimer des valeurs d’erreur (NB : ce n’est pas interdit, bien sûr).
D’où sors-tu les valeurs de la colonne D ? d’un copier/coller d’un autre programme ?
Les valeurs me paraissent plus qu’incohérentes.
exemple ligne 4 : présent 6, absent 1, pourcentage 1 … 1% ?
et en suivant le raisonnement de ton tableau, présent 3, absent 3, ça fait du 100% d’absence ?
et présent 1 absent 4 -> 400% ?

pour le code :
Tu déclares i, mais tu ne déclares pas cel ; ce n’est pas cohérent
Pour éviter ça, il faudrait que tu mettes Option Explicit en tête de ton module.

Pourquoi fixer la limite basse à 160 ? tu tiens à coloriser tes cellules jusqu’en ligne 160 ? même vides ?
la bonne méthode, c’est celle que tu as utilisée quelques lignes plus haut : Range(“D65536”).End(xlUp)

que se passe-t-il si cel vaut -0.05 ou 101.5 ?
Pourquoi ne pas utiliser < et > au lieu de <= et >= ?

Avec cette méthode, tu vas exécuter systématiquement tes 15 lignes de if, même si tu as trouvé ton bonheur dans la première.
Ce qu’il faut faire, c’est utiliser un If … Elseif … Endif comme montré plus haut

Avec la méthode du if … ElseIf, si ta valeur est inférieure à 25, tu ne passes pas sur cette ligne là, donc tu peux simplifier ton code :
ElseIf cel.Value < 35 Then cel.Interior.ColorIndex = 17
attention : avec les if … ElseIf … End If, la valeur du then doit être mise sur la ligne suivante

exemple de code :

Option Explicit
Sub couleurs()
Dim i As Integer, cel As Range
 
For Each cel In Range("D2", Range("D65536").End(xlUp))
    If IsError(cel) Then cel.ClearContents
Next

For Each cel In Range("D2", Range("D65536").End(xlUp))
    Debug.Print cel.Value  ' à supprimer après mise au point
    cel.Select ' à supprimer après mise au point
    
    If cel.Value = "" Then
        cel.Interior.ColorIndex = 3
    ElseIf cel.Value < 0 Or cel.Value >= 101 Then
        cel.Interior.ColorIndex = 36
    ElseIf cel.Value < 25 Then
        cel.Interior.ColorIndex = 47
    ElseIf cel.Value < 35 Then
        cel.Interior.ColorIndex = 17
    ElseIf cel.Value < 40 Then
        cel.Interior.ColorIndex = 15
    ElseIf cel.Value < 45 Then
        cel.Interior.ColorIndex = 39
    ElseIf cel.Value < 50 Then
        cel.Interior.ColorIndex = 38
    ElseIf cel.Value < 55 Then
        cel.Interior.ColorIndex = 22
    ElseIf cel.Value < 60 Then
        cel.Interior.ColorIndex = 26
    ElseIf cel.Value < 65 Then
        cel.Interior.ColorIndex = 44
    ElseIf cel.Value < 70 Then
        cel.Interior.ColorIndex = 45
    ElseIf cel.Value < 75 Then
        cel.Interior.ColorIndex = 46
    ElseIf cel.Value < 85 Then
        cel.Interior.ColorIndex = 28
    ElseIf cel.Value < 95 Then
        cel.Interior.ColorIndex = 33
    ElseIf cel.Value < 100 Then
        cel.Interior.ColorIndex = 4
    Else  ' cel.Value < 101 
        cel.Interior.ColorIndex = 27
    End If
    cel.Offset(0, -3).Interior.ColorIndex = cel.Offset.Interior.ColorIndex
Next
End Sub

Normal, si on se réfère à ce que je t’avais donné, tu as supprimé les premières lignes de test, celles qui concernaient justement les valeurs de B.
Essaie d’abord de bien comprendre comment marche le code ci dessus (et surtout voir s’il correspond à ce que tu en attends), il sera facile de le compléter par la suite si tu ne modifies pas sa structure en profondeur.

Edit:
Qu’elqu’un connaît la solution pour qu’il n’y ait pas de smiley qui apparaisse au milieu du code ?
Edité le 30/12/2011 à 08:49

Bonjour gcc:hello:
le code que tu viens de me poster fonctionne a merveille
maintenant je vais suivre tes conseils pour adapter les autres conditions de B et de C
-Je te tiens au courant
Merci encore davoir pris de ton temps pour moi
:pt1cable:

Bonjour
Avant de continuer je vous souhaite à tous une bonne et heureuse Année

gcc,je n’arrive pas a integrer les codes pour les 100% dans ta macro
Alors voilàje le fait en deux temps
_ 1°j’applique ta macro sur la feuille"couleur"
_2°je copie lafeuille"couleur dans la feuille"traitement 100%" a laquelle j’ai integre un code que j’ai trouve sur un forum

( Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
For i = 2 To 160

             If Cells(i, 2) = 1 And Cells(i, 3) = 1 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 34
    If Cells(i, 2) = 2 And Cells(i, 3) = 2 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 4
    If Cells(i, 2) = 3 And Cells(i, 3) = 3 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 19
    If Cells(i, 2) = 4 And Cells(i, 3) = 4 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 27
    If Cells(i, 2) = 5 And Cells(i, 3) = 5 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 3
  If Cells(i, 2) = 2 And Cells(i, 3) = 1 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 19
  If Cells(i, 2) = 3 And Cells(i, 3) = 2 Then Range("A" & i & ":D" & i).Interior.ColorIndex = 45
  
Next

End Sub)

3° il ne me reste plus quà faire un copier/colage special "format"sur la feuille qui m’interesse

Cela peut surement etre amelioré,mais pour l’instant çà me convient
En tout cas merci pour votre aide
Miremy
PS ci_joint fichier final
www.toofiles.com…