允许在一个打开的工作簿中使用 UDF,但在另一个工作簿中将其设置为 invisible/unusable/inaccessible

Allowing use of a UDF in one open workbook but make it invisible/unusable/inaccessible in another workbook

我在工作簿 (Book 1) 中有两个相当简单的 UDF,我也已在函数向导中注册了它们。一切都无缝运行。但是,当我打开两个不同的工作簿时 - Book 1Book 2 - 我可以使用 Book 1 in Book 2 中的两个 UDF 之一。 Book 2 没有像Book 1 一样在功能向导下注册,但是功能仍然完整。

这是每个工作簿当前显示方式的图片:

书1 书2

缺少创建加载项,有没有办法对此进行编码,以便 Book 1 中的 UDF 仅在Book 1中可见,尽管有任何其他可能打开的工作簿?

编辑:
所以加载项甚至可能是不可能的。但是,是否有另一种方法可以解决这个问题,以便唯一可以使用这些功能的工作簿是 Book 1?


注意:Option Private Module 不起作用,因为它会向用户隐藏两本书中的功能,但它会阻止 Book 2 使用该功能. 我的最终目标 是让它在 Book 1 中可见,但在 Book 2 中不可见且无法使用。

我不确定您是否可以让函数在不同的工作簿中完全不出现。它们都在同一个 Application 下,因此它们有点相关。

您可以使用 Application.Caller,它将包含触发 UDF 的范围对象:

 If Application.Caller.Parent.Parent.Name <> "Book1.xlsm" Then Exit Function

基本上 return 没有什么会导致该函数毫无价值,如果您将它放在代码的高位(作为函数的第一行),它将使用非常有限的资源。

这是不可能的,不仅因为函数向导在应用程序级别工作,而且VBA编译是独立于调用者的。例如让我们设置一个编译器条件语句

#If ActiveWorkbook = ThisWorkbook Then

 Public Function udf1()
  udf1 = "UDF1"
 End Function

#End If

这在编译器时计算为 True,并且可以在两个工作簿中看到 udf1。从 book2 调用此函数时,此语句的计算结果为 False。然而,该函数仍然可以从两本书中访问,因为编译是在以前的 - 独立于调用者 - 时间完成的,当时每个模块都在编译并且这个声明每次都是正确的。

当然 #If ActiveWorkbook <>ThisWorkbook ... 使两者都无法查看。