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

我有这个VBAfunction:

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 

编辑:它也工作正常,如果从非UDFmacros子调用。 这个exception是UDF的情况。

如果我从工作表中调用它作为UDF:

 =testPrec(C11) 

我刚回来“$ C $ 11”。

有谁知道发生了什么事情,甚至更好的如何从UDF调用中获得实际的先例? (我正在使用Excel 2007)

我能想到的唯一的解决方法是获得target.formula并parsing它 – 不是很好。

看来约束在于任何对包含UDF的调用堆栈中的.Precedents的调用都会得到不同的处理。 所以,find一种方法来调用由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现在返回正确的范围地址,尽pipe一个recal晚了。 这个想法是让UDFbuild立一个地址列表来获得Precedents for和一个事件来完成实际的GetPrecedent工作,并将地址string返回到列表中以供udf拾取。 根据您的需要,您可能可以build立一个可行的解决scheme。

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

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

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