2008-12-18 9 views
6

Je souhaite définir la couleur de police d'une cellule sur une valeur RVB spécifique.Définition d'une couleur de police dans VBA

Si je

ActiveCell.Color = RGB(255,255,0) 

Je reçois jaune, mais si j'utilise une valeur RVB plus exotiques comme:

ActiveCell.Color = RGB(178, 150, 109) 

Je viens d'obtenir une couleur grise arrière.

Pourquoi ne puis-je pas utiliser une valeur RGB? Et connaissez-vous des solutions de contournement?

Merci. Excel n'utilise que les couleurs de la palette de couleurs.

Répondre

7

Excel utilise uniquement les couleurs de la palette de couleurs. Lorsque vous définissez une cellule à l'aide de la valeur RVB, elle choisit celle de la palette correspondant le mieux. Vous pouvez mettre à jour la palette avec vos couleurs, puis choisissez votre couleur et cela fonctionnera.

Cela vous permettra de voir ce qui est actuellement dans la palette:

Public Sub checkPalette() 
     Dim i As Integer, iRed As Integer, iGreen As Integer, iBlue As Integer 
     Dim lcolor As Long 
     For i = 1 To 56 
     lcolor = ActiveWorkbook.Colors(i) 
     iRed = lcolor Mod &H100 'get red component 
     lcolor = lcolor \ &H100 'divide 
     iGreen = lcolor Mod &H100 'get green component 
     lcolor = lcolor \ &H100 'divide 
     iBlue = lcolor Mod &H100 'get blue component 
     Debug.Print "Palette " & i & ": R=" & iRed & " B=" & iBlue & " G=" & iGreen 
     Next i 
    End Sub 

Cela vous permettra de définir la palette

Public Sub setPalette(palIdx As Integer, r As Integer, g As Integer, b As Integer) 
    ActiveWorkbook.Colors(palIdx) = RGB(r, g, b) 
End Sub 
+0

Vous pouvez * mettre à jour la palette avec vos couleurs, mais vous devriez généralement éviter de le faire. Un problème est que copier et coller dans un classeur différent avec une palette différente vous donnera différentes couleurs. Pour cette raison, il est généralement préférable de coller à la palette par défaut. – Joe

+0

Je voulais dire contre ... whoops, merci Joe. – LeppyR64

0

Merci pour les réponses et les commentaires aussi.

Cela m'a vraiment donné beaucoup de problèmes parce que mon client avait d'autres plugins installés dans Excel qui ont également altéré la palette de couleurs.

J'ai fini par remplacer quelques couleurs dans la palette puis asigner mes éléments le ColorIndex spécifique, mais mon garçon, ce n'est pas joli.

1
Sub color() 

bj = CStr(Hex(ActiveCell.Interior.Color)) 
If Len(bj) < 6 Then 
    Do Until Len(bj) = 6 
     bj = "0" & bj 
    Loop 
End If 

R = CLng("&H" & Right(bj, 2)) 
bj = Left(bj, Len(bj) - 2) 
G = CLng("&H" & Right(bj, 2)) 
bj = Left(bj, Len(bj) - 2) 
B = CLng("&H" & bj) 

End Sub 
2

Une astuce rapide: la palette Excel a deux lignes de couleurs qui sont rarement utilisées et peuvent généralement être réglés sur des valeurs personnalisées sans modifications visibles sur les feuilles des autres peuples.

Voici le code pour créer un ensemble raisonnable de 'tons doux' des couleurs qui sont beaucoup moins offensive que les paramètres par défaut:

Public Sub SetPalePalette(Optional wbk As Excel.Workbook) ' This subroutine creates a custom palette of pale tones which you can use for controls, headings and dialogues '

' ** THIS CODE IS IN THE PUBLIC DOMAIN ** ' Nigel Heffernan http://Excellerando.Blogspot.com

' The Excel color palette has two hidden rows which are rarely used: ' Row 1: colors 17 to 24 ' Row 2: colors 25 to 32 - USED BY SetGrayPalette in this workbook '

' Code to capture existing Screen Updating settting and, if necessary, ' temporarily suspend updating while this procedure generates irritating ' flickers onscreen... and restore screen updating on exit if required.

Dim bScreenUpdating As Boolean

bScreenUpdating = Application.ScreenUpdating

If bScreenUpdating = True Then Application.ScreenUpdating = False End If

'If Application.ScreenUpdating <> bScreenUpdating Then ' Application.ScreenUpdating = bScreenUpdating 'End If

If wbk Is Nothing Then Set wbk = ThisWorkbook End If

With wbk

.Colors(17) = &HFFFFD0 ' pale cyan 
.Colors(18) = &HD8FFD8 ' pale green. 
.Colors(19) = &HD0FFFF ' pale yellow 
.Colors(20) = &HC8E8FF ' pale orange 
.Colors(21) = &HDBDBFF ' pale pink 
.Colors(22) = &HFFE0FF ' pale magenta 
.Colors(23) = &HFFE8E8 ' lavender 
.Colors(24) = &HFFF0F0 ' paler lavender 

End With

Si Application.ScreenUpdating <> bScreenUpdating Puis Application.ScreenUpdating = bScreenUpdating End If

End Sub

Sous SetGreyPalette publique() 'Ce sous-programme crée une palette personnalisée de greyshades que vous pouvez utiliser pour les contrôles, les titres et les dialogues

' ** CE CODE eST DANS LE DOMAINE PUBLIC ** 'Nigel Heffernan http://Excellerando.Blogspot.com

' La palette de couleurs Excel a deux lignes cachées qui sont rarement utilisées: 'Ligne 1: couleurs 17 à 24' - UTILISÉ PAR SetPalePalette dans ce classeur 'Row 2: couleurs 25 à 32

' Code pour capturer existant Mise à jour de l'écran settting et, le cas échéant, "suspendre temporairement la mise à jour alors que ce procédure génère irritant 'scintille à l'écran ... n'oubliez pas de restaurer la mise à jour de l'écran à la sortie!

Dim bScreenUpdating As Boolean

bScreenUpdating = Application.ScreenUpdating

Si bScreenUpdating = True Then Application.ScreenUpdating = False End If

'Si Application.ScreenUpdating <> bScreenUpdating Ensuite ' Application.ScreenUpdating = bScreenUpdating 'Fin Si

Avec ThisWorkbook .colors (25) = & HF0F0F0 .colors (26) = & HE8E8E8 .colors (27) = & HE0E0E0 .colors (28) = & HD8D8D8 .colors (29) = & HD0D0D0. couleurs (30) = & HC8C8C8 '& HC0C0C0' & HC0C0C0 Skipped - c'est le 25% de gris régulier dans la palette principale .colors (31) = & note 'HB8B8B8 que les lacunes deviennent plus larges: l'oeil humain est plus sensible .Couleurs (32) = & HA8A8A8 ' aux changements de gris clairs, donc ce sera perçu comme une échelle linéaire End With

« La colonne de droite de la palette par défaut Excel spécifie les grays suivants:

» Couleurs (56) = & H333333 'couleurs (16) = & H808080' couleurs (48) = & H969696 'couleurs (15) = & HC0C0C0 la valeur par défaut '25% de gris '

' Cela devrait être modifiée pour améliorer la couleur « écart 'et faire les couleurs facilement-distinguuishab le:

Avec ThisWorkbook .colors (56) = & H505050 .colors (16) = & H707070 .colors (48) = & H989898 '.Couleurs (15) = & HC0C0C0 End Avec

Si Application.ScreenUpdating <> bScreenUpdating Alors Application.ScreenUpdating = bScreenUpdating End If

End Sub

Vous pouvez choisir écrire une fonction 'CaptureColors' et 'ReinstateColors' pour les événements Open() et BeforeClose() de chaque classeur ... Ou même pour chaque travail heet active et désactive l'événement. J'ai un code qui traîne quelque part qui crée un dégradé de couleur «thermique» pour les diagrammes 3D, ce qui vous permet de passer du rouge «froid» au rouge «chaud» en trente-deux étapes. Ceci est plus difficile que vous ne le pensez: un gradient de couleurs qui sera perçu comme des «intervalles égaux» par le système visuel humain (qui fonctionne sur une échelle logarithmique d'intensité et qui a des pondérations non linéaires pour le rouge, le vert et le bleu) prend du temps à construire - et vous devez utiliser VBA pour forcer MS Chart à utiliser les couleurs que vous spécifiez, dans l'ordre que vous avez spécifié.

+0

Nil, merci de fournir une réponse de qualité à ma vieille question. –

Questions connexes