Как получить цвета по цветовой шкале условного форматирования Excel 2012 через код VBA
Мне нужно знать: Как получить цвета, сделанные цветовой гаммой условного форматирования Excel 2010 через код VBA. Эти цвета будут впоследствии назначены VBA в качестве фона диаграммы в соответствии со следующим изображением:
www.lnkm.cz/Slozka/Example.jpg http://www.lnkm.cz/Slozka/Example.jpg
Я провел исследование на различных веб-сторонах и:
- большинство людей советуют, как читать цвет условного форматирования по методике
<Cell>.FormatConditions(index that is active).Interior.ColorIndex
но в моем случае это не работает из-за ошибки "объект не поддерживает это свойство или метод" - некоторые люди советуют написать собственное вычисление цветов (на основе значения ячеек). Я нашел различные способы, как это сделать, но ни один из них не может вычислить те же цвета, которые были вычислены ранее excel (те же цвета, что и на предыдущем рисунке).
поэтому я спрашиваю:
- есть ли способ непосредственно готовые цвета из ячеек? (или эти цвета недоступны для API)
- вы знаете, как вычислить те же цвета, что и Excel compute?
- вы знаете другой способ, как решить мою проблему?
Я считаю, что он должен как-то работать.
6 ответов
если нет лучшего ответа, вы можете попробовать это временное решение:
- ссылка / копирование данных в ячейки под диаграммой (с формулами, такими как
=Sheet1!A1
) - применить то же условное форматирование
- скрыть значения (с пользовательским форматом номера, как
""
, т. е. пустой строковый литерал (2 двойные кавычки)) - сделать график прозрачным
- выровнять ячейки с график
обновление:
или вы можете попытаться вычислить цвет линейным приближением для каждого канала R, G, B, если условный формат использует только 2 базовых цвета (r1, g1, b1) и (r2, g2, b2) для 2 угловых случаев, которые могут быть
-
min
иmax
стоимостью, например: 0 - 4 000 -
min
иmax
процентов, например: 10% - 90%
(я считаю, что вы можете использовать % * [массив - min_value], чтобы получить фактическое значение) -
min
иmax
процентиль, например: 0-й процентиль-100-й процентиль
для параметров процентов / процентилей сначала необходимо преобразовать фактическое значение в значение процентов / процентилей, а затем, если value < min
или value > max
используйте угловые цвета, в противном случае:
r = r1 + (r2 - r1) * (value - min_value) / (max_value - min_value)
g = ...
b = ...
это скопирует изображение ячейки в верхний левый угол chartobject на том же листе. Обратите внимание на картины связана с скопирована ячейка - если значение или цвет изменения форматирования она будет меняться, чтобы соответствовать.
Sub Tester()
CopyLinkedPicToPlot ActiveSheet.Range("E4"), "Chart 2"
End Sub
Sub CopyLinkedPicToPlot(rngCopy As Range, chtName As String)
Dim cht As ChartObject
Set cht = ActiveSheet.ChartObjects(chtName)
rngCopy.Copy
With rngCopy.Parent.Pictures.Paste(Link:=True)
.Top = cht.Top
.Left = cht.Left
End With
End Sub
EDIT: я только что протестировал это с довольно маленькой матрицей 4x8 ячеек/диаграмм, и производительность довольно плохая! Может быть, лучше просто вставить без ссылки:=True ...
Это не относится к вашей проблеме, но легко модифицируется для решения вашей проблемы...
Sub CopyCondFill()
Dim FromSheet As Object
Dim ToSheet As Object
Dim FromSheetName as String
Dim ToSheetName as String
Dim ToRange As Range
Dim StrRange As String
'''Sheet with formatting you want to copy
FromSheetName = "YourSheetsName"
Set FromSheet = Application.ThisWorkbook.Sheets(FromSheetName )
'''Start of range within sheet you want to copy
FromFirstRow = 3
FromFirstCol = 2
'''Sheet you want to copy formatting to
ToSheetName = "YourSheetsName"
Set ToSheet = Application.ThisWorkbook.Sheets(ToSheetName)
'''range to copy formatting to
ToFirstRow = 3
ToFirstCol = 2
'''NOTE: Adjust row/column to take lastrow/lastcol from or enter value manually
ToLastRow = FromSheet.Cells(Rows.Count, 1).End(xlUp).Row
ToLastCol = FromSheet.Cells(2, Columns.Count).End(xlToLeft).Column
Set ToRange = ToSheet.Range(Cells(ToFirstRow, ToFirstCol), Cells(ToLastRow, ToLastCol))
'''Apply formatting to range
For Each cell In ToRange
StrRange = cell.Address(0, 0)
ToSheet.Range(StrRange).Offset(ToFirstRow - FromFirstRow, ToFirstCol - FromFirstCol).Interior.Color = _
FromSheet.Range(StrRange).DisplayFormat.Interior.Color
Next cell
End Sub
это сработало для меня, основываясь на ответе JKirchartz
Sub copyBackgroundColors(source As Range, target As Range)
target.Interior.color = source.DisplayFormat.Interior.color
End Sub
это частичный ответ на ваш вопрос. В столбце 1 таблицы ниже перечислены стандартные 40 цветов Excel. В колонках 2, 3 и 4 перечислены красный, зеленый и синий компоненты каждого цвета. Поэтому, если вы хотите, чтобы шрифт ячейки был светло-оранжевым:
Cell(Row, Column).Font.Color = RGB(255, 153, 0)
Если вы попробуете любую другую красно-зеленую комбинацию, Excel сопоставит ее с ближайшим из этих стандартных цветов, хотя идея Excel о "ближайшем" не соответствует моей.
надеюсь, это поможет, если вы получите другую часть ответ на твой вопрос.
Colour Red Green Blue
Black 0 0 0
Light orange 255 153 0
Lime 153 204 0
Gold 255 204 0
Bright green 0 255 0
Yellow 255 255 0
Grey 80% 51 51 51
Dark teal 0 51 102
Plum 153 51 102
Sea green 51 153 102
Dark blue 0 0 128
Dark red 128 0 0
Violet 128 0 128
Teal 0 128 128
Grey 50% 128 128 128
Grey 40% 150 150 150
Indigo 51 51 153
Blue-grey 102 102 153
Tan 255 204 153
Light yellow 255 255 153
Grey 25% 192 192 192
Aqua 51 204 204
Red 255 0 0
Rose 255 153 204
Light green 204 255 204
Blue 0 0 255
Pink 255 0 255
Light blue 51 102 255
Lavender 204 153 255
Sky blue 0 204 255
Pale blue 153 204 255
Turquoise 0 255 255
Light turquoise 204 255 255
Dark green 0 51 0
White 255 255 255
Olive green 51 51 0
Brown 153 51 0
Orange 255 102 0
Green 0 128 0
Dark yellow 128 128 0