[英]When called from an Excel VBA UDF, Range.Precedents returns the range and not its precedents. Is there a workaround?
我有这个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调用中获得实际的先例? (我正在使用Excel2007。)
似乎限制在于,对包含UDF的调用堆栈中的.Precedents
任何调用都.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
返回正确的范围地址, testPrec
延迟一格。 这个想法是让UDF构建一个地址列表以获取Precedents,并创建一个事件来完成实际的GetPrecedent工作,将地址字符串返回到列表以供udf提取。 根据您的需要,您也许可以以此为基础构建可行的解决方案。
我能想到的唯一解决方法是获取target.formula并对其进行解析-不太好。
我遇到了一个类似的问题:我必须根据单元格包含公式还是常量来格式化单元格。 HasFormula
使得确定单元格是否包含公式成为可能,但是,也可以将简单的计算(例如=123+45
检测为公式(从技术角度正确,但从财务建模角度正确)。 因此,我想在UDF中使用Precedents
,以查看给定的单元格是否链接到其他单元格。 如上所述,在执行UDF期间,“ Precedents
的值无效,但我仅需要知道是否有任何先例 ,而不是它们是哪个单元格。
因此,我比较了Formula
和FormulaR1C1
属性,因为它们仅在Formula
包含单元格引用的情况下才不同。
有一个例外:如果“ Formula
包含“命名范围”,则即使单元格引用了某些内容,“ Formula
和FormulaR1C1
也可以相等。 (这与我的情况无关,也不想重复所有名称,并检查它们是否包含在Formula
引号之外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.