在 Excel 中,A 列包含从单元格 A1 到单元格 A30 的多个彩色单元格。
如果我添加另一列(即 B 列),其中包含彩色单元格,我需要 VBA 代码来测试单元格。
如果单元格 A1 颜色(绿色)与单元格 B1 颜色(绿色)匹配,则在单元格 D1 上返回文本“绿色”。
我尝试过条件格式。
(1) 通过颜色定义值通常是一个坏主意。什么是
red
,它是如何定义的?通过RGB?通过颜色索引?通过主题定义的特定索引?如果您通过 RGB(255, 0, 0) 定义红色,并且在单元格中您有 RGB(240, 0, 0) 或 RGB(240, 16, 16),那么它们对于人眼来说看起来是一样的。您想如何处理看起来非常相似的颜色?您认为以下哪一项是“红色”?
(2) 条件格式无法访问单元格的颜色,并且无法将某些文本(如
"Red"
)写入单元格。
(3) 您可以在 VBA 中编写一个从颜色返回字符串(颜色名称)的函数,但不能在公式中将其用作 UDF(=用户定义函数)。 UDF 有一些限制,例如它无法访问单元格的颜色(或其他设置)(我知道,周围有一些肮脏的技巧会受到这种限制,但我不会传播这一点)。
函数本身可能如下所示 - 添加您想要处理的任何其他颜色。但是,它不处理看起来相似的颜色 - 这将是一个非常棘手的任务,因为您需要定义“相似”的含义。
Function getColorName(color As Long) As String
Select Case color
Case vbRed: getColorName = "Red"
Case vbWhite: getColorName = "White"
Case vbBlack: getColorName = "Black"
Case vbYellow: getColorName = "Yellow"
Case RGB(0, 175, 80): getColorName = "Green"
Case RGB(244, 175, 133): getColorName = "Peach"
Case RGB(166, 166, 166): getColorName = "Grey"
Case Else
Dim red As Long, green As Long, blue As Long
red = color And vbRed
green = (color And vbGreen) \ &H100
blue = (color And vbBlue) \ &H10000
getColorName = "RGB(" & red & "," & green & "," & blue & ")"
End Select
End Function
以及比较两种颜色的函数:
Function compareColors(color1 As Long, color2 As long) As String
If color1 = color2 Then
compareColors = getColorName(color1)
Else
compareColors = "No"
End If
End Function
现在将指定颜色写入 D 列的代码可能如下所示:
Sub fillColorNames()
With ActiveSheet
Dim row As Long
For row = 1 To 10
.Cells(row, 4).Value = compareColors(.Cells(row, 1).Interior.color, .Cells(row, 2).Interior.color)
Next
End With
End Sub