在个人函数中使用Application.Caller

时间:2017-04-10 15:16:23

标签: vba excel-vba excel

我正在尝试在Function(下面的代码)中使用Application.Caller,但Excel返回#VALUE并且未设置背景颜色。

从Excel单元格调用个人功能。我们的想法是以“同步”方式将RGB值映射到彩色显示(即无需按下按钮)。

当我通过调试器运行以下函数并在指令vCaller.Interior.Color = RGB(rlev, glev, blev)之前执行步骤时,我可以通过在执行控制台中粘贴完全相同的指令手动将背景颜色设置为绿色。所以我很困惑为什么Excel失败但VBA不是。

有任何线索吗?

Public Function RGB_print(rlev As Integer, glev As Integer, blev As Integer) 
As String

Dim vCaller As Variant

Set vCaller = Application.Caller
If TypeName(vCaller) = "Range" Then
    vCaller.Interior.Color = RGB(rlev, glev, blev)
End If
RGB_print = ""

End Function

2 个答案:

答案 0 :(得分:2)

我完全赞同@Rory的评论 - 我从不在自己的项目中使用这个代码,但我还是希望看到....

如果在普通模块中创建此功能:

Public Function RGB_print(rlev As Integer, glev As Integer, blev As Integer)
    Application.Volatile
End Function

然后在你的表格中添加以下代码:

Private Sub Worksheet_Calculate()
    Dim rFormula As Range
    Dim vForm As Variant
    Dim sArguments As String
    Dim sFormula As String
    Dim rgblev As Variant

    Set rFormula = Sheet1.Cells.SpecialCells(xlCellTypeFormulas)
    For Each vForm In rFormula
        If InStr(vForm.FormulaLocal, "RGB_print") <> 0 Then
            sFormula = vForm.FormulaLocal
            sArguments = Mid(sFormula, InStr(sFormula, "(") + 1, InStr(sFormula, ")") - InStr(sFormula, "(") - 1)
            rgblev = Split(sArguments, ",")
            vForm.Interior.Color = RGB(Evaluate(rgblev(0)), Evaluate(rgblev(1)), Evaluate(rgblev(2)))
        End If
    Next vForm
End Sub

这适用于以下公式:
=RGB_print(255,0,255)=RGB_print(A5,B5,C5)

但是再一次,找到另一种方式 - 这段代码有很多陷阱,我可能会因为发布它而失去100点声望。

答案 1 :(得分:0)

好的,作为Darrent非常精确的回复的替代方案,我将重新发布Tim Williwam的评论:是否可以/应该混合函数和宏是一个重要问题,并且已经讨论过了here。底线是:除非你知道自己在做什么,并准备好面对后果,否则你可以做但不做。