Настройка цвета шрифта в VBA

Я хочу установить цвет шрифта ячейки на определенное значение RGB.

Если я использую

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

Я получаю желтый, но если я использую более экзотическое значение RGB, например:

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

Я просто возвращаю серый цвет.

почему я не могу просто использовать любое значение RGB? И знаете ли вы какие-либо обходные пути?

спасибо.

4 ответов


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 имеет две строки цветов, которые редко используются и обычно могут быть установлены в пользовательские значения без видимых изменений в листах других людей.

вот код для создания разумного набора цветов "мягкого тона", которые намного менее оскорбительны, чем значения по умолчанию:


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

Заканчивается

Если Приложения.ScreenUpdating bScreenUpdating затем Приложение.Свойство screenupdating = bScreenUpdating Конец Если

End Sub

Публичный Суб SetGreyPalette() "Эта подпрограмма создает пользовательскую палитру greyshades, которую вы можете использовать для управления, заголовков и диалогов

' * * ЭТОТ КОД НАХОДИТСЯ В ОТКРЫТОМ ДОСТУПЕ ** Найджел Хеффернан http://Excellerando.Blogspot.com

' цветовая палитра Excel имеет две скрытые строки, которые редко используются: 'Row 1: colors 17 to 24' - используется SetPalePalette в этой книге ' Строка 2: цвета от 25 до 32

' код для захвата существующего экрана обновления настройки и, при необходимости, 'временно приостановить обновление, пока эта процедура вызывает раздражение - мерцает на экране... помните, восстановление, обновление на выход!

Dim bScreenUpdating как Boolean

bScreenUpdating = приложение.Свойство screenupdating

Если bScreenUpdating = True, то Приложение.ScreenUpdating = False Конец, Если

'Если Приложение.ScreenUpdating bScreenUpdating затем - Заявление.Свойство screenupdating = bScreenUpdating - Конец, Если!--2-->

С ThisWorkbook .Цвета (25) = &HF0F0F0 .Цвета (26) = & HE8E8E8 .Цвета (27) = & HE0E0E0 .Цвета (28) = & HD8D8D8 .Цвета (29) = & HD0D0D0 .Цвета (30) = & HC8C8C8 '&HC0C0C0 ' Skipped &HC0C0C0 - это обычный 25% серый цвет в основной палитре .Цвета (31) = & HB8B8B8 ' обратите внимание, что пробелы становятся шире: человеческий глаз больше чувствительный .Цвета (32) = & HA8A8A8 ' для изменения светло-серого цвета, поэтому это будет восприниматься как линейный масштаб Конец С

' в правом столбце палитры Excel по умолчанию указаны следующие серые цвета:

' Цвета (56) = &H333333 Цвета(16) = &H808080 Цвета(48) = &H969696 'Colors (15) = &HC0C0C0' по умолчанию '25% серый'

'Это должно быть изменено, чтобы улучшить цвет "разрыв" и сделать цвета легко различимый:

С ThisWorkbook .Цвета(56) = & H505050 .Цвета(16) = &H707070 .Цвета (48) = &H989898 '.Цвета (15) = & HC0C0C0 Конец С

Если Приложения.ScreenUpdating bScreenUpdating затем Приложение.Свойство screenupdating = bScreenUpdating Конец, Если

End Sub

вы можете написать функцию "CaptureColors" и "ReinstateColors" для каждой книги Open() и BeforeClose() события... Или даже для каждого события activate и deactivate рабочего листа.

У меня есть код, лежащий где-то, который создает "тепловой" градиент цвета для трехмерных диаграмм, давая вам прогрессию от "холодного" синего до "горячего" красного в тридцать два шага. Это сложнее, чем вы думаете: градиент цветов, который будет восприниматься как "равные интервалы" человеческой зрительной системой (которая работает по логарифмической шкале интенсивности и имеет нелинейные весы для красного, зеленого и синего как "сильный"). colours) занимает время, чтобы построить - и вы должны использовать VBA, чтобы заставить MS Chart использовать указанные вами цвета в указанном Вами порядке.


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, которые также изменили цветовую палитру.

Я закончил тем, что заменил несколько цветов в палитре, а затем asigning мои элементы конкретного ColorIndex, но мальчик, это не красиво.