2008-12-18 14 views
6

Ich möchte die Schriftfarbe einer Zelle auf einen bestimmten RGB-Wert festlegen.Festlegen einer Schriftfarbe in VBA

Wenn ich

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

ich gelb tun, aber wenn ich einen exotischere RGB-Wert wie verwenden:

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

bekomme ich nur eine graue Farbe zurück.

Wieso kann ich nicht einfach irgendeinen RGB-Wert verwenden? Und kennen Sie Workarounds?

Danke.

Antwort

7

Excel verwendet nur die Farben in der Farbpalette. Wenn Sie eine Zelle mit dem RGB-Wert festlegen, wird diejenige in der Palette ausgewählt, die am ehesten übereinstimmt. Sie können die Palette mit Ihren Farben aktualisieren und dann Ihre Farbe auswählen, und das wird funktionieren.

So können Sie sehen, was derzeit in der Palette ist:

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 

Diese Sie die Palette gesetzt werden lassen

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

Sie * können * die Palette mit Ihren Farben aktualisieren, sollten dies aber generell vermeiden. Ein Problem besteht darin, dass das Kopieren und Einfügen in eine andere Arbeitsmappe mit einer anderen Palette unterschiedliche Farben ergibt. Aus diesem Grund ist es normalerweise besser, sich an die Standardpalette zu halten. – Joe

+0

Ich wollte dagegen vorschlagen ... whoops, danke Joe. – LeppyR64

0

Danke für die Antworten und die auch Kommentare.

Es gab mir wirklich große Probleme, weil mein Client andere Plugins in Excel installiert hatte, die auch die Farbpalette manipulierten.

Ich landete ein paar Farben in der Palette und dann meine Elemente den spezifischen ColorIndex zuweisen, aber Junge, es ist nicht schön.

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

Ein Tipp: Die Excel-Palette hat zwei Reihen von Farben, die selten verwendet werden und können in der Regel, um benutzerdefinierte Werte ohne sichtbare Änderungen anderer Völker Blätter eingestellt werden.

Hier ist der Code, um einen vernünftigen Satz von 'Soft-Ton' Farben zu erzeugen, die die Standardwerte weit weniger verletzend als:

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

Wenn Application.ScreenUpdating <> bScreenUpdating Dann Anwendung.ScreenUpdating = bScreenUpdating End If

End Sub

Public Sub SetGreyPalette() 'für Kontrollen, Überschriften und Dialoge Dieses Unterprogramm eine eigene Palette von greyshades erstellt, die Sie

verwenden können' ** THIS Code ist im PUBLIC DOMAIN ** 'Nigel Heffernan http://Excellerando.Blogspot.com

' Die Excel-Farbpalette hat zwei versteckte Zeilen, die selten verwendet werden: 'Row 1: Farben 17 bis 24' - USED BY SetPalePalette in dieser Arbeitsmappe 'Row 2: Farben 25 bis 32

' Code erfassen Bildschirmaktualisierung bestehenden settting und, falls erforderlich, 'vorübergehend Aktualisierung während dieses suspendieren Verfahren erzeugt irritierende 'flackert auf dem Bildschirm ... Denken Sie daran, die Bildschirmaktualisierung beim Beenden wiederherzustellen!

Dim bScreenUpdating As Boolean

bScreenUpdating = Application.ScreenUpdating

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

'Wenn Application.ScreenUpdating <> bScreenUpdating Dann ' Application.ScreenUpdating = bScreenUpdating 'Ende Wenn

Mit Diesearbeitsmappe .colors (25) = & HF0F0F0 .colors (26) = & HE8E8E8 .colors (27) = & HE0E0E0 .colors (28) = & HD8D8D8 .colors (29) = & HD0D0D0 . Farben (30) = & HC8C8C8 '& HC0C0C0' Ausgelassene & HC0C0C0 - das ist das regelmäßige 25% grau in der Hauptpalette ist .colors (31) = & HB8B8B8 'Beachten Sie, dass die Lücken werden immer breiter: das menschliche Auge mehr empfindlich . Farben (32) = & HA8A8A8 ' auf Änderungen des Licht Grays, so wird dies als eine End lineare Skala wahrgenommen wird mit

‚Die rechte Spalte der Excel Standardpalette gibt die folgenden Grays:

‘ Farben (56) = & H333333 'Farben (16) = & H808080 ' Farben (48) = & H969696 'Farben (15) = & HC0C0C0' '25% des Standardgrau '

' Dies soll die Farbe ‚Lücke zu verbessern, modifiziert werden 'und machen Sie die Farben leicht-distinguishab le:

Mit Diesearbeitsmappe .colors (56) = & H505050 .colors (16) = & H707070 .colors (48) = & H989898 '.Farben (15) = & HC0C0C0 End With

Wenn Application.ScreenUpdating <> bScreenUpdating Dann Application.ScreenUpdating = bScreenUpdating End If

End Sub

Sie können wählen, um die Funktionen CaptureColors und ReinestColors für die Open() - und BeforeClose() - Ereignisse jeder Arbeitsmappe zu schreiben ... oder sogar für jede Arbeit heet's aktiviert und deaktiviert das Ereignis.

Ich habe irgendwo Code herumliegen, der einen 'thermischen' Farbverlauf für 3-D-Diagramme erzeugt, der Ihnen eine Fortentwicklung von 'Kalt' Blau zu 'Heiß' Rot in zweiunddreißig Schritten gibt. Dies ist schwieriger, als Sie vielleicht denken: Ein Farbverlauf, der vom menschlichen visuellen System als "gleiche Intervalle" wahrgenommen wird (das auf einer logarithmischen Skala der Intensität verläuft und nichtlineare Gewichtungen für Rot, Grün und Blau als "starke" Farben hat)) braucht Zeit, um zu konstruieren - und Sie müssen VBA verwenden, um MS Chart zu zwingen, die von Ihnen angegebenen Farben in der von Ihnen angegebenen Reihenfolge zu verwenden.

+0

Nil, danke, dass du meiner gealterten Frage eine qualitativ hochwertige Antwort gegeben hast. –

Verwandte Themen