首页 > 解决方案 > 如何限制标准模块中的功能范围

问题描述

我准备了一个标准模块,MyPath,其中包含一些有用的功能。在这种情况下,标准模块对我来说比类模块更好。

写起来更舒服:

Dim ext As String
ext = MyPath.getFileExtension("test.docx")   ' returns "docx"

代替:

Dim Pth As MyPath
Set Pth = New MyPath

Dim ext As String
ext = Pth.getFileExtension("test.docx")

或类似的东西

Dim ext As String
With New MyPath
    ext = .getFileExtension("test.docx")
End With

我的“伪静态类”模块的唯一问题是它的范围(和 IntelliSense 的使用)。

Dim ext As String
ext = getFileExtension("test.docx")   ' This works, but I don't want it to

我想要实现的是:

我尝试了一些与Option Private Module,Private函数的组合,但没有人按照我描述的方式工作。
我正在准备很多课程和类似的模块,我会保持一切井井有条。

编辑
简而言之,如果我没有为函数或子指定“父”模块,我想强制编译器抛出错误。同时,如果我输入模块的名称,我将能够使用 IntelliSense(没有运行/调用的解决方案,只需输入模块名称、点并选择成员)。

在此处输入图像描述

标签: vbascope

解决方案


受 VBA 的 Err 对象启发的另一个解决方案是实现一个函数,该函数返回对“静态对象”的引用

Public Static Function MyPath() As PathObject
    Dim result As PathObject
    If result Is Nothing Then Set result = New PathObject
    Set MyPath = result
End Function

PathObject包含所有伪静态方法的类在哪里。

这种方法的额外好处是调用者不能将他们的 MyPath 引用设置为 Nothing - 如果您决定您的 Static 模块应该是有状态的(也许对于一些昂贵的初始化例程)

PS 我认为Static Function语法很可爱,但你同样可以用 static 关键字声明结果


事实上,你可以让它更简洁

Public Static Function MyPath() As PathObject
    Dim result As New PathObject
    Set MyPath = result
End Function

MyPath未经测试,但应该具有仅在第一次使用时才被实例化的行为,但此后会无限期地挂起


推荐阅读