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

时间:2018-08-30 20:31:50

标签: excel vba excel-vba excel-2010 user-defined-functions

我在工作簿(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中不可见且无法使用。

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 ...使得两者都不可见。