我有这个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。)
答案 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
的值无效,但我只需要知道是否存在任何先例,而不是它们是哪个单元格。
所以我比较了Formula
和FormulaR1C1
属性,因为只有在Formula
包含单元格引用的情况下它们才有所不同。
有一个例外:如果Formula
包含命名范围,那么Formula
和FormulaR1C1
即使单元格引用某些内容也可以相等。 (这与我的情况无关,并且不想迭代所有名称并检查它们是否包含在Formula
外部引号中。