繁体   English   中英

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

[英]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的值无效,但我仅需要知道是否有任何先例 ,而不是它们是哪个单元格。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM