我在工作簿(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
中不可见且无法使用。
答案 0 :(得分:2)
我不确定您可以做到这一点,以便该功能根本不会出现在其他工作簿中。它们都在同一个Application
下,因此它们是相关的。
您可以使用Application.Caller
来包含触发UDF的Range对象:
If Application.Caller.Parent.Parent.Name <> "Book1.xlsm" Then Exit Function
从本质上讲什么也不会返回,导致该函数一文不值,并且如果您在代码中将此位置高(作为函数的第一行),它将占用非常有限的资源。
答案 1 :(得分:0)
这是不可能的,不仅因为“功能向导”在应用程序级别起作用,而且VBA编译与调用者无关。例如,让我们设置一个编译器条件语句
#If ActiveWorkbook = ThisWorkbook Then
Public Function udf1()
udf1 = "UDF1"
End Function
#End If
这在编译器时为True
,在两个工作簿中都可以看到udf1
。从book2调用此函数时,该语句的计算结果为False
。但是,仍然可以从两本书中访问该函数,因为编译是在上一个(独立于调用者的)时间完成的,当时每个模块都在编译,并且每次该语句为true。
当然#If ActiveWorkbook <>ThisWorkbook
...使得两者都不可见。