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

Мне нужно знать: как получить цвета по цветовой шкале условного форматирования 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?
  3. Знаете ли вы другой способ, как решить мою проблему?

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

Ответы [ 6 ]

4 голосов
/ 20 марта 2012

если лучшего ответа нет, попробуйте этот обходной путь:

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

UPDATE

или вы можете попытаться вычислить цвет с помощью линейной аппроксимации для каждого канала R, G, B, если в условном формате используются только 2 базовых цвета (r1, g1, b1) и (r2, g2, b2) для 2 угловых случаев который может быть

  • min и max значение , например: 0 - 4000
  • min и max процентов , например: 10% - 90%
    (я полагаю, вы можете использовать% * [max_value - min_value] для получения фактического значения)
  • min и max процентиль , например: 0-й процентиль - 100-й процентиль

для параметров процента / процентиля сначала необходимо преобразовать фактическое значение в значение процента / процентиля, затем, если в value < min или value > max используются цвета углов, в противном случае:

r = r1 + (r2 - r1) * (value - min_value) / (max_value - min_value)
g = ...
b = ...
2 голосов
/ 29 октября 2012

Это не относится к вашей проблеме, но легко модифицируется для решения вашей проблемы ...

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
2 голосов
/ 20 марта 2012

Это скопирует изображение ячейки в верхний левый угол объекта 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

РЕДАКТИРОВАТЬ: Я только что проверил это с довольно небольшой 4x8 матрицы ячеек / диаграмм, и производительность довольно плохо!Может быть лучше просто вставить без ссылки: = True ...

1 голос
/ 30 июля 2016

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

<Cell>.DisplayFormat.Interior.Color

Это должно быть слово в Excel позже 2010 года.

0 голосов
/ 13 августа 2015

Это сработало для меня, основываясь на ответе JKirchartz

Sub copyBackgroundColors(source As Range, target As Range)
    target.Interior.color = source.DisplayFormat.Interior.color
End Sub
0 голосов
/ 20 марта 2012

Это частичный ответ на ваш вопрос. В столбце 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...