Récupérer une palette de couleurs

Troudz

XLDnaute Occasionnel
Bonjour tout le monde,

J'ai écris le code suivant afin de récupérer le code RGB de chaque couleur de la palette d'un classeur :
Code:
Sub RecupPalette()
    Dim Cellule As Range
    Dim CoulRVB As Long
    For Each Cellule In Selection.Cells
        CoulRVB = Cellule.Interior.Color
        Rouge = Int(CoulRVB Mod 256)
        Vert = Int((CoulRVB Mod 65536) / 256)
        Bleu = Int(CoulRVB / 65536)
        Cellule = Cellule.Interior.ColorIndex & Chr(10) & Rouge & " - " & Vert & " - " & Bleu
     Next
End Sub
Le code s'exécute correctement mais quand je regarde les codes RGB obtenus, ils ne correspondent absolument pas à la palette de mon classeur mais semblent correspondre à la palette par défaut d'Excel 2002.
C'est à n'y rien comprendre.

Auriez vous une idée sur l'erreur que j'ai pu commettre ?

Je vous remercie par avance de votre aide
 

Pièces jointes

  • Classeur1.xls
    27 KB · Affichages: 68
  • Classeur1.xls
    27 KB · Affichages: 71
  • Classeur1.xls
    27 KB · Affichages: 72

Modeste geedee

XLDnaute Barbatruc
Re : Récupérer une palette de couleurs

Bonsour®
pour avoir un aperçu de la palette courante du classeur actif :
VB:
Sub RecupPalette()
     Dim Cellule As Range
     Dim CoulRVB As Long
     idx = 1
     Range("a1:g8").Select
     For Each Cellule In Selection.Cells
     Cellule.Interior.ColorIndex = idx
         CoulRVB = Cellule.Interior.Color
         Rouge = Int(CoulRVB Mod 256)
         Vert = Int((CoulRVB Mod 65536) / 256)
         Bleu = Int(CoulRVB / 65536)
         Cellule = Cellule.Interior.ColorIndex & Chr(10) & Rouge & " - " & Vert & " - " & Bleu
         idx = idx + 1
      Next
 End Sub

pour information complémentaire :
la palette peut être personnalisée par l'utilisateur, mais reste attachée a son propre classeur
pour récupérer la palette d'un autre classeur :
ActiveWorkbook.Colors = Workbooks("BOOK2.XLS").Colors
et restorer la palette par défaut
ThisWorkbook.ResetColors

à partir de EXCEL 2007 les cellules peuvent prendre des couleurs différentes de celles de la palette(limitée à 56 couleurs distinctes)
parmi 16~#millions RGB possibles)

dans ce cas l'instruction est Cellule.Interior.Color =RGB(Rouge(0-255),Vert(0-255),Bleu(0-255))
 

Troudz

XLDnaute Occasionnel
Re : Récupérer une palette de couleurs

Bonjour et merci à vous deux,

@Hasco : J'ai peut être mal compris ta réponse mais je reste toujours dans le même classeur. Je n'ai pas de classeur "source" ou "destination"
@Modeste : Merci, ton code fonctionne parfaitement. Me reste plus qu'à remettre tout ça dans l'ordre de la palette (qui malheureusement ne resepecte par l'index). Malheureusement, je ne vois toujours pas l'erreur que j'ai pu commettre dans mon code...
 

Troudz

XLDnaute Occasionnel
Re : Récupérer une palette de couleurs

Bon ben j'ai beau tourner le problème dans tous les sens, je ne vous vraiment pas ce qui justifie la différence de comportement entre la macro de Modeste et la mienne.

@Hasco : Ok je comprends mieux ^^
 

Troudz

XLDnaute Occasionnel
Re : Récupérer une palette de couleurs

Bon j'ai finalement tourné ma macro autrement et tout fonctionne comme je le voulais.
Si cela intéresse quelqu'un, voici donc un petit code qui permet de représenter la palette de couleur du classeur actif sur une nouvelle page avec numéro d'index et code R.G.B. et de préparer tout ça pour une impression :
Code:
Sub RecupPalette()
    Set MaFeuille = ActiveWorkbook.Sheets.Add
    OrdrePalette = Array(1, 53, 52, 51, 49, 11, 55, 56, 9, 46, 12, 10, 14, 5, 47, 16, 3, 45, 43, 50, 42, 41, 13, 48, 7, 44, 6, 4, 8, 33, 54, 15, 38, 40, 36, 35, 34, 37, 39, 2)
    Cptr = 0
    For i = 2 To 6
        For j = 2 To 9
            MaFeuille.Cells(i, j).Interior.ColorIndex = OrdrePalette(Cptr)
            CoulRVB = MaFeuille.Cells(i, j).Interior.Color
            Rouge = Int(CoulRVB Mod 256)
            Vert = Int((CoulRVB Mod 65536) / 256)
            Bleu = Int(CoulRVB / 65536)
            MaFeuille.Cells(i, j) = "Index : " & OrdrePalette(Cptr) & Chr(10) & "RGB : " & Rouge & " - " & Vert & " - " & Bleu
            Cptr = Cptr + 1
        Next
    Next
    With MaFeuille.Range("B2:I6")
        .ColumnWidth = 25
        .RowHeight = 80
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Font.Bold = True
        .Name = "Verdana"
        .Font.Size = 12
    End With
    MaFeuille.PageSetup.PrintArea = "$B$2:$I$6"
    With MaFeuille.PageSetup
        .LeftMargin = Application.InchesToPoints(0.21)
        .RightMargin = Application.InchesToPoints(0.21)
        .TopMargin = Application.InchesToPoints(0.21)
        .BottomMargin = Application.InchesToPoints(0.21)
        .HeaderMargin = Application.InchesToPoints(0.21)
        .FooterMargin = Application.InchesToPoints(0.21)
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .CenterHorizontally = True
        .CenterVertically = True
        .Orientation = xlLandscape
        .FitToPagesWide = 1
        .FitToPagesTall = 1
    End With
End Sub
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Récupérer une palette de couleurs

Bonsour®
:confused:
pure curiosité ...
OrdrePalette = Array(1, 53, 52, 51, 49, 11, 55, 56, 9, 46, 12, 10, 14, 5, 47, 16, 3, 45, 43, 50, 42, 41, 13, 48, 7, 44, 6, 4, 8, 33, 54, 15, 38, 40, 36, 35, 34, 37, 39, 2)
cet ordre est en effet l'ordre qui apparait quand on appelle via la commande format dans les versions avant XL2007.

Application.Dialogs.Item(xlDialogColorPalette).Show
les 56 colorIndex ne sont pas présent et il y a même redondance de certains .
The XL95 palette is arranged by index number and the XL97 palette is arranged chromatically.

mais la macro précédent listait les 56 colorIndex et ne divergeait pas par rapport résultat de ta propre propre macro :
à index égal =couleur identique
:cool:

voir là :
Color Palette and the 56 Excel ColorIndex Colors
 
Dernière édition:

Troudz

XLDnaute Occasionnel
Re : Récupérer une palette de couleurs

Bonjour Modeste et désolé de ne pas avoir vu ta réponse hier soir,

J'ai un peu de mal à comprendre ce que tu veux dire exactement.
Plusieurs points à relever :
- Je me suis intéressé uniquement aux versions antérieures à 2007 (je n'ai que ça au boulot)
- Je me suis intéressé uniquement aux 40 couleurs disponibles directement disponibles dans la barre d'outils et j'ai fait l'impasse sur les 16 couleurs complémentaires
- Ta macro liste les couleurs par numéro d'index. J'ai préféré les prendre dans l'ordre d'apparition dans la palette histoire d'avoir deux représentations fidèles visuellement parlant.
- J'ai juste pris la peine de rajouter un petit code pour présenter correctement la feuille et la rendre directement imprimable.

Après je dis pas que c'est un indispensable pour tout les utilisateurs d'Excel. Ça va me faciliter la vie car je bosse avec pas mal de palettes différentes mais 99% des utilisateurs n'en auront certainement pas besoin. C'est juste que je voulais pas garder ça pour moi.

Bonne jounrée
 

Modeste geedee

XLDnaute Barbatruc
Re : Récupérer une palette de couleurs

Bonsour®
désolé de ne pas avoir vu ta réponse hier soir,

J'ai un peu de mal à comprendre ce que tu veux dire exactement.
Plusieurs points à relever :
- Je me suis intéressé uniquement aux versions antérieures à 2007 (je n'ai que ça au boulot)

ce que je veux dire c'est que les colorIndex (palette par défaut) depuis la version EXCEL 97 n'ont pas changés
et sont toujours au nombre de 56 et avec les mêmes code RGB associés.
(je ne me prononcerai pas pour EXCEL 95 pour lequel le choix n'était que de 56 couleurs parmi ... 256)

la représentation pour le choix varie selon les menus, dialogues et les versions :
sous excel 95 c'était selon l'ordre croissant des colorIndex
sous excel 97 et suivant, selon un ordre chromatique .. ?
à partir de Excel 2007 a été introduite la notion de thème (indépendant des colorIndex qui ont été conservés pour compatibilité)
les thèmes permettent des classements par "ambiance" avec variation par teinte et ombre, malheureusement difficilement exploitable via VBA à cause de l'absence d'intégration des convertisseurs RVB(RGB) <=> TSL(HSL teinte , saturation lumière)

sous VBA il y a 8 couleurs correspondant à des constantes (relativement faciles à mémoriser Noir Blanc R G B Y M C) :
vbBlack, vbWhite,Vbred, vbgreen, vbblue, vbyellow, vbmagenta, vbcyan
qui correspondent respectivement aux colorIndex : 1 2 3 4 5 6 7 8
et respectivement aux RGB(Html) :#000000, #FFFFFF, #FF0000, #00FF00, #0000FF, #FFFF00, #FF00FF, #00FFFF
le colorindex 0 correspond à xlnone (absence couleur)
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 276
Messages
2 086 714
Membres
103 378
dernier inscrit
phdrouart