从工作表函数传递范围时获取单元格内部颜色失败

时间:2018-09-10 21:36:20

标签: excel vba excel-vba

我试图编写一个可以从一个单元格调用的简单函数,如果给定单元格的背景具有特定的背景颜色,则该函数将返回。

从子例程调用时,此函数按预期工作,但从工作表调用时,此函数失败。在行

IntColor = Cell.DisplayFormat.Interior.Color

这是所有代码

Option Explicit

Public Function GetCellRGB(Rng As Range) As Integer()
    Dim Result(1 To 3) As Integer
    Dim Cell As Range
    Set Cell = Rng.Cells(1, 1)

    Dim IntColor As Integer

    ' when called from worksheet, function exits here with a #VALUE error
    IntColor = Cell.DisplayFormat.Interior.Color

    Result(1) = IntColor Mod 256 ' red
    Result(2) = IntColor \ 256 Mod 256 ' green
    Result(3) = IntColor \ 65536 Mod 256 ' blue

    GetCellRGB = Result
End Function

Public Function IsColor(Rng As Range, R As Integer, G As Integer, B As Integer) As Boolean
    Dim Vals() As Integer

    Vals = GetCellRGB(Rng)
    If R = Vals(1) And G = Vals(2) And B = Vals(3) Then
        IsColor = True
    Else
        IsColor = False
    End If
End Function

' This works as expected
Sub ColorTest()
    Dim Rng As Range
    Set Rng = ThisWorkbook.ActiveSheet.Range("A1")
    Debug.Print IsColor(Rng, 255, 0, 0)
End Sub

enter image description here

2 个答案:

答案 0 :(得分:3)

这是解决“在UDF中不可用的DisplayFormat”问题的解决方法。

它使用Evaluate来回避UDF上下文

Public Function DFColor(addr)
    DFColor = Range(addr).DisplayFormat.Interior.Color
End Function

Function CFColorMatches(rng As Range, R As Long, G As Long, B As Long)
    CFColorMatches = (rng.Parent.Evaluate("DFColor(""" & rng.Address & """)") = RGB(R, G, B))
End Function

请注意,您真的不需要所有与RGB相关的代码

答案 1 :(得分:2)

RGB是由VBA本身计算的,实际上您不必假定它是一个数组,它是一个长整数,因此,如果您要检查单元格的背景色,则只需执行此操作即可在工作表上:

Public Function IsColor(Rng As Range, R As Integer, G As Integer, B As Integer) As Boolean
    If Rng.Interior.Color = RGB(R, G, B) Then
        IsColor = True
    Else
        IsColor = False
    End If
End Function