允许在一个打开的工作簿中使用 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 1
和 Book 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
... 使两者都无法查看。
我在工作簿 (Book 1
) 中有两个相当简单的 UDF,我也已在函数向导中注册了它们。一切都无缝运行。但是,当我打开两个不同的工作簿时 - Book 1
和 Book 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
... 使两者都无法查看。