我是否必须在VBA类对象中有重复值?

我已经在excel中使用VBA类模块了一段时间,但我不确定我是否正确地创build它们。 我通常为类创build模块级variables,然后是属性让和获取函数。 例如:

Private msRegion As String Property Get Region() As String Region = msRegion 'Return the Region End Property Property Let Region(ByVal sRegionName As String) msRegion = sRegionName 'Set the Region End Property 

当我查看本地窗口中的对象时,我注意到,对于每个属性,我最终得到了模块作用域variables和Let函数所需的variables。 这似乎是重复一个variables给我。 我担心的是,如果我在每个对象中安装了大量的对象,那么在资源方面可能代价很高。

我试图修改代码,只有一个variables在对象类中,但到目前为止,我只有我的痛苦的错误信息。

有没有人知道一种方法来创build不会导致重复variables的类模块中的属性?

编辑:

我刚刚看了一下我的本地窗口,意识到财产让我们的论据不存在。 2expression式似乎是私有存储的variables,并且特权获得值,在这种情况下msRegion和Region。 这符合Cor_Blimey的回答。

您是否尝试在调用该类的代码中获取或设置msRegion属性? 如果你这样做,你会注意到它是不可调用的。

你在正确地构build这个类。

本地窗口显示所有声明的variables,包括一个类中的私有varibale。

Declan_K正确地说a)你做的是正确的,b)本地窗口忽略范围并且反正显示它们。

为什么把它们分开并拥有一个公共财产和一个私人成员领域,可以补充一点:

1) 在Get / Set / Let中可以有有限的“逻辑” 。 也许你希望以不同的格式存储这个值,但是总是把它存储在另一个格式中(例如把它存储为一个长的毫秒数,但总是以双精度数来返回),或者你希望在存储它之前validation数据。

2) 你定义了一个公共的“接口”,表示你的类和消费类之间的契约 。 因此,你要明确区分你的class级的内部,你可以随意改变你的class级和外部界面。 这在VBA中实际上可能不是问题,因为您可能完全控制了所有的消费类,并且VBA按需编译,因此它不是将属性更改为属性的问题,反之亦然,但这是一个好习惯,应该有助于执行更好的封装。 这也将帮助你记住,当你需要确定你的Addin /程序的其他地方没有发生突变时!

3) 属性基本上不占用variables的额外存储空间 。 具有公共领域和具有私人支持领域的财产的存储要求基本相同。 如果它对你有帮助,把它想象成一个返回私有值的“函数”或者设置私有值的“子”。

4) 在某些情况下,实际上可以节省资源 :考虑一个具有返回对象属性的类(比如“结果”集合或其他类)。 您可以保留支持字段为Nothing,直到实际需要的对象,无论是通过您的类中的方法或通过消费者请求通过属性。 当被请求时,你可以根据需要实例化对象。

5) 安装者和访问者的独立范围 :字段是私有的或者是公共的,所以如果它是公开的,你不能阻止一个字段被引用一个新的对象,这个对象可能会或可能不会与你的状态不一致class级期望。 另一方面,你可以限制一个属性为只读等(注意,这不会阻止只读对象的属性发生改变 – 它只能防止引用改变)。 同样,按照第2点,这可能不是一个问题,因为它在你的项目中,只有VBA,但它应该有助于确保你的类的属性(在松散的意义上)是不可或缺的你的class级的特点是由你的class级控制的。

6) 其他语言还有很多其他的原因,但是VBA确实less了。

另一方面,输出这么多的文字是一件很痛苦的事情,你可能会或可能不会觉得有用!