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

时间:2013-08-19 19:09:06

标签: excel class vba

我一直在excel中使用VBA类模块一段时间了,但我不确定我是否正确创建它们。我通常为类创建模块级变量,然后是属性let和get函数。例如:

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

当我查看本地窗口中的对象时,我注意到对于每个属性,我最终得到了模块作用域变量和Let函数所需的变量。这对我来说似乎是一个变量的重复。我担心的是,如果我在每个对象中设置了大量具有多个属性的对象,那么在资源方面可能会很昂贵。

我试图修改代码,以便只有一个变量在对象类中,但到目前为止我只收到错误信息。

有没有人知道在类模块中创建不会导致重复变量的属性的方法?

编辑:

我刚刚看了一下我的本地窗口,并意识到属性let的参数不存在。这两个表达式似乎是私有存储的变量和proprty获取值,在本例中为msRegion和Region。这符合Cor_Blimey的回答。

2 个答案:

答案 0 :(得分:5)

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

您正在正确构建类。

locals窗口显示所有声明的变量,包括类中的私有varibale。

答案 1 :(得分:4)

Declan_K说得对,a)你说得对,b)Locals窗口忽略范围并显示它们。

稍微补充一点为什么将它们分开并拥有公共财产和私人会员字段是好的:

1)您可以在Get / Set / Let 中使用有用的有限'逻辑'。也许您希望以不同的格式存储该值,但始终将其存储在另一个格式中(例如,将其存储为长数毫秒,但始终以双秒为单位返回),或者您希望在存储之前验证数据。

2)您在类和消费类之间定义一个代表合同的公共“接口”。因此,您可以明确区分类的内部,可以根据需要随意更改,以及外部接口。这在VBA的实践中可能不是问题,因为您可能完全控制所有消费类,并且VBA按需编译,因此将字段更改为属性不是问题,反之亦然,但这是良好的做法,应该有助于实施更好的封装。它还可以帮助您记住,当您需要确定自己没有在Addin / program中的其他位置进行重大更改时,您将会记住这一点!

3)属性基本上不占用变量的额外存储空间。具有公共字段和具有私有支持字段的属性的存储要求基本相同。如果它对您有所帮助,可将其视为返回私有值的“函数”或设置私有值的“sub”。

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

5) Setter和Accessor的单独范围:字段是私有的或是公共的,因此如果它是公共的,则无法阻止,例如,一个字段被引用一个新对象可能会或可能不会与您的班级所期望的州不一致。另一方面,您可以将属性限制为只读等(请注意,这不会阻止只读对象更改其属性 - 它只会阻止引用更改)。同样,根据第2点,这可能对你来说根本不是问题,因为它在你的项目中并且毕竟只有VBA,但它应该有助于确保你的类的属性(在更宽松的意义上)是不可或缺的你班级的功能由你的班级控制。

6)其他语言还有很多其他原因,但VBA确实有更少的原因。

另一方面,为某些你可能会或可能没有用的东西输入这么多文字是一件痛苦的事。