我在Excel中有一个用户定义的函数。它被称为电子表格单元格中的公式函数,工作正常。
我希望该函数能够根据返回的值更改单元格的颜色。基本上,改变细胞的颜色是该功能的副作用。
我试过
Application.ThisCell.Interior.ColorIndex = 2
但它失败了。
答案 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