想必连VBA小白都知道,VBA编程中有两种过程:Sub
和Function
(有时称为UDF,User Defined Function),二者最明显的区别在于Function
可以提供返回值,并且在Excel公式可以调用Function
。
多数VBA图书都会以不同形式包含如下内容。
本段落引自微软文档,官方文档未提供中文版本,本人进行了翻译,以便于大家理解
在工作表单元格公式中调用自定义函数(UDF)无法更改Excel的运行环境。这意味着无法使用公式执行以下任何操作:
- 在工作表中插入、删除或格式化单元格
- 更改其他单元格的值
- 移动、重命名、删除或添加工作簿的工作表
- 更改任何环境选项,如计算模式或屏幕视图
- 向工作簿添加名称
- 设置属性或执行大多数方法(对象的Method)
出自: Description of limitations of custom functions in Excel
简单概述就是上述内容,就是:不要非法使用UDF,此时UDF只能委屈的说…
备注:插图来自互联网,版权归原作者所有
有些好奇的小朋友仍然在不停的问,这些江湖传闻都是真的吗?是否存在武林秘籍突破这些限制?答案是:确实存在武林秘籍。
首先说明一下,纵然UDF可以突破上述限制,但是术业有专攻,大家应该尽可能规范地使用Sub
和Function
.
示例代码如下。
Function SetColor(rCell As Range, r As Integer, g As Integer, b As Integer)
Application.Volatile
Application.Evaluate "SetCellColor(" & _
rCell.Address & "," & r & "," & g & "," & b & ")"
SetColor = rCell.Address & " RGB " & r & "," & g & "," & b
End Function
Private Sub SetCellColor(rCell As Range, r As Integer, g As Integer, b As Integer)
rCell.Interior.Color = RGB(r, g, b)
End Sub
【代码解析】
第1~6行代码为UDF过程,可以在单元格公式调用此过程。
第2行代码设置UDF为易失函数,任何单元格发生变化时,将重算此函数,注意如果大量单元格使用易失函数,可能会引起Excel卡顿。
第3~4行代码使用Evaluate
函数调用Sub SetCellColor()
,此句是整个解决方案的核心,替换为Call
则无法实现同样的效果。
第5行代码设置UDF返回值,如果设置返回值为空,则设置了公式的单元格中为空白,相当于被隐藏了。
第7~9行代码根据参数设置制定单元格的填充色。
在A1单元格中输入公式=SetColor(C1,255,0,0)
,并按回车完成输入,将单元格C1填充色设置为红色。同理,可以使用公式设置多个单元格的填充色,如A3单元格所示。为了便于大家理解,在B列中显示A列单元格的公式,如下图所示。
如果用户修改单元格填充色,例如选中C列和D列清除填充色,那么当工作表中任意单元格发生变化时,公式将重新计算,C列和D列的填充色将被恢复,相当于实现了挥之不去的单元格格式,效果如下图所示。使用工作表的事件代码也可以实现相同效果。
如果希望实现公式调用UDF突破其他限制(例如修改其他单元格的内容),稍加修改示例代码就可以实现。
如果各位同学发现此方案有哪些独特的应用场景,也欢迎大家留言分享。