在 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 VBAUDF
(用户定义函数),在工作表单元格中使用的函数,不能更改单元格属性。它只能返回一个值。所以这种方法是死路一条。
请参阅 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的主要内容,如果未能解决你的问题,请参考以下文章