在 Excel VBA 中,为单元格分配填充颜色会产生 #Value

Posted

技术标签:

【中文标题】在 Excel VBA 中,为单元格分配填充颜色会产生 #Value【英文标题】:In Excel VBA assigning Fill color for a cell produces #Value 【发布时间】:2016-04-03 16:23:51 【问题描述】:

我正在尝试根据其他 3 个单元格中的整数值来分配活动单元格的填充颜色。这是我的功能:

Function AssignColor(r As Integer, g As Integer, b As Integer)
    ActiveCell.Interior.color = RGB(r, g, b)
    AssignColor = "#" & Application.WorksheetFunction.Dec2Hex(RGB(r, g, b))
End Function

当我使用该函数时,活动单元格会得到一个“#Value”结果并且没有设置填充颜色。似乎任何为单元格分配内部颜色的尝试都会产生此错误。

关于为什么不指定填充颜色的任何想法。感谢您的帮助。

【问题讨论】:

A VBA UDF(用户定义函数),在工作表单元格中使用的函数,不能更改单元格属性。它只能返回一个值。所以这种方法是死路一条。 请参阅 UDF returns the same value everywhere 以了解不在 UDF 中使用 ActiveCell property 的原因。 【参考方案1】:

正如 cmets 中所说,UDF 是一个必须返回有效单元格值的函数。返回对象或进行任何对象操作都会导致错误。

您可以通过拆分两个任务轻松解决问题: 首先,像以前一样拥有一个 UDF,只需删除填充部分。 相反,使用公共变量来存储传递给函数的本地变量:

Public r As Integer
Public g As Integer
Public b As Integer

Public Function AssignColor(r1 As Integer, g1 As Integer, b1 As Integer) As String
    r = r1
    g = g1
    b = b1
    AssignColor = "#" & Application.WorksheetFunction.Dec2Hex(RGB(r, g, b))
End Function

接下来,在工作表模块中,挂钩到工作表更改事件,并在触发 UDF 后使用公共变量进行颜色操作。这样你就避免了限制。请记住,着色是在有人将该 UDF 输入单元格时发生的,而不是作为计算公式结果的一部分。

Private Sub Worksheet_Change(ByVal Target As Range)
    'Only change cells holding our formula and avoid case sensitiveness.
    If LCase(Left(Target.formula, 12)) = "=assigncolor" Then
        Target.Interior.Color = RGB(r, g, b)
    End If
End Sub

希望这会有所帮助。

【讨论】:

以上是关于在 Excel VBA 中,为单元格分配填充颜色会产生 #Value的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中使用 VBA 将所有工作表的填充颜色设置为“无填充”

使用 VBA 进行颜色填充,以单元格值为条件

在excel中怎么快速批量删除单元格背景颜色为红色的数据?

VBA - 使用二维数组的值填充单元格时出错

Excel-VBA 读取单元格颜色

excel 同一表格不同区域,相同数值单元格填充颜色公式?