允许在一个打开的工作簿中使用UDF,但在另一个工作簿中使其不可见/不可用/不可访问

问题描述 投票:2回答:2

我在工作簿(Book 1)中有两个相当简单的UDF,我也在函数向导中注册了它。一切都无缝衔接。然而,当我有两个不同的工作簿打开 - Book 1Book 2 - 我能够使用来自Book 1Book 2的两个UDF中的任何一个。 Book 2没有以与Book 1相同的方式在函数向导下注册它们,但功能仍然完全正常。

以下是目前每个工作簿的显示方式:

书1书2 both workbook function wizards

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

编辑: 因此,加载项可能甚至不可能。但是,有没有另一种方法来攻击这个,以便唯一可以使用这些功能的工作簿是Book 1


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

excel vba excel-vba excel-2010 user-defined-functions
2个回答
2
投票

我不确定你是否可以这样做,以便在不同的工作簿中根本不显示该功能。他们都在同一个Application下,所以他们有点相关。

您可以使用包含触发UDF的Range对象的Application.Caller

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

并且基本上不返回任何导致函数毫无价值的东西,如果你把它放在你的代码中(作为函数的第一行),它将使用非常有限的资源。


0
投票

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

#If ActiveWorkbook = ThisWorkbook Then

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

#End If

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

当然#If ActiveWorkbook <>ThisWorkbook ......让两者都不可见。

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