Я хочу установить цвет шрифта ячейки на определенное значение RGB.
Если я использую
ActiveCell.Color = RGB(255,255,0)
Я становлюсь желтым, но если я использую более экзотическое значение RGB, например:
ActiveCell.Color = RGB(178, 150, 109)
Я просто получаю серый цвет обратно.
Почему я не могу просто использовать любое значение RGB? И знаете ли вы какие-нибудь обходные пути?
Спасибо.





Excel использует только цвета из цветовой палитры. Когда вы устанавливаете ячейку с использованием значения RGB, она выбирает ту из палитры, которая является наиболее подходящей. Вы можете обновить палитру своими цветами, а затем выбрать свой цвет, и это сработает.
Это позволит вам увидеть, что в настоящее время находится в палитре:
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
Это позволит вам установить палитру
Public Sub setPalette(palIdx As Integer, r As Integer, g As Integer, b As Integer)
ActiveWorkbook.Colors(palIdx) = RGB(r, g, b)
End Sub
Спасибо за ответы и комментарии.
Это действительно доставило мне большие проблемы, потому что у моего клиента были установлены другие плагины в Excel, которые также изменяли цветовую палитру.
В итоге я заменил несколько цветов в палитре, а затем присвоил моим элементам определенный ColorIndex, но, черт возьми, это некрасиво.
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
Подсказка: палитра Excel состоит из двух рядов цветов, которые используются редко и обычно могут быть установлены на пользовательские значения без видимых изменений в таблицах других людей.
Вот код для создания разумного набора «мягких» цветов, которые намного менее оскорбительны, чем значения по умолчанию:
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 lavenderEnd With
If Application.ScreenUpdating <> bScreenUpdating Then Application.ScreenUpdating = bScreenUpdating End If
End Sub
Public Sub SetGreyPalette() ' This subroutine creates a custom palette of greyshades 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 ' - USED BY SetPalePalette in this workbook ' Row 2: colors 25 to 32
' Code to capture existing Screen Updating settting and, if necessary, ' temporarily suspend updating while this procedure generates irritating ' flickers onscreen... remember to restore screen updating on exit!
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
With ThisWorkbook .Colors(25) = &HF0F0F0 .Colors(26) = &HE8E8E8 .Colors(27) = &HE0E0E0 .Colors(28) = &HD8D8D8 .Colors(29) = &HD0D0D0 .Colors(30) = &HC8C8C8 ' &HC0C0C0 ' Skipped &HC0C0C0 - this is the regular 25% grey in the main palette .Colors(31) = &HB8B8B8 ' Note that the gaps are getting wider: the human eye is more sensitive .Colors(32) = &HA8A8A8 ' to changes in light greys, so this will be perceived as a linear scale End With
'The right-hand column of the Excel default palette specifies the following greys:
' Colors(56) = &H333333 ' Colors(16) = &H808080 ' Colors(48) = &H969696 ' Colors(15) = &HC0C0C0 ' the default '25% grey'
' This should be modified to improve the color 'gap' and make the colours easily-distinguishable:
With ThisWorkbook .Colors(56) = &H505050 .Colors(16) = &H707070 .Colors(48) = &H989898 ' .Colors(15) = &HC0C0C0 End With
If Application.ScreenUpdating <> bScreenUpdating Then Application.ScreenUpdating = bScreenUpdating End If
End Sub
Вы можете написать функцию CaptureColors и ReinstateColors для событий Open () и BeforeClose () каждой книги ... Или даже для каждого события активации и деактивации рабочего листа.
У меня где-то валяется код, который создает «тепловой» цветовой градиент для трехмерных диаграмм, давая вам переход от «холодного» синего к «горячему» красному за тридцать два шага. Это сложнее, чем вы думаете: градиент цветов, который будет восприниматься зрительной системой человека как `` равные интервалы '' (который работает по логарифмической шкале интенсивности и имеет нелинейные веса для красного, зеленого и синего как `` сильных '' цветов). ) требуется время для создания - и вам нужно использовать VBA, чтобы заставить MS Chart использовать указанные вами цвета в указанном вами порядке.
Нил, спасибо за качественный ответ на мой старый вопрос.
Вы может обновляете палитру своими цветами, но обычно этого не следует делать. Одна из проблем заключается в том, что копирование и вставка в другую книгу с другой палитрой даст вам разные цвета. По этой причине обычно лучше придерживаться палитры по умолчанию.