我有一个宏工作簿,其中包含许多永久存在的工作表,这些工作表经常被清除,更新等。由于它们在各种子程序中被引用,我在下面的每个对应的工作表对象中都设置了一个伪全局变量方式,例如“主要”表格:
Function MAIN() As Worksheet
Set MAIN = ThisWorkbook.Sheets("Main")
End Function
通过这样做,我可以参考其他子例程中的每个工作表,例如:
MAIN.Cells.ClearContents
我还以类似的方式定义了一些伪全局常量,这些常量位于“Main”表的固定位置,例如:
Function NumLines() As Integer
NumLines = MAIN.Range("C3").Value
End Function
这样,我就像整个代码中的任何变量一样使用“NumLines”。 我希望有一种更有效的方法来管理像这样的全局访问变量,并且想知道,实现这一目标的更好方法是什么?
答案 0 :(得分:4)
我希望有一种更有效的方法来管理像这样的全局访问变量,并且想知道,实现这一目标的更好方法是什么?
当我在VBA中使用全局变量时,我做了三件事。
我总是用g_
前缀来表示全局变量。通常,VBA中的全局变量很有用。但是我也花了很长时间试图追踪“哪些变量是全局变量?”在其他人的代码中。保持一个非常明确的命名约定将为您和任何看到您的代码的人节省一些麻烦。
如果您作为开发人员经验不足,这甚至更多重要。避免全局变量在VBA中很难,并且你拥有的经验越少,你使用全局变量的可能性就越大。对于其他人来说,帮助或维护代码变得非常重要。
如果您打算使用甚至少量的全局变量,必须使用Option Explicit
,除非您想在维护代码时造成噩梦。当您编写代码时,很难在数月或数年之后追踪这些错误。
我总是创建一个名为“GlobalVariables”或类似的模块。该模块在一个位置包含所有全局声明。对于更大的代码库,这可能会变得更长,但它总是为我付出代价,因为我确切知道所有全局变量的定义。没有“这个变量实际上是在哪个文件中定义的?”游戏。
在你的第一个例子中,也是一个不相关的注释 - 我会使用code name而不是那个函数。每个VBA工作表都有一个工作表名称(在您的情况下为“Main”)以及一个代号,您可以在VBA中设置它并保持不变。这可以防止用户更改“Main”的名称并破坏代码。
您也可以直接引用它们,类似于您使用MAIN.Cells
的方式。 KazJaw就是一个很好的例子。
答案 1 :(得分:4)
对于可靠的表格参考,我建议使用Sheet.CodeName Property
。每张工作表都有其唯一的CodeName,您可以在下图中标记为黄色的位置找到它。
为了快速参考单元格值,我建议使用Range名称。选择C3单元后,需要在下面标有黄色的框中输入唯一的名称。所有范围名称在工作簿中都是唯一的。
因此,您可以在项目的每个子例程中使用下面介绍的工作表和单元格引用。
Sub Test_Macro()
Debug.Print MAIN.Name '>> result: Sheet1
Debug.Print Range("CellC3").Value '>> result: 100
End Sub