XL 2016 3 couleurs différentes

Nain porte quoi

XLDnaute Junior
Bonjour à tous,

je cherche à résoudre un problème (en VBA) qui est certainement très basique mais mon neurone ne trouve rien en cette période de confinement.
J'ai un fichier avec un certain nombre de cellule (ici 8 pour l'exemple), les 3 premières cellules doivent avoir comme couleur de fond du blanc (ou pas de couleur), ça ça va, les 2 suivantes ont une couleur de fond que je ne suis pas sensé connaitre à l'avance, mais différente de la première, et les 3 suivantes une autre couleur, donc différente des 2 premières, que je ne connais pas non plus.

La question est : comment je peux savoir en VBA que les cellules A1:A3 sont en blanc (ça ça va), les 2 suivantes sont d'une couleur différente de la première mais identiques entre elles, et les 3 dernières encore différentes des 2 premières mais identiques sur ces 3 là.

Cerise sur le gâteau, les couleurs des polices doivent être différentes des couleurs de fond (pas de police rouge sur fond rouge par exemple)

Le fichier d'exemple devrait être plus clair

Merci à ceux qui prendront le temps d'utiliser leur(s) neurone(s) :)
 

Pièces jointes

  • Classeur1.xlsx
    8.9 KB · Affichages: 18
Solution
bon
VB:
Private Type gr
    address As String
    couleur As Long
End Type


Sub test()
    Dim groupe() As gr, p As Range, C&, I&, tXt$
    Set plage = Range("A1:A20")
    C = 0
    For Each cel In plage.Cells
        If cel.Interior.Color <> C Then
            I = I + 1: ReDim Preserve groupe(1 To I)
            groupe(I).couleur = cel.Interior.Color
            groupe(I).address = cel.address
            C = cel.Interior.Color
        Else
            groupe(I).address = Union(Range(groupe(I).address), cel).address
        End If
    Next


    'lecture du compte rendu dans un message
    tXt = "il y a " & UBound(groupe) & " groupe(s)" & vbCrLf
    For I = 1 To UBound(groupe)
        tXt = tXt & vbCrLf & "groupe " & I & "  " &...

jmfmarques

XLDnaute Accro
Bonjour
J'ai un fichier avec un certain nombre de cellule (ici 8 pour l'exemple),
Va bene pour ce qui est du nombre "ici pour l 'exemple".
Mais en réalité : combien au maximum ?
et si grand nombre :
- une même couleur peut-elle être réattribuée plus loin ?
- quel doit être l' "écart" minimum entre deux couleurs différentes successives ? Car si faible : impossible de distinguer à l'oeil nu
- etc ..
Cela en fait, des questions qui doivent se poser avant même de commencer à développer cette chose, n'est-ce-pas ?


EDIT : pour le cas où ce que j'ai dit plus haut "échapperait" à une bonne compréhension, voilà une petite image de 19 cellules dont la propriété Interior.color est pourtant différente de l'une à l'autre :
(va falloir être très précis et très clair, n'est-il pas ?)
 

Pièces jointes

  • coul.jpg
    coul.jpg
    38.7 KB · Affichages: 24
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour
On peut établir environ une cinquantaine de couleurs différentes qui se distingueront à peu près les unes des autres, pas plus.
Cette ressource pourra vous aider à les établir.
L'écart peut porter sur une combinaison de trois caractéristiques: E, environ 5 ou 6, sur A, à peu près 8, et sur F, pas plus de 2 à mon avis: 1000 et 0 (avec 0, A ne les distinguera plus puisque ce ne seront que des gris).
Mon objet Couleur a une propriété CP qui donne le code de couleur de police conseillée si sa propriété C est celle d'un fond.
 
Dernière édition:

GALOUGALOU

XLDnaute Accro
bonjour naim porte quoi, bonjour le fil, bonjour le forum

pour connaitre la couleur de la cellule avec une fonction

VB:
Public Function COULEURCELLULE(Cible As Range) As Variant
COULEURCELLULE = Cible.Interior.ColorIndex
End Function

choisir une colonne et poser la formule
Code:
=COULEURCELLULE(A1)
étirer dans la colonne
cordialement
galougalou
 

Pièces jointes

  • couleur_cellule.xlsm
    13.7 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
bonjour
une solution avec des couleur en doublon (possible)
VB:
Option Explicit
Sub test()
'il peut y avoir des couleurs en doublon
Dim I&, CRGB&
Randomize
    For I = 3 To Cells(Rows.Count, "A").End(xlUp).Row
        CRGB = RGB(100 + (Rnd * 155), 100 + (Rnd * 155), 100 + (Rnd * 155))
        If I Mod 3 = 0 And Cells(I, "A").Interior.Color = 16777215 Then Cells(I - 2, 1).Resize(3).Interior.Color = CRGB
    Next
End Sub

une solution sans couleur en doublons possible(155*154*153 couleurs dispos)
VB:
Option Explicit
Sub test2()
'il ne peut pas y avoir de couleur en doublons
  Dim I&, CRGB&, dico
   Randomize
    Set dico = CreateObject("scripting.dictionary")
    For I = 3 To Cells(Rows.Count, "A").End(xlUp).Row
        If I Mod 3 = 0 Then
            If Cells(I, "A").Interior.Color = 16777215 Then
re:
                CRGB = RGB(100 + (Rnd * 155), 100 + (Rnd * 155), 100 + (Rnd * 155))
                If dico.exists(CRGB) Then GoTo re Else dico(CRGB) = ""
                Cells(I - 2, 1).Resize(3).Interior.Color = CRGB
            Else
                dico(Cells(I, "A").Interior.Color) = ""
            End If
        End If
    Next
End Sub
les deux solutions gardes les couleurs existantes elle ne font que mettre en couleurs celles qui ne l'ont pas été par tranche de 3 ligne
ce qui veux dire que la sub peut etre appelé par exemple dans l’événement sheet_change
ce qui aura pour effet de mettre a jour les cellules non colorées
 

Dranreb

XLDnaute Barbatruc
En restant toujours à la définition des couleurs induites par la combinaison des messages de @Nain porte quoi et de @jmfmarques, on peut aussi jouer sur EHJ. 64 couleurs ici :
1585481678421.png

VB:
Option Explicit
Sub CouleursEHJ()
   Dim Clr As New Couleur, Rng As Range, KE As Long, KH As Long, KJ As Long
      For KE = 1 To 4: For KH = 1 To 4: For KJ = 1 To 4
         Clr.EHJ IntpoLin(KE, 1, 250, 4, 750), IntpoLin(KH, 1, -100, 4, 100), IntpoLin(KJ, 1, -100, 4, 100)
         With ActiveSheet.Cells(KH + 1, 4 * KE + KJ - 3)
            .Value = "XXX"
            .Interior.Color = Clr.C
            .Font.Color = Clr.CP: End With
         Next KJ, KH, KE
   End Sub
Function IntpoLin(ByVal X As Double, ByVal X1 As Double, ByVal Y1 As Double, _
                                     ByVal X2 As Double, ByVal Y2 As Double) As Double
   IntpoLin = Y1 + (Y2 - Y1) * (X - X1) / (X2 - X1)
   End Function
 

Nain porte quoi

XLDnaute Junior
Merci à tous pour vos idées, mais je me suis certainement mal exprimé, désolé (mon neurone fatigué tout ça...)



J'ai testé vos exemple, mais ça n'est pas ce que je cherche.

Je ne veux pas à mettre une couleur, mais à savoir quelle couleur à été mise sur un groupe de cellule et vérifier que ces couleurs son identiques par groupe mais différentes entre les groupes.



J'essaye donc de recadrer l'exemple



Peu importe le nombre de cellule, je n'ai que 3 couleurs possibles, admettons un bleu quelconque, un vert quelconque et un rouge quelconque.

Ce que je ne sais pas à l'avance c'est quel est le bleu, ni quel est le vert ni le rouge. mais sur 4 cellules (par exemple) contiguës j'ai un rouge, sur les 2 suivantes (toujours contiguës) un vert et enfin du bleu sur les 5 suivantes.



Si vous me donner une solution sur le fichier d'exemple que j'ai donné plus haut, je me débrouillerais pour l'adapter.



Encore merci à tous, vous êtes vraiment très réactifs.
 

jmfmarques

XLDnaute Accro
Re ...
mais à savoir quelle couleur à été mise sur un groupe de cellule et vérifier que ces couleurs son identiques par groupe mais différentes entre les groupes
n'est compréhensible en l'état que s'il n'y a que 3 groupes différents
Je crois vraiment que tu dois faire l'effort d'être très précis, si l'on veut éviter de jouer au jeu de piste.
 

Nain porte quoi

XLDnaute Junior
re le fil
ah bon................................
il me semble que le message #5 est passé inaperçu, il répond totalement à
"mais à savoir quelle couleur à été mise sur un groupe de cellule "
cordialement
galougalou
J'ai bien vu votre message et il ne me dit pas si j'ai 3 couleurs différentes ni si les 3 couleurs sont appliquées à tel groupe de cellule.
Le tout uniquement en VBA, merci
 

patricktoulon

XLDnaute Barbatruc
vite fait comme ca un dico
VB:
Sub test()
 Dim groupe
 Set groupe = CreateObject("scripting.dictionary")
 For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
  groupe(Cells(i, 1).Interior.Color) = groupe(Cells(i, 1).Interior.Color) & Cells(i, 1).Address(0, 0) & IIf(i < Cells(Rows.Count, 1).End(xlUp).Row - 1, ",", "")
 
Next
For Each elem In groupe
MsgBox "pour la couleur " & elem & " c'est la plage " & groupe(elem)
Next
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 132
Messages
2 116 589
Membres
112 798
dernier inscrit
nicoolio