【发布时间】:2017-06-22 07:52:50
【问题描述】:
我有一个带有“核心”功能和子功能的插件,我想在不同的插件或 VBA 项目中引用和使用它们。因为代码重用和单一更新原则。
例如,一个函数,它根据条件过滤集合成员并返回一个子集合。代码本身在这里不是问题。
Public Function listNamesContaining(ByVal NamesInput As Names, ByVal ContainsCriteria As String) As Collection
Dim NameMember As Name
Set listNamesContaining = New Collection
For Each NameMember In NamesInput
If InStr(1, NameMember.Name, ContainsCriteria, vbTextCompare) Then
listNamesContaining.Add NameMember
End If
Next
End Function
我不想在单元格插入函数中显示这个函数,因为它返回一个集合对象,但我想在多个 VBA 中重用它VBA 代码中的项目。
当前问题的图片,单元格插入公式中显示了一个对象函数:
研究
我找到了解决方案SO1,SO2 用于单个项目方法,使用Option Private Statement。
然而,由于其他应用程序或项目的限制,这并不能解决问题。
当模块包含 Option Private Module 时,公共部分,例如在模块级别声明的变量、对象和用户定义类型,在包含该模块的项目中仍然可用,但 它们不适用于其他应用程序或项目。
接下来,我在MRExcel formum - Hiding VBA functions only 上发现了一个问题。 Tom Schreiner 建议,我可以使用自定义 Classes 并在 Classes 中实现功能。这样,它们将无法通过 单元格插入功能 使用,但仍可用于我的其他项目。
问题
- 如何跨项目重用核心 VBA 函数 (UDF),但在单元格插入函数中不显示它们?
- 自定义类解决方案只有一种吗?
- (基于意见)我最初关于通过 excel 插件 (.xlam) 跨多个项目共享核心方法的理念是否合理?
【问题讨论】:
-
3) 是的。是的。我认为您根本不应该担心这些功能会出现。
-
@GSerg,我还有通过
CreateObject方法实例化应用程序的函数。例如。CreateObject("InternetExplorer.Application")。这些方法不能简单地忽略。我正在考虑重构这些。对于其他 VBA 对象,可以按照您的建议忽略它们在工作表上的使用。感谢您的意见。 -
你无法真正阻止坚定的用户成为白痴。如果你想尝试,你可以在你的函数中检查
Application.Caller,以确保它们在TypeOf Application.Caller is Range时不起作用。
标签: vba excel code-reuse excel-addins excel-udf