【问题标题】:Read colour from cell to colour a chart excel从单元格中读取颜色以为 Excel 图表着色
【发布时间】:2014-08-04 14:28:08
【问题描述】:

在 vba 中,我想从工作表中的单元格中读取颜色,以便为条形图中的特定条形着色。我的问题是我有 4F9F92 格式的颜色,但要在 makro 中读取它,我需要使用单元格中的 excel 颜色代码 4076202。有没有办法在 vba 代码中转换这两种格式...?我知道在即时窗口中我可以做

?rgb(170,50,62)

导致

4076202

在 vba 代码中,我使用以下命令读取颜色

ser.Points(p).Interior.Color = arr(s, p)

其中 s 和 p 是通过具有不同颜色代码的数组运行的两个 runnign 变量。

有没有可能我可以为每个单元格设置一个函数,在该单元格中输入一个值,例如 4F9F92,以自动将其转换为 4076202 格式,以便 makro 可以读取它?

【问题讨论】:

  • 如果你知道/可以计算RGB,那么你可以不使用ser.Points(p).Interior.Color.RGB=RGB(R,G,B)
  • 它未经测试,我可以补充一下,我现在没有打开 Excel(但应该是类似的)
  • 其实,如果你使用"&" & arr(s,p),你会得到什么?由于我在代码中看到的大多数十六进制都是&4F9F92 的形式,所以认为它应该可以工作(前提是它事先将它作为字符串处理得足够好)
  • 我错过了什么吗? ?CDec("&H" & "4F9F92") 给了我5218194 而不是4076202。要获得4076202,我们必须使用3E32AA。例如?CDec("&H" & "3E32AA")
  • 我使用 ?RGB(170,50,62) 给出 4076202 而 RGB (170,50,62) 是 4F9F92

标签: excel vba rgb


【解决方案1】:

实际上,rgb(170,50,62) 的十六进制等效值是 AA323E,它转换为 4076202 的 Long 值

1) RGB Function 接受红色、绿色、蓝色分量,它们是 Decimal numbers 在 0-255 范围内,可以从 HEX 值中去除

2) 将这些剥离后的值传递给RGB function 以获得代表RGB 颜色值的Long whole number

Function Hex2RGB(hex As String) As String

    Red = Val("&H" & Mid(hex, 1, 2))
    Green = Val("&H" & Mid(hex, 3, 2))
    Blue = Val("&H" & Mid(hex, 5, 2))

  Debug.Print RGB(Red, Green, Blue)
    Hex2RGB = RGB(Red, Green, Blue)

End Function

并在你的宏中使用它,假设你在Cell A1中有AA323E

Sub ColorMe()
Range("B1").Interior.Color = Hex2RGB(Range("A1"))
End Sub

【讨论】:

  • 如果我使用该函数并编写 =Hex2RGB(4F9F92) 它只会抱怨公式中有错字,很可能是 FF9F92,结果为 0。这很奇怪跨度>
  • 试试 Hex2RGB ("4F94F2")
  • 嘿...给出 9609039 但不是 4076202...我输入了 Hex2RGB("4F9F92")
  • 就像我在回答中所说的那样才能得到 4076202 你必须使用=Hex2RGB("AA323E")
  • 哦,好吧,有没有一种简单的方法可以将 4F9F92 转换为 AA323E,而不是一开始......也许可以将其合并到上面的函数中?那将是辉煌的
【解决方案2】:

如果 c 是其中包含十六进制颜色代码的单元格,格式为 #FFFFFF

excel中下面的vba可以直接转成RGB

RGB(Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 2, 2)), Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 4, 2)), Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 6, 2)))

我使用工作表函数 Hex2Dec,将十六进制代码的 3 个组成部分转换为十进制,并使用 RGB 函数返回您可以使用的 long/rgb 颜色代码。

更新 - 用法示例:

Sub ColorSwatch()
   Dim c As Range
   for each c in selection
        c.Interior.Color = RGB(Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 2, 2)), Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 4, 2)), Application.WorksheetFunction.Hex2Dec(Mid(c.Value, 6, 2)))
   next
End Sub

【讨论】:

  • 在哪里输入,如果我在 vba 中输入它说有一个编译错误
  • 是否可以将此函数应用于 10 乘以 10 的整个矩阵?这是在代码中的 for each c in selection 中吗?我是否只突出显示应该完成的单元格?
  • 很抱歉,如果我将其作为宏尝试,单元格确实会获得背景颜色,但背景颜色不正确。我如何只转换单元格中的数字而不设置背景颜色?
  • 当给定一个单元格时,RGB(...) 代码会返回一个长颜色值。我已将内部颜色属性设置为值,只需将其更改为 c.value 而不是 c.interior.color
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2011-08-17
  • 2011-08-19
  • 1970-01-01
  • 2016-04-28
  • 2012-07-28
相关资源
最近更新 更多