我在工作簿(Book 1
)中有两个相当简单的UDF,我也在函数向导中注册了它。一切都无缝衔接。然而,当我有两个不同的工作簿打开 - Book 1
和Book 2
- 我能够使用来自Book 1
的Book 2
的两个UDF中的任何一个。 Book 2
没有以与Book 1
相同的方式在函数向导下注册它们,但功能仍然完全正常。
以下是目前每个工作簿的显示方式:
没有创建加载项,
有没有办法对此进行编码,以便Book 1
中的UDF仅在Book 1
中可见,尽管其他任何工作簿都可以打开?
编辑:
因此,加载项可能甚至不可能。但是,有没有另一种方法来攻击这个,以便唯一可以使用这些功能的工作簿是Book 1
?
注意:Option Private Module
不起作用,因为它在两本书中隐藏了用户的功能,但它确实阻止了Book 2
能够使用该功能。我的最终目标是让它在Book 1
中可见,但在Book 2
中看不见且无法使用。
我不确定你是否可以这样做,以便在不同的工作簿中根本不显示该功能。他们都在同一个Application
下,所以他们有点相关。
您可以使用包含触发UDF的Range对象的Application.Caller
:
If Application.Caller.Parent.Parent.Name <> "Book1.xlsm" Then Exit Function
并且基本上不返回任何导致函数毫无价值的东西,如果你把它放在你的代码中(作为函数的第一行),它将使用非常有限的资源。
这是不可能的,不仅因为函数向导在应用程序级别工作,而且VBA编译也是调用者独立的。例如,设置编译器条件语句
#If ActiveWorkbook = ThisWorkbook Then
Public Function udf1()
udf1 = "UDF1"
End Function
#End If
这在编译器时间内评估为True
,并且可以在两个工作簿中看到udf1
。从book2调用此函数时,此语句的计算结果为False
。但是这个函数仍然可以从两本书中访问,因为编译是在前一个调用者的独立时间内完成的,当每个模块都在编译时,每次都是这样的语句。
当然#If ActiveWorkbook <>ThisWorkbook
......让两者都不可见。