excel - 在 VBA 中创建隐藏类成员和成员函数

标签 excel vba

我发现您可以在 VBA 中通过在名称前添加下划线(或可能是其他非法的第一个字符)来创建“隐藏”的东西。我所说的隐藏并不是指私有(private)的,而是指不会出现在 VBE 自动完成中的公共(public)事物;如果你想使用它,你必须知道它的存在。

我最近看到的一些例子是:

Collection 类中的 _NewEnum 函数(来自 this 问题),我经常像这样创建 Enum:

Public Enum SomeEnumeration
  [_First]
  FirstCategory = [_First]
  SecondCategory
  ThirdCategory
  [_Last] = ThirdCategory
  [_Invalid] = [_Last] + 1
End Enum

因为这允许我循环遍历我的枚举,而无需添加额外的公开类别,否则会造成困惑。

我的问题是:除了枚举之外,是否可以将此构造用于其他用途?我看到 Container 能够做到这一点,但我可以自己做吗?即,我将如何编写具有隐藏函数的类模块:

' Class module SomeClass

' Illustration of what I want, but this will not compile
Public Function _Hidden() As Variant
  ' Return something
End Function

然后通过访问这个函数

Dim Obj As New SomeClass
Obj.[_Hidden] ' This option should not be visible in the VBE autocomplete

我尝试用周围的 [] 定义函数,但这也不起作用。

这很有用,因为我经常使用类的默认实例作为对象工厂,作为 VBA 类构造函数不接受任何参数这一事实的解决方法。然而,当您这样做时,您会遇到一些问题,您必须公开类的某些部分,这些部分实际上应该是私有(private)的并在构造函数中设置。如果我可以将这些东西命名为隐藏的东西,它将使我的界面更干净,并防止意外使用。

最佳答案

如果您使用类的默认实例作为具有 create 和 self 函数的工厂,那么您可能还希望考虑使用接口(interface)作为哪些函数是私有(private)函数、哪些函数是公共(public)函数的仲裁者。例如而不是使用接口(interface)的普通 I 类命名约定,您有“Classprivate”(类定义)和“Class”(接口(interface))。无意为多个相关对象提供接口(interface),只是作为公共(public)/私有(private)过滤器。

这有很多优点。

  1. 您可以将类的所有方法和属性公开,这极大地方便了单元测试。

  2. 工厂仅返回接口(interface)对象,因此不会混淆您使用的是类实例还是接口(interface)。

VBA 的 Rubberduck 插件使界面的创建变得几乎微不足道。

关于excel - 在 VBA 中创建隐藏类成员和成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413669/

相关文章:

c# - 使用 C#/VSTO 监视 excel 2007 内的一系列单元格

excel - 如何更改地址属性的 'Column' 部分

r - 使用 r xlsx 在 Excel 文件中获取换行符/新行

excel - 在循环中键入不匹配以扫描 Outlook 邮件

vba - 检查工作表中是否有公式

Excel VBA根据工作表名称在单元格上创建下拉列表

java - 将jar包封装成dll

excel - 下标超出范围,Excel VBA,尝试在循环中创建数组

vba - 在VBA中设置字体颜色

excel - 如何使用 Excel 中存储的地址向多个收件人发送电子邮件?