VBA : Couleur de police et lisibilité

DoubleZero

XLDnaute Barbatruc
Bonjour à toutes et à tous,

Une demande sotte, peut-être, et (ou) sans solution... mais non vitale :rolleyes: !

Pour une bonne lisibilité, serait-il possible de modifier la couleur de police en fonction de la couleur de fond ?

Exemples :
- police de couleur blanche si couleur de fond obscure ;
- police de couleur noire si couleur de fond claire.

Je vous remercie pour l'aide que vous pourrez m'apporter.

A bientôt :)
 

Pièces jointes

  • 00 - Couleurs de police et de fond.xls
    19 KB · Affichages: 79
  • 00 - Couleurs de police et de fond.xls
    19 KB · Affichages: 83
  • 00 - Couleurs de police et de fond.xls
    19 KB · Affichages: 86
Dernière édition:

Paritec

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonsoir 00 G..... le forum
je pense que c'est possible de le faire avec un exemple comme tu as mis en feuille 2
une macro qui scrute les pages et qui change les couleurs si c'est cela que tu souhaites?
c'est possible, si tu veux cela autrement??????
dans l'attente de te lire Bisous
a+
papou:)

EDIT : Zut J'ai Raté 00 Barbatruc félicitations et re Bisous
 

JBARBE

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonjour à tous,

Un exemple mais qui peut ne pas vous convenir compte tenu de la demande !

Bonne soirée !
 

Pièces jointes

  • Couleurs de police et de fond.xls
    63.5 KB · Affichages: 80
  • Couleurs de police et de fond.xls
    63.5 KB · Affichages: 104
  • Couleurs de police et de fond.xls
    63.5 KB · Affichages: 97
Dernière édition:

DoubleZero

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Re-bonjour, bonjour, papou :D,

Je te remercie de me venir en aide.

Si tu as une idée qui ne demande pas des heures de travail :(, fais comme tu le pressens.

Merci, itou, pour les félicitations, mais… je n’ai pas de mérite…. : combien d’âneries sur 2000 messages :eek: ?

Un gr:)s bisou et..

...A bientôt :)
 

DoubleZero

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Re-bonjour,

Un grand MERCI, JBARBE :), pour la solution proposée.

J'ai pensé, également, à faire de la sorte mais je souhaitais éviter de lister les couleurs dans la macro.

A bientôt :)
 

JBARBE

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Autre exemple dans la feuil1 en sachant qu'il y a 56 couleurs mais avec macro

Bonne soirée !
 

Pièces jointes

  • Couleurs de police et de fond.xls
    78 KB · Affichages: 143
  • Couleurs de police et de fond.xls
    78 KB · Affichages: 138
  • Couleurs de police et de fond.xls
    78 KB · Affichages: 133

DoubleZero

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Re-bonjour, bonjour, job75 :D,

Un nouveau grand MERCI, JBARBE :), pour l'aide apportée.

Le "hic" : j'aurais dû :eek: préciser que la couleur de fond peut être appelée par "interior.color" et pas forcément avec "interior.colorindex".

Quoi qu'il en soit, je place ce fichier dans mon coffre à trésors :D.

Un autre grand MERCI pour job75 : je vais, de ce pas, voir le lien mentionné.

A bientôt :)
 

Magic_Doctor

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonjour,

Job75 cite un fil que j’avais ouvert sur le même sujet. En fait je n’ai pas encore trouvé LA solution à ce problème. La macro de JBARBE nous condamne à utiliser toujours les mêmes couleurs de cellules, car je pense que l’exemple de DoubleZéro n’est qu’un exemple parmi des milliers d’autres… Il faudrait donc trouver un moyen de moduler automatiquement la tonalité de la couleur de la police en fonction de celle de la cellule, et ce quelle que soit la tonalité de cette dernière.
Je pense qu’il faut jongler avec les outils de la palette de couleurs. Dans ma version d’Excel (en espagnol) j’ai 2 possibilités : RGB et HSL.
RGB, c’est un peu le bordel quant aux nuances. En revanche, HSL me paraît nettement plus intéressant avec le paramètre « L » (Luminosité) qui varie dans l’intervalle [0 , 255]. En conséquence, quand « L », pour la couleur de la cellule, est supérieur à 125, il faudra foncer la couleur de la police, et quand L < 125 on l’éclaircira. Il suffira de bidouiller un petit algorithme pour nuancer le « L » de la couleur de la police au fur et à mesure de son éclaircissement ou de son obscurcissement.
Le problème est qu’il est facile d’utiliser RGB pour colorier, par exemple, une cellule :
[A1] .Interior.Color = RGB(49, 255, 125)
Mais comme VBA est bien souvent très con, si on écrit, en toute logique :
[A1] .Interior.Color = HSL(100, 255, 152)… ça ne marche évidemment pas !
Il faut, je pense, trouver un moyen pour convertir la couleur de la cellule au format HSL et, suivant la valeur de « L » adapter en conséquence la tonalité de la couleur de la police.
Je viens de chercher chez les "Anglo-Saxons" un moyen de convertir RGB en HSL, il y a des fils mais pas de réponse satisfaisante à ce sujet.
 
Dernière édition:

Victor21

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonsoir à tous.

Ce lien, peut-être ?
RGB to HSL conversion formula

The R,G,B values are divided by 255 to change the range from 0..255 to 0..1:
R' = R/255
G' = G/255
B' = B/255
Cmax = max(R', G', B')
Cmin = min(R', G', B')
Δ = Cmax - Cmin
Hue calculation:
hue-calc.gif

Saturation calculation:
sat-calc.gif

Lightness calculation:
L = (Cmax + Cmin) / 2
Y'a pu qu'à !!!
:)
 

Magic_Doctor

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonsoir Victor21,

Effectivement "Y'a pu qu'à"...
Je ne pensais pas que cette conversion fut si tordue !
J'ai trouvé ça ici : Algorithm to Switch Between RGB and HSB Color Values
VB:
'First, declare some types:

Type RGBColor
     Red As Byte
     Green As Byte
     Blue As Byte
End Type

Type HSBColor
     Hue As Double
     Saturation As Double
     Brightness As Double
End Type

'Next, here's a brief pseudocode explanation of the procedure used by the RGB-to-HSB algorithm:


'Set a Delta variable equal to [Max(r,g,b) - Min(r,g,b)]
'* Then Brightness = Max(r,g,b) * 100 / 255
'* If the color is (00,00,00) (black), then Saturation = 0, and h = -1; otherwise:
'   Saturation = 255 * Delta / Max(r,g,b)
'   Case Max(r,g,b) is equal to the value of
'                + Red : Set h = (Green - Blue) / Delta
'                + Green : h = 2 + (Blue - Red) / Delta
'                + Blue : h = 4 + (Red - Green) / Delta 
'    * Hue = h * 60 , if h small then 0 , we have Hue = h + 360

'Now, here's the VB code for the RGB-to-HSB conversion:

Function RGBToHSB(rgb As RGBColor) As HSBColor
Dim minRGB, maxRGB, Delta As Double
Dim h, s, b As Double
     h = 0
     minRGB = Min(Min(rgb.Red, rgb.Green), rgb.Blue)
     maxRGB = Max(Max(rgb.Red, rgb.Green), rgb.Blue)
     Delta = (maxRGB - minRGB)
     b = maxRGB
     If (maxRGB <> 0) Then
          s = 255 * Delta / maxRGB
     Else
          s = 0
     End If
     If (s <> 0) Then
          If rgb.Red = maxRGB Then
               h = (CDbl(rgb.Green) - CDbl(rgb.Blue)) / Delta
          Else
               If rgb.Green = maxRGB Then
                    h = 2 + (CDbl(rgb.Blue) - CDbl(rgb.Red)) / Delta
               Else
                    If rgb.Blue = maxRGB Then
                         h = 4 + (CDbl(rgb.Red) - CDbl(rgb.Green)) / Delta
                    End If
               End If
          End If
     Else
          h = -1
     End If
     h = h * 60
     If h < 0 Then h = h + 360
     RGBToHSB.Hue = h
     RGBToHSB.Saturation = s * 100 / 255
     RGBToHSB.Brightness = b * 100 / 255
End Function

'Of course, you also need to go the other direction, changing from HSB to RGB. Note that:

'    When Max = Red, abs((Green - Blue) / Delta) is always smaller than 1, or -1 < (Green - Blue) / Delta.
'    When Max = Green, abs((Blue - Red) / Delta) is always smaller than 1, or 1 < 2 + (Blue - Red) / Delta <3.
'    When Max = Blue, abs((Red - Green) / Delta) is always smaller than 1, or 3 < 4 + (Red - Green) / Delta <5.

'So, in pseudocode, the procedure is:

'Set h = Hue / 60
'    * Then s = Saturation * 255 / 100
'    * And b = Brightness * 255 / 100
'    * Max(r,g,b) will equal b.
'    * If s = 0  then the color is black (00,00,00), otherwise:
'          - Set Delta = s * Max(r,g,b) / 255
'          - Compare the value of h with 3,1,-1 in turn to find out the Values of Red, Green and Blue.

'In VB6, the HSB-to-RGB algorithm looks like this:

Function HSBToRGB(hsb As HSBColor) As RGBColor
Dim maxRGB, Delta As Double
Dim h, s, b As Double
     h = hsb.Hue / 60
     s = hsb.Saturation * 255 / 100
     b = hsb.Brightness * 255 / 100
     maxRGB = b
     If s = 0 Then
          HSBToRGB.Red = 0
          HSBToRGB.Green = 0
          HSBToRGB.Blue = 0
     Else
          Delta = s * maxRGB / 255
          If h > 3 Then
               HSBToRGB.Blue = CByte(Round(maxRGB))
               If h > 4 Then
                    HSBToRGB.Green = CByte(Round(maxRGB - Delta))
                    HSBToRGB.Red = CByte(Round((h - 4) * Delta)) + HSBToRGB.Green
               Else
                    HSBToRGB.Red = CByte(Round(maxRGB - Delta))
                    HSBToRGB.Green = CByte(HSBToRGB.Red - Round((h - 4) * Delta))
               End If
          Else
               If h > 1 Then
                    HSBToRGB.Green = CByte(Round(maxRGB))
                    If h > 2 Then
                         HSBToRGB.Red = CByte(Round(maxRGB - Delta))
                         HSBToRGB.Blue = CByte(Round((h - 2) * Delta)) + HSBToRGB.Red
                    Else
                         HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
                         HSBToRGB.Red = CByte(HSBToRGB.Blue - Round((h - 2) * Delta))
                    End If
               Else
                    If h > -1 Then
                         HSBToRGB.Red = CByte(Round(maxRGB))
                         If h > 0 Then
                              HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
                              HSBToRGB.Green = CByte(Round(h * Delta)) + HSBToRGB.Blue
                         Else
                              HSBToRGB.Green = CByte(Round(maxRGB - Delta))
                              HSBToRGB.Blue = CByte(HSBToRGB.Green - Round(h * Delta))
                         End If
                    End If
               End If
          End If
     End If
End Function
Ça a l'air de reprendre ce que vous avez posté.

Pour récupérer le code RGB j'avais trouvé ceci (qui marche) :
VB:
Sub CodeRGB()
Dim c As Long, bleu As Long, vert  As Long, rouge As Long

c = Selection.Interior.Color
bleu = c \ 65536
vert = (c - bleu * 65536) \ 256
rouge = c - bleu * 65536 - vert * 256
MsgBox (rouge & ", " & vert & ", " & bleu)

End Sub
Là j'en ai un peu marre, je verrai plus tard si enfin on peut récupérer le code HSL pour extraire "L"...

Bonne nuit.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : VBA : Couleur de police et lisibilité

Bonsoir.
Je propose mon module de calcul de couleurs.
Et une macro ContrastePolices à exécuter qui l'utilise.

Remarque: ce module de calcul de couleurs est aussi utilisé par ce petit programme Couleurs.exe.
Écrit en VB6, il est bien utile pour mettre au point des couleurs de contrôle harmonieuses dans les userform.
 

Pièces jointes

  • Couleurs.zip
    64.5 KB · Affichages: 74
  • Couleurs.zip
    64.5 KB · Affichages: 82
  • Couleurs.zip
    64.5 KB · Affichages: 82
  • 00 - Couleurs de police et de fond.xls
    128 KB · Affichages: 103
  • 00 - Couleurs de police et de fond.xls
    128 KB · Affichages: 116
  • 00 - Couleurs de police et de fond.xls
    128 KB · Affichages: 117
Dernière édition:

Discussions similaires

Réponses
17
Affichages
755

Membres actuellement en ligne

Statistiques des forums

Discussions
312 429
Messages
2 088 350
Membres
103 823
dernier inscrit
ben talha redouane