Conditionner la couleur d'ecriture à des données

Bonjour,

Novice en VBA je tente d’écrire une macro

J'ai un fichier avec 2 feuilles, la 1ére (saisie) concerne les données brutes,

la 2émé lecture concerne la ventilation des données selon les critères "nbre de tome" et "observation"

si dans observation il y a " " ou "A " écrire en noir

si dans observation il y a "B " ou "A ET B " écrire en rouge

si dans observation il y a "C " ou "A ET C" écrire en vert

je n'arrive pas à écrire le code qui active ces 3 conditions.

je précise que le fichier joint n'est que la partie que je n'arrive pas a résoudre .

Merci pour votre aide

21forum.xlsm (23.06 Ko)

Bonjour,

Vu l'écriture de ta macro, j'ai quelque doute sur ce que tu veux finalement faire (?)

D'où une remise en état de la macro de façon qu'elle produise un résultat...

Sub ventilation()
    Dim ecriture(7) As String, c As Long
    Dim Criteres As Integer, i As Integer, j As Integer
    With ThisWorkbook.Worksheets("saisie")
        If .AutoFilterMode Then
            If .FilterMode Then .ShowAllData
        End If
        For i = 1 To 7
            ecriture(i) = Chr(i + 64)
        Next i
        j = 2
        For i = 5 To .Cells(5, 1).End(xlDown).Row
            Criteres = .Cells(i, 4)
            If .Cells(i, 9) Like "*B*" Then
                c = vbRed
            ElseIf .Cells(i, 9) Like "*C*" Then
                c = vbGreen
            Else
                c = vbBlack
            End If
            Worksheets("lecture").Range(ecriture(Criteres) & i + j) = .Cells(i, 1)
            Worksheets("lecture").Range(ecriture(Criteres) & i + j).Font.Color = c
        Next i
        Worksheets("lecture").Range("A4") = .Range("F2")
    End With
End Sub

Là j'ai pris soin de ne réutiliser que les éléments qui y figuraient, quite à modifier le type de données et l'utilisation (et à écrire le code de façon correcte).

Mais ce n'est pas vraiment optimisé... Je veux bien la réécrire en mieux mais en étant sûr du résultat final à obtenir !

Cordialement.

Bonsoir,

Merci infiniment,

effectivement je trouve ce que je t'ai demandé

je t'ai mis la feuille "lecture" telle qu'elle devrait apparaître si tu peux améliorer merci par avance.

17forum.xlsm (27.51 Ko)

Bonsoir,

Procédure revue...

Sub ventilation()
    Dim iLec(7) As Integer, fLec As Worksheet, cPol, obs$, cri%, c%, n%, i%
    For i = 1 To 7
        iLec(i) = 8
    Next i
    cPol = Array(vbBlack, vbRed, vbGreen)
    Set fLec = ThisWorkbook.Worksheets("lecture")
    With ThisWorkbook.Worksheets("saisie")
        If .AutoFilterMode Then
            If .FilterMode Then .ShowAllData
        End If
        n = .Cells(5, 1).End(xlDown).Row
        fLec.Range("A8:G" & n).ClearContents
        For i = 5 To n
            cri = .Cells(i, 4): obs = "A" & Trim(.Cells(i, 9))
            c = Asc(Right(obs, 1)) - 65
            fLec.Cells(iLec(cri), cri) = .Cells(i, 1)
            fLec.Cells(iLec(cri), cri).Font.Color = cPol(c)
            iLec(cri) = iLec(cri) + 1
        Next i
        fLec.Range("A4") = .Range("F2")
    End With
    fLec.Activate
End Sub

Cordialement.

18clio-forum.xlsm (32.32 Ko)

Merci pour cette réponse et la rapidité à résoudre mon problème.

dans ta précédente reponse j'avais rajouté End(xlUp)(1).Offset(1, 0)

Worksheets("Ventil Parts").Range(ecriture(Criteres) & i + j). End(xlUp)(1).Offset(1, 0)

et cela ma permis d'obtenir ce que je voulais en présentation.

ta nelle version est très optimisée mais plus difficile à lire et comprendre pour un débutant mais elle me va très bien

merci encore

Bonsoir,

J’ai voulu changer les valeurs de la colonne obser la macro fonctionne sur les 4 premières lignes mais plante à la 5eme

" L’indice n'appartient pas à la sélection".

ex de changement " A " remplacé par BB

"B" PP

Le code que tu utilises ne me permet pas de voir pourquoi cela bloque

Peux tu aussi m'expliquer les 2 lignes ci dessous si tu as de la dispo

cri = .Cells(i, 4): obs = "A" & Trim(.Cells(i, 9))

c = Asc(Right(obs, 1)) - 65

merci

Bonsoir,

Tu semblais trouver le dernier code fourni difficile à lire ! Permets-moi de penser le contraire car ne prenant pas de chemin détourné et ne comportant pas de commande inutile, on peut le décortiquer nettement plus vite...

Il y a toujours (qu'on soit débutant ou non) quelques questions au sujet de mots-clés ou d'instructions qu'on ne décode pas spontanément... Le recours à l'Aide reste pour cela ce qu'il y a de mieux (et il est bon d'apprendre à y recourir à tout moment et pouvoir y circuler avec rapidité).

Cet aspect levé, la première doit permettre de faire le tri entre les éléments qui préparent la démarche qu'on va suivre, le recueil éventuel de données à traiter, le traitement proprement dit et la production du résultat souhaité. Ce faisant on reconstitue la façon dont le problème à été analysé pour y apporter une solution...

Petite précision d'écriture : le signe deux-points (:) dans une ligne de code (hors présence dans du texte entre guillemets) est un séparateur. Il permet de placer plusieurs lignes de code sur la même ligne. De même qu'à l'inverse, une ligne se terminant par espace suivi de underscore ( _) se poursuit en fait à la ligne suivante (il s'agit là d'un indicateur de continuité).

Ainsi :

cri = .Cells(i, 4): obs = "A" & Trim(.Cells(i, 9))

comprend 2 lignes de code distinctes.

Le premier code fourni conservait ta démarche formelle (bien que n'utilisant pas le filtrage...) en produisant le résultat que tu aurais obtenu si ta procédure initiale avait été fonctionnelle. Si cela avait été effectivement le résultat voulu j'aurais testé l'utilisation du filtrage pour voir s'il pouvait s'avérer plus efficace (je ne le pense pas compte tenu de la question des couleurs obligeant à un 2e passage...)

Le résultat voulu ayant été précisé, j'ai abandonné définitivement le filtrage qui ne permettait de répondre efficacement à la question.

Tu as une liste de titre en col. 1 de ton tableau à répartir en 7 colonnes en fonction d'un critère se trouvant en col. 4. On doit donc balayer la liste et prélever le critère qui nous fournira la colonne du tableau résultat. Pour la ligne, on prépare un tableau d'éléments correspondant aux colonnes à servir, qu'on initialise à la première ligne à servir pour toutes les colonnes (et qu'on incrémentera au fur et à mesure ensuite). Le critère nous fournit simultanément l'indice de l'élément du tableau contenant le numéro de ligne à servir.

[A noter (pour ordre) qu'on a dimensionné un tableau de 8 éléments dont on n'utilise pas l'élément d'indice 0...]

S'il n'y avait pas eu le problème des couleurs (individualisées pour chaque entrée), j'aurais prélevé les données pour en faire un tableau de résultats à affecter à la feuille cible en une seule fois à la fin. Avec les couleurs, il s'avérait plus pratique d'affecter chaque entrée et la colorer dans le même temps (la liste ne comportant pas plusieurs dizaines de milliers de lignes, l'écart d'exécution reste négligeable).

Il convenait cependant d'obtenir la couleur à appliquer sans avoir à multiplier les tests. On a donc préparé un tableau des 3 couleurs voulues affecté à une variable de type Variant. L'appel de ce tableau avec les indices 0, 1, 2 renverra respectivement Noir, Rouge, Vert.

La critère déterminant la couleur se trouve en colonne 9 : rien ou A (Noir), se terminant par B (Rouge), se terminant par C (Vert).

Il fallait donc aboutir à ce que la terminaison de la données en col. 9 : A, B ou C nous permette de renvoyer 0, 1, 2.

On y parvient en deux temps :

on récupère la valeur en col. 9 dans la variable obs, en faisant précéder cette valeur d'un "A" (qui compense l'absence de mention devant renvoyer la même valeur de couleur) :

obs = "A" & Trim(.Cells(i, 9))

La fonction Trim permet de supprimer les espaces d'extrémités (il y en a !)

On sait que les codes des caractères majuscules A à Z sont de 65 à 90 (pour les minuscules a à z, c'est 97 à 122), d'où :

c = Asc(Right(obs, 1)) - 65

affectera à c, 0 si la chaîne obs (complétée) se termine par A, 1 si par B et 2 si par C. Soit l'indice du tableau de couleurs correspondant à la couleur voulue...

Cordialement.

Bonjour

Merci pour tes explications détaillées, donc si j'ai bien compris, pour que cela fonctionne, il me faut terminer mes observations par blanc, A, B ou C et si je veux ajouter d'autres critères associés à d'autres couleurs, je continue l'ordre alphabétique majuscule et j'ajoute ma ou mes couleurs dans la variable cPol.

Avec encore tous mes remerciements

Si tu modifies les critères de couleurs, il faut éventuellement réécrire cette partie du code, selon le système choisi.

Mais tu peux effectivement le prolonger en poursuivant avec D, E, F... (qui doit terminer la mention en observation, et en ajoutant des couleurs dans le tableau cPol (sans autre modification du code).

Tu disposes encore de constantes Visual Basic pour vbBlue, vbCyan, vbMagenta, vbYellow (ou vbWhite) ou tu peux les définir avec la fonction RGB(indexRouge, indexVert, indexBleu)...

Cordialement.

Merci

Rechercher des sujets similaires à "conditionner couleur ecriture donnees"