Кажется, что нет родного способа сделать это из графического интерфейса. Тем не менее, это не сложно в VBA. Эта подпрограмма устанавливает цвет переднего плана / текста каждой ячейки в Target
диапазоне на цвет, линейно интерполированный между цветом Lo
цветом Hi
, исходя из того, как значение в ячейке сравнивается с Lo_Val
и Hi_Val
:
Sub Colorize(Target As Range, Lo_Val, Hi_Val, Lo_R, Lo_G, Lo_B, Hi_R, Hi_G, Hi_B)
Dim R, G, B As Long
delta_val = Hi_Val - Lo_Val
If (delta_val <= 0) Then
MsgBox "Lo_Val and Hi_Val must not be the same, or in the wrong order."
Exit Sub
End If
If (Application.Min(Lo_R, Lo_G, Lo_B, Hi_R, Hi_G, Hi_B) < 0 _
Or Application.Max(Lo_R, Lo_G, Lo_B, Hi_R, Hi_G, Hi_B) > 255) Then
MsgBox "Invalid color(s)."
Exit Sub
End If
Delta_R = Hi_R - Lo_R
Delta_G = Hi_G - Lo_G
Delta_B = Hi_B - Lo_B
For Each c In Target
If (c < Lo_Val Or c > Hi_Val) Then
c.Font.Color = 0 ' Black
' Alternatively, set values < Lo_Val to the Lo color
' and set values > Hi_Val to the Hi color.
' Or do nothing, leaving them with whatever color they have now.
Else
Diff_Val = c - Lo_Val
' We probably could just compute (c - Lo_Val) / delta_val
' at this point, but I'm not sure how well that would work
' with the rounding.
R = Round(Lo_R + Delta_R * Diff_Val / delta_val)
G = Round(Lo_G + Delta_G * Diff_Val / delta_val)
B = Round(Lo_B + Delta_B * Diff_Val / delta_val)
' Use 256& to get a constant with value 256 and type Long.
c.Font.Color = R + 256& * G + 256& * 256& * B
End If
Next c
End Sub
См. Как добавить VBA в MS Office?
для общей информации о том, как войти и использовать это.
Я написал это как рутину с параметрами для гибкости.
AFAIK, невозможно вызвать подпрограмму VBA с параметрами из обычного пользовательского интерфейса Excel. Возможно, вы захотите определить мини-макрос (без параметров), который вызывает вышеуказанное с параметрами, которые вы хотите; например,
Sub Macro1()
'
' Macro1 Macro
'
Call Colorize(Range("A1:J1"), 1, 10, 255, 0, 0, 0, 0, 255)
End Sub
который установит низкие цифры (от 1 и выше) до оттенков красного, а высокие цифры (от 10 и ниже) до оттенков синего.
Например, используя числа из вопроса, это дает нам
(где я вручную увеличил размер шрифта, чтобы сделать цвета более заметными).
Затем вы можете вызвать это из «Разработчик» → «Код» → «Макросы» или связать его с кнопкой.
Или, если вы хотите, чтобы форматирование происходило автоматически при каждом изменении значения, вы можете использовать подпрограмму Worksheet_Change
для вызова Colorize
.
И, чтобы заставить это вести себя больше как условное форматирование, вы можете кодировать его, чтобы установить для Lo_Val
и Hi_Val
значения Min и Max, которые в данный момент находятся в диапазоне.
Заметки:
- Длинная линия
Dim R, G, B As Long
кажется, не нужна.
Но я получаю ошибки переполнения, когда я использую обычный 256
вместо 256&
.
- Наука о том, как человеческий глаз и человеческий мозг воспринимают цвет, очень сложна.
Линейная интерполяция значений RGB, вероятно, не лучший алгоритм для создания градуированного диапазона / спектра цветов.