VBA:公共变量与属性

Posted

技术标签:

【中文标题】VBA:公共变量与属性【英文标题】:VBA: Public variable vs property 【发布时间】:2020-06-10 07:47:22 【问题描述】:

我有 3 个不同的模块,它们都有Subs,它们在某个阶段使用存储代码的工作簿。Module3 是我设置范围的地方,我也把公共工作簿变量放在那里。澄清一下:两个主要的子任务完成不同的任务并且彼此无关 - 除了都使用一些相同的范围和行变量,这就是为什么我把它们放在一个额外的模块中。

我还有一个在其Initialize 事件中使用ThisWorkbook 的用户表单。到目前为止,我一直在使用公共变量在 Module3 中声明工作簿 (wbTest),但我一直在阅读我以前从未使用过的属性。我正在考虑将wbTestModule2 传递到Userform,我发现Initialize 不可能,这就是我找到属性的方式。

我的问题是:从示例中我可以看出,当有某种错误处理或与之相关的计算时,使用属性是相当方便的。但在我的情况下,它只是一个 Set wbTest 命令,仅此而已 - 在这种情况下,选择公共变量上的属性仍然有意义吗?

模块1:

Option Explicit

Private Sub MainSub1()
    Call Module3.DefiningRanges
    MsgBox wbTest.Range("A1").Value
End Sub

模块2:

Option Explicit

Private Sub MainSub2()
   Call Module3.DefiningRanges
   MsgBox wbTest.Range("A2").Value
   frmSelection.Show
End Sub

模块3:

Option Explicit
Public wbTest As Workbook

Public Sub DefiningRanges()
   Set wbTest = ThisWorkbook   
End Sub

用户表单 frmSelection:

Option Explicit

Private Sub UserForm_Initialize()
  MsgBox wbTest.Sheets(1).Range("B1").Value
End Sub

所以这是一个相当普遍的问题,但在谷歌上我没有找到像我这样的简单案例。我现在确实知道公共变量不受欢迎,许多人尽可能避免使用它们——这就是为什么我要问是否应该在这里用一个属性替换它。

【问题讨论】:

如果使用其中任何一个,您只需将 wb 变量作为每个函数的参数从第一个开始传递呢? 我通常总是使用属性,即使在只设置支持变量的情况下也是如此。为什么?主要是为了保持一致性,尽管一些纯粹主义者会坚持始终使用属性。 @Damian 是的,这似乎是最简单的选择。我忽略了这种可能性,因为直到今天,当我清理我的代码时,它都不会像现在这样简单。谢谢! @BrianMStafford 如果我要使用属性,我只需要使用Public Property Get,对吗?设置工作簿后我不需要更改它,所以不需要Property Set @Alex 是的,您可以只执行 Property Get(只读)或只执行 Property Set(只写)。因此,对于您当前的设计,只需 Property Get 就可以了。 【参考方案1】:

当您谈论使用属性时,听起来好像您想将 Module3 用作对象,在这种情况下,它需要被创建为类模块。简单地返回一个范围似乎有点矫枉过正——你为什么不把它转换成一个返回范围对象的函数呢?您可以按如下方式更改 Module3 中的 Sub:

Public Function DefiningRanges() as WorkBook
   Set DefiningRanges = ThisWorkbook   
End Function

然后在您的其他模块中,您可以创建一个新对象并使用此函数的结果填充它,如下所示:

Private Sub MainSub1()
    Dim wb as WorkBook 
    Set wb = Module3.DefiningRanges()
    MsgBox wb.Range("A1").Value
End Sub

请注意,您不再引用 wbTest,我已将其替换为 MsgBox 行中的新 WorkBook [wb]。这样,就没有全局变量,只有一个“全局函数”,它返回对 WorkBook 的引用。

【讨论】:

以上是关于VBA:公共变量与属性的主要内容,如果未能解决你的问题,请参考以下文章

属性与公共成员变量[重复]

类中的属性与公共声明变量[重复]

VBA Class() 对象作为另一个类的属性

VBA基础一:对象属性方法变量

Javascript进阶---编写类

声明公共变量并赋值 - VBA