从Excel VBA UDF调用时,Range.Precedents返回范围而不是其先例。有解决方法吗?

时间:2011-04-04 16:20:17

标签: excel vba excel-2007 user-defined-functions

我有这个VBA功能:

Public Function testPrec(target As Range) As String
    testPrec = target.Precedents.Address(External:=False)
End Function

在单元格C11中,我有这个公式:

=C6+C8

如果我从即时窗口调用testPrec,它可以正常工作:

?testPrec([c11])
$C$6,$C$8

编辑:如果从非UDF宏Sub调用它也可以正常工作。异常是UDF案例。

如果我从工作表中将其称为UDF:

=testPrec(C11)

我刚回来“$ C $ 11”。

有没有人知道发生了什么,甚至更好地了解如何从UDF调用中获取实际的先例? (我正在使用Excel 2007。)

3 个答案:

答案 0 :(得分:3)

似乎约束在于,包含UDF的调用堆栈中对.Precedents的任何调用都会得到不同的处理。因此,找到一种方法在UDF触发的调用堆栈外进行调用:一种想法是使用事件。这是一个过于简单的例子来演示

在模块中定义

Public strPrecedent As String
Public rngPrecedent As Range

Public Function testPrec(target As Range) As String
    Set rngPrecedent = target
    testPrec = strPrecedent
End Function

在工作表中定义

Private Sub Worksheet_Calculate()
    If Not Module1.rngPrecedent Is Nothing Then
        Module1.strPrecedent = Module1.rngPrecedent.Precedents.Address(External:=False)
    End If
End Sub

testPrec现在返回正确的范围地址,尽管有一个延迟。我们的想法是让UDF构建一个地址列表来获取Precedents,以及一个事件来执行实际的GetPrecedent工作,将地址字符串返回到列表以供udf拾取。您可以根据自己的需要构建可行的解决方案。

答案 1 :(得分:2)

我能想到的唯一解决方法是获取target.formula并解析它 - 不是很好。

答案 2 :(得分:0)

我遇到了类似的问题:我必须根据它们是否包含公式或常量值来格式化单元格。 HasFormula可以确定单元格是否包含公式,但是,=123+45等简单计算也会被检测为公式(从技术角度来看是正确的,但从财务建模的角度来看是错误的)。所以我想在UDF中使用Precedents来查看给定的单元格是否链接到任何其他单元格。如上所述,在执行UDF期间Precedents的值无效,但我只需要知道是否存在任何先例,而不是它们是哪个单元格。

所以我比较了FormulaFormulaR1C1 属性,因为只有在Formula包含单元格引用的情况下它们才有所不同。

有一个例外:如果Formula包含命名范围,那么FormulaFormulaR1C1即使单元格引用某些内容也可以相等。 (这与我的情况无关,并且不想迭代所有名称并检查它们是否包含在Formula外部引号中。