请向下滚动以更新,因为我发现这本工作簿可以满足 OP 的要求
总之,您需要将您的函数放在插件中的一个类中,但是还有一个额外的步骤可以使跨工作簿脚本运行,您不能New
在外部类上使用关键字。所以你需要编写一个可以在外部调用的类工厂函数。
下一个问题是耦合,您可以使用工具参考并参考项目以通过其有用的 Intellisense 进行早期绑定但是由于加载序列,您可能会为您的背部创建一个杆,该插件将由任何调用客户端加载一个参考。另一种选择是 Late Bound 等效项,它消除了引用,但将加载插件的负担放在了开发人员身上。
以下是步骤...
创建一个项目,我将其命名为 FunctionLibrary.xlsm,我将 Project 属性从“VBAProject”重命名为 FunctionLibrary。
向您的项目添加一个类,我调用了我的 MyLibrary,我将其设置
Instancing
为2 - PublicNotCreateable
. 我添加了(简单)以下代码
Option Explicit
Public Function Add(x, y)
Add = x + y
End Function
- 添加一个名为“modEarlyBoundClassFactory”的标准模块并添加以下代码
Option Explicit
Public Function CreateMyLibraryEarlyBoundEntryPoint(ByVal sLicenceKey As String) As MyLibrary
'If sLicenceKey = "Yourlicencekey" Then
Set CreateMyLibraryEarlyBoundEntryPoint = New MyLibrary
'End If
End Function
- 在 ThisWorkbook 模块中,我添加了以下代码
Option Explicit
Public Function CreateMyLibraryLateBoundEntryPoint(ByVal sLicenceKey As String) As Object
'If sLicenceKey = "Yourlicencekey" Then
Set CreateMyLibraryLateBoundEntryPoint = New MyLibrary
'End If
End Function
- 保存工作簿
- 创建一个调用工作簿,我调用了我的 FunctionLibraryCallers.xlsm 并在一个新的标准模块中添加了以下代码
Option Explicit
Sub EarlyBoundTest()
'* requires Tools->References to addin (this can create load sequence issues and the addin equivalent of dll hell)!
Dim o As FunctionLibrary.mylibrary
Set o = FunctionLibrary.CreateMyLibraryEarlyBoundEntryPoint("open sesame")
Debug.Print o.Add(4, 5)
End Sub
Sub LateBoundTest()
'* you need to write code to ensure the function library is loaded!!!
On Error Resume Next
Dim wbFL As Excel.Workbook
Set wbFL = Application.Workbooks.Item("FunctionLibrary.xlsm")
On Error GoTo 0
Debug.Assert Not wbFL Is Nothing
'* End of 'you need to write code to ensure the function library is loaded!!!'
Dim o As Object 'FunctionLibrary.mylibrary
Set o = wbFL.CreateMyLibraryLateBoundEntryPoint("open sesame") '* this works because the method is defined in ThisWorkbook module of library
Debug.Print o.Add(4, 5)
End Sub
- 要运行 top sub,您需要转到 Tools->References 和 references FunctionLibrary.xlsm。
- 要运行底部子程序不需要工具->参考,尽管您必须注释掉顶部子程序以避免编译错误。
更新:折叠评论者的反馈。DLL Hell 是当您将代码移至库时,您必须担心加载它、加载正确的版本和正确的依赖项。
本工作簿
OP询问ThisWorkbook,这个想法源于一个 关于编译错误的不同SO问题。如果将变量定义为 Workbook,编译器将不会强制执行标准 Workbook 接口。可以随意调用标准接口中没有的额外方法,我猜这是因为ThisWorkbook
可以用作可扩展机制。
ThisWorkbook 隐藏了“插入函数”对话框中的函数
有趣的是,它ThisWorkbook
从“插入函数”对话框中隐藏了一个函数,因此它是实现 OP 要求的一种更简单的方法!
ThisWorkbook 隐藏了 Application.Run 中的函数和子项
实际上,因为Thisworkbook
是一个类的单个实例,所以开发人员在其中定义的所有函数和子类都不会添加到全局命名空间中,因此无法调用Application.Run
它们。要执行它们,必须获取Excel.Workbook
对库工作簿对象的引用并通过该实例调用方法。
是的,这适用于 xlam 和 xlsm。
感谢OP,我今天学到了一些东西。