Как получить цвета по цветовой шкале условного форматирования Excel 2012 через код VBA

Мне нужно знать: Как получить цвета, сделанные цветовой гаммой условного форматирования Excel 2010 через код VBA. Эти цвета будут впоследствии назначены VBA в качестве фона диаграммы в соответствии со следующим изображением:

www.lnkm.cz/Slozka/Example.jpg http://www.lnkm.cz/Slozka/Example.jpg

Я провел исследование на различных веб-сторонах и:

  1. большинство людей советуют, как читать цвет условного форматирования по методике <Cell>.FormatConditions(index that is active).Interior.ColorIndex но в моем случае это не работает из-за ошибки "объект не поддерживает это свойство или метод"
  2. некоторые люди советуют написать собственное вычисление цветов (на основе значения ячеек). Я нашел различные способы, как это сделать, но ни один из них не может вычислить те же цвета, которые были вычислены ранее excel (те же цвета, что и на предыдущем рисунке).

поэтому я спрашиваю:

  1. есть ли способ непосредственно готовые цвета из ячеек? (или эти цвета недоступны для API)
  2. вы знаете, как вычислить те же цвета, что и Excel compute?
  3. вы знаете другой способ, как решить мою проблему?

Я считаю, что он должен как-то работать.

6 ответов


если нет лучшего ответа, вы можете попробовать это временное решение:

  1. ссылка / копирование данных в ячейки под диаграммой (с формулами, такими как =Sheet1!A1)
  2. применить то же условное форматирование
  3. скрыть значения (с пользовательским форматом номера, как "", т. е. пустой строковый литерал (2 двойные кавычки))
  4. сделать график прозрачным
  5. выровнять ячейки с график

обновление:

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

попробуйте это:

<Cell>.DisplayFormat.Interior.Color

Это должно word с Excel позже 2010 года.


это сработало для меня, основываясь на ответе 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