gpt4 book ai didi

excel - 使用 VBA 中预先声明的类作为命名空间

转载 作者:行者123 更新时间:2023-12-02 06:10:16 24 4
gpt4 key购买 nike

我在 VBA 中编码的最大问题之一是完全缺乏命名空间,当每个同名函数都在全局命名空间中时,很难确保确定作用域和选择正确的函数。我知道您可以在函数调用前加上它所在的模块名称作为前缀,但在我看来,这也可以通过用预先声明的类替换所有模块来实现。命名空间看起来像这样:

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "MyNamespace"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'@Folder("Project.Namespace")
Option Explicit

Public Function Foo() As String
Foo = "bar"
End Function

' Opionally make sure users do not use this as a class
Private Sub Class_Initialize()
If Not Me Is MyNamespace Then
Err.Raise 512, _
Source:="MyNamespace.Initialize", _
Description:="Cannot create an instance of a namespace."
End If
End Sub

因此,如果您想在此 namespace 中调用 Foo ,您必须编写

MyNamespace.Foo()

虽然简单地调用 Foo() 是行不通的。

我的问题是这样的:

您有什么理由不想这样做吗?据我所知,该类的构造函数仅在打开项目后第一次调用其任何函数时才会被调用,因此我看不到那里有任何开销,但可能有一些我不知道的 secret 。当然,这绝不是解决功能缺乏问题的理想方法,但这并不是说 VBA 程序员还没有以迂回的方式使用该语言来提供缺乏的功能。

另外,我发现这与 this 基本相同问题,但是我还想知道代码中存在大量预先声明的“空”类是否存在任何具体问题。假设您用 100 个预先声明的类替换 100 个模块,这会对例如性能/稳定性/等等...?

最佳答案

它花费了你一个对象指针,仅此而已。不过,我不会将其称为命名空间

您使用过的每个 UserForm 模块都有一个设置为 TrueVB_PredeclaredId 属性。正如您所注意到的,这个实例是自动创建的,虽然您可以显式地销毁它,但下次引用它时,它将再次自动(默默地)重新创建......无论原始状态是/曾经是......漂亮很像自动实例化的对象,也称为 As New 声明。

因此,您所拥有的更像是对象层次结构,而不是命名空间结构 - 与从 Application 开始深入了解 Excel 对象模型的方式非常非常相似,然后执行以下操作:

Set someCell = Excel.Application.Workbooks(1).Worksheets(1).Range("A1")

这里的“命名空间”是 Excel 库,Application 是根对象,该表达式的其余部分是所有成员访问 - 属性 getter,以类命名.

但是这些类不在“命名空间”中...Worksheets 集合type(类)独立存在于Excel 库:Application 类上的 Worksheets 属性不会以任何方式、形状或形式保护该类免受“名称冲突”:如果您的用户代码有一个名为 Worksheets 的类模块(而且它完全可以),那么根据 VBA 如何解析标识符引用,Dim foo As Worksheet 将成为以下实例自定义类:唯一有效的限定符是库名称(ExcelMyVBAProject)。

因此,您拥有的是构建相对复杂的对象模型结构的合理方法 - 但它不会(不能)替换或模拟 namespace 。如果您发现自己在创建“空”类,请重新考虑您的设计。

对于最后一个问题,我不认为拥有 100 个预先声明的自定义对象与具有 100 个用户表单的项目有什么不同:在这两种情况下,我想知道是否有一种方法可以减少它并概括/重用组件,无论它们是表单还是类。

你想要避免的是一个保存状态的预先声明的对象 - 因为该状态现在实际上是全局的,并且你无法控制什么会改变该状态,在哪里以及何时:Application.Calculation 就是一个很好的例子。

关于excel - 使用 VBA 中预先声明的类作为命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55258448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com