【问题标题】:Excel VBA - Set color based on RGB value contained another columnExcel VBA - 根据包含另一列的 RGB 值设置颜色
【发布时间】:2021-08-16 00:56:15
【问题描述】:

作为更大过程的一部分,我需要创建一个 Excel VBA 宏,它从列中读取值并根据每个单元格中的值对行应用基本格式。

电子表格本身是从另一个程序中导出的,并直接在 Excel 中打开。所有列都格式化为General

顺序是这样的:

  1. Sheet1 中的第二行开始
  2. 查看J 列
  3. 读取RGB值(显示为RGB(X,Y,Z),其中XYZ是颜色的数值需要用到)
  4. Column A-I 的行文本颜色更改为该颜色
  5. 继续浏览所有带有文本的行

我找到了this thread,但我无法让它工作。

非常感谢这里的任何帮助。

【问题讨论】:

  • RGB 颜色是否写成字符串与您向我们展示的完全一样?我的意思是“RGB(X,Y,Z)”,逗号后面没有空格?

标签: excel vba


【解决方案1】:
Sub ColorIt()
    Set cl = Cells(2, "J")
    Do Until cl = ""
        txt = cl.Value2
        cl.Offset(, -9).Resize(, 9).Font.Color = _
            Evaluate("SUMPRODUCT({" & Mid(txt, 5, Len(txt) - 5) & "},{1,256,65536})")
        Set cl = cl.Offset(1)
    Loop
End Sub

结果:

编辑2

Sub ColorIt2()
    Const RGB_COL = "M"
    
    Set cl = Cells(2, RGB_COL)
    Do Until cl = ""
        txt = cl.Value2
        cl.Offset(, 1 - cl.Column).Resize(, cl.Column - 1).Interior.Color = _
            Evaluate("SUMPRODUCT({" & Mid(txt, 5, Len(txt) - 5) & "},{1,256,65536})")
        Set cl = cl.Offset(1)
    Loop
End Sub

【讨论】:

  • 感谢您的回复。我现在才上床睡觉,但会在早上看这个。数据将始终正确格式化为 RGB(X,Y,Z),因为它是由另一个工具输出的,并且是格式良好的数据。所以谢天谢地,我不必担心破坏它的价值观。但是,我确实需要它在 J 列中使用一个值循环遍历每个单元格,如果范围也是 (“J:J”) 也可以。
  • 我对此进行了测试,它可以工作。我不得不扩展它,因为我从 Column M 而不是 Column J 开始。是否可以调整它来改变填充颜色?我尝试使用 Cell.Interior.Color 并出错。
  • 查看Edit2版本
【解决方案2】:

请使用下一个功能。它将字符串转换为 Long 颜色(基于 RGB 三个参数。它适用于逗号分隔符(“,”和“,”)的大小写:

Function ExtractRGB(strRGB As String) As Long
   Dim arr: arr = Split(Replace(strRGB, " ", ""), ",")
   ExtractRGB = RGB(CLng(Right(arr(0), Len(arr(0)) - 4)), CLng(arr(1)), CLng(left(arr(2), Len(arr(2)) - 1)))
End Function

可以用下一种方式测试:

Sub TestExtractRGB()
  Dim x As String, color As Long
  x = "RGB(100,10,255)"
  x = "RGB(100, 10, 255)"
  color = ExtractRGB(x)
  Debug.Print color
  Worksheet("Sheet1").Range("A2:I2").Font.color = color
  'or directly:
  Worksheet("Sheet1").Range("A2:I2").Font.color = _
      ExtractRGB(Worksheet("Sheet1").Range("J2").value)
End Sub

如果您评论x = "RGB(100, 10, 255)",它将返回与之前的x字符串相同的颜色值...

如果您需要对所有现有行执行此操作,则代码必须从 2 迭代到最后一行,您只需将“A2:I2”更改为 "A" & i & ":I" & i

如果有必要,我可以教你怎么处理,不过我觉得很简单……

【讨论】:

  • 不会用“,”分割strRGB,然后修剪比上述方法更健壮吗?如果出于某种原因那里会有第二个空间怎么办?
  • @Gokhan Aycan 如果“$”是什么?如果没有一致性,任何代码都会失败。我考虑了这两种情况,因为我认为他向我们展示的内容可能是错误的,而不是使用 RGB 中的正常分离方式。是的,trimmung 也可以。
猜你喜欢
  • 2017-11-11
  • 2017-06-05
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多