Excel VBA UDF:Application.ThisCell 与 Application.Caller。当 UDF 需要知道它是从哪个单元调用时使用哪个?

问题描述 投票:0回答:1

Stackoverflow 及其相关网站上有很多帖子,主要围绕 UDF 如何获取调用 UDF 的单元的问题。

许多已接受的答案都涉及使用

Application.ThisCell
返回的 Range 对象。 几个接受的答案包括“您可以使用
Application.ThisCell
Application.Caller
。”

但是,

Application.ThisCell
Application.ThisCell 属性 (Excel))的文档包含以下注释:

用户不应在用户定义的函数内访问

Range
对象上的属性或方法。

这是什么意思? 如果您不应该在 UDF 中使用该属性,那么提供返回调用 UDF 的单元格的属性有什么意义呢? 谁能对这句话有更多的解释吗? 而且...我应该在使用

Application.Caller
的同时积极避免使用
Application.ThisCell
吗?

excel vba user-defined-functions
1个回答
0
投票

我遇到的 Application.Caller 和 Application.ThisCell 之间的一个区别是一种奇怪的情况。我有一个非常简单的 UDF,用于返回调用该函数的工作表的工作表名称。

Function GetSheetName()
    GetSheetName = Application.Caller.Parent.Name
End Function

我使用 Application.Caller.Parent 来引用调用该函数的工作表。当我输入 UDF 参考时

=GetSheetName()

进入工作表单元格,一切正常。但是,当我尝试对工作表中的所有内容进行更改以将公式中其他位置的一个文字替换为另一个文字时,具有 Application.Caller.Parent 的 UDF 将失败,并表示 Application.Caller.Parent 是无效属性,未定义。我用 Application.ThisCell.Parent 替换了 Application.Caller.Parent,

Function GetSheetName()
    GetSheetName = Application.ThisCell.Parent.Name
End Function

即使使用“全部更改”对话框,问题也得到解决。

我不知道为什么会出现这种差异的内部细节,只是他们做事的方式显然存在一些差异。

所以,我的建议是,如果一个不起作用,尝试另一个,它可能会起作用。

只是我的经验,您的里程可能会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.