Excel VBA类对象中是否必须有重复的值?

Excel VBA类对象中是否必须有重复的值?,excel,class,vba,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 =

我在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函数所需的变量。对我来说,这似乎是一个变量的重复。我担心的是,如果我建立了一个大型对象集合,每个对象都有几个属性,那么在资源方面可能会很昂贵

我试图修改代码,使对象类中只有一个变量,但到目前为止,我只收到了错误消息

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

编辑:


我刚刚又看了一眼我的“本地人”窗口,意识到房地产出租的理由并不存在。这两个表达式似乎是私有存储的变量和property get值,在本例中为msRegion和Region。这符合Cor_Blimey的答案。

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

你的课程结构正确


“局部变量”窗口显示所有声明的变量,包括类内的私有变量

Declan_K说a)你做得对,b)Locals窗口忽略作用域并显示它们是正确的

要补充一点,将它们分离出来并拥有公共财产和私人成员字段是件好事:

1) 您可以在Get/Set/Let中使用有用的有限“逻辑”。可能您希望以不同的格式存储值,但始终以另一种格式显示(例如,以较长的毫秒数存储值,但始终以双倍秒返回),或者您希望在存储数据之前验证数据

2) 您定义了一个公共“接口”,它表示类和消费类之间的契约。因此,您可以清楚地区分类的内部(可以根据需要自由更改)和外部接口。在VBA中,这在实践中可能不是问题,因为您可能完全控制所有使用类,并且VBA会按需编译,因此将字段更改为属性或将属性更改为属性不是问题,但这是一种良好的做法,应该有助于实施更好的封装。它还将帮助您记住什么时候您需要确保您没有在加载项/程序的其他地方进行破坏性的更改

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

<>强>实际上,在某些情况下,你可以节省资源< /强>:考虑一个具有返回对象的属性的类(比如“结果”集合或某物)。在实际需要该对象之前,可以通过类中的方法或通过消费者通过属性请求该对象,将支持字段保留为空。当被请求时,您可以根据需要实例化该对象

5) 设置器和访问器的单独作用域:字段要么是私有的,要么是公共的,因此如果它是公共的,您无法阻止,例如,一个字段引用一个新对象,该对象可能与您的类所期望的状态不一致。另一方面,您可以将属性限制为只读等(请注意,这不会阻止只读对象更改其属性-它只会阻止引用更改)。同样,根据第2点,这对您来说可能根本不是问题,因为它在您的项目中,毕竟只有VBA,但它应该有助于确保您的类的属性(从更宽松的意义上说)是您的类的整体特性,由您的类控制

6) 在其他语言中还有很多其他原因,但VBA确实没有那么多


另一方面,为你可能觉得有用或不有用的东西键入这么多文本是一件痛苦的事

+1个好问题,我也一直很好奇。我发现的所有示例(以及我所实现的)都反映了您的代码。我怀疑这是事情的本质,也是正确的,但在“本地人”窗口中有点混乱。感谢您提供的信息,我希望在程序结束时,let程序的论点可以被销毁,但我猜这不是它的工作方式。