VBA:公共变量与属性
Posted
技术标签:
【中文标题】VBA:公共变量与属性【英文标题】:VBA: Public variable vs property 【发布时间】:2020-06-10 07:47:22 【问题描述】:我有 3 个不同的模块,它们都有Subs
,它们在某个阶段使用存储代码的工作簿。Module3
是我设置范围的地方,我也把公共工作簿变量放在那里。澄清一下:两个主要的子任务完成不同的任务并且彼此无关 - 除了都使用一些相同的范围和行变量,这就是为什么我把它们放在一个额外的模块中。
我还有一个在其Initialize
事件中使用ThisWorkbook
的用户表单。到目前为止,我一直在使用公共变量在 Module3
中声明工作簿 (wbTest
),但我一直在阅读我以前从未使用过的属性。我正在考虑将wbTest
从Module2
传递到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:公共变量与属性的主要内容,如果未能解决你的问题,请参考以下文章