Excel用户定义的功能:更改单元格的颜色

时间:2012-12-04 14:54:36

标签: excel vba

我在Excel中有一个用户定义的函数。它被称为电子表格单元格中的公式函数,工作正常。

我希望该函数能够根据返回的值更改单元格的颜色。基本上,改变细胞的颜色是该功能的副作用。

我试过

Application.ThisCell.Interior.ColorIndex = 2

但它失败了。

6 个答案:

答案 0 :(得分:10)

这里演示了VBA UDF如何更改工作表内容的颜色而不是使用条件格式。

只要两个工作表的行和列按相同顺序排序,这将比较两个单独Excel工作表之间每个单元格的差异。

您可以在第三张纸上将其添加到所需数量的单元格中,以检测两张纸上相同两个单元格之间的差异,并显示以下数据:=DifferenceTest(Sheet1!A1,Sheet2!A1)

要存储在VBA编辑器中的功能如下:

Function DifferenceTest(str1 As String, str2 As String) As String

    If str1 = str2 Then
            Application.Caller.Font.ColorIndex = 2
    Else
            Application.Caller.Font.ColorIndex = 3
            DifferenceTest = str1 & " vs " & str2
    End If

End Function

答案 1 :(得分:6)

这不可能。用户定义的函数不能更改工作簿/工作表等的状态。

使用条件格式来实现您的目标。

编辑:这更像是一个建议,而不是一个真正的答案。

答案 2 :(得分:1)

不,您无法使用功能()更改单元格的颜色。但是,您可以在 Sub()例程中更改它。

只需编写一个Sub(),它将在您希望它运行的单元格上运行您的函数,然后在每次运行后,放置一个If语句,看看是否要根据它返回的值对其进行着色

答案 3 :(得分:1)

您可以创建一个在工作表发生更改后自动运行的vba代码。 不必将代码放在单独的模块中,而是必须将其嵌入到工作表本身中。

右键单击工作表选项卡,选择“查看代码”,然后创建以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)

For Each cell In Range("A1:B8") 'change cell range as needed

Select Case cell.Value
Case 8
cell.Interior.ColorIndex = 4 'cell color becomes green when cell value is 8
Case ""
cell.Interior.ColorIndex = 1 'cell color becomes black when cell is empty
Case Is < 6
cell.Interior.ColorIndex = 7 'cell color becomes pink when cell value is smaller than 6
Case Else
cell.Interior.ColorIndex = 0 'all other cells get no color
End Select

Next cell

End Sub

答案 4 :(得分:0)

Function HexToLongRGB(sHexVal As String) As Long
    Dim lRed As Long
    Dim lGreen As Long
    Dim lBlue As Long
    lRed = CLng("&H" & Left$(sHexVal, 2))
    lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
    lBlue = CLng("&H" & Right$(sHexVal, 2))
    HexToLongRGB = RGB(lRed, lGreen, lBlue)
End Function

Function setBgColor(ByVal stringHex As String)
    Evaluate "setColor(" & Application.Caller.Offset(0, 0).Address(False, False) & ",""" & stringHex & """)"
    setBgColor = ""
End Function
Sub setColor(vCell As Range, vHex As String)
    vCell.Interior.Color = HexToLongRGB(vHex)
End Sub

答案 5 :(得分:0)

我尝试了Evaluate方法,该方法有效,但立即崩溃了(2007年)。帮助中提到了缓存地址,所以这就是我的方法-将单元格和颜色存储在集合中,然后在计算后更改颜色。

Dim colorCells As New Collection

Function UDF...
    UDF = <whatever>
    color = <color for whatever>
    colorCells.Add (Application.Caller)
    colorCells.Add (color)
End Function

Sub SetColor()
    While colorCells.Count <> 0
        colorCells(1).Interior.Color = colorCells(2)
        colorCells.Remove (1)
        colorCells.Remove (1)
    Wend
End Sub

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    SetColor
End Sub