在VBA中声明全局变量的正确过程?

在VBA中声明全局变量的正确过程?,vba,excel,global-variables,Vba,Excel,Global Variables,我有一个宏工作簿,其中包含大量永久存在的工作表,这些工作表会不断被清除、更新等。由于它们在不同的子例程中被引用,因此我以以下方式将每个对应的工作表对象设置为伪全局变量,例如“主”工作表: 通过这样做,我可以引用其他子例程中的每一页,例如: MAIN.Cells.ClearContents 我还以类似的方式定义了一些伪全局常量,它们位于“主”表上的固定位置,例如: Function NumLines() As Integer NumLines = MAIN.Ran

我有一个宏工作簿,其中包含大量永久存在的工作表,这些工作表会不断被清除、更新等。由于它们在不同的子例程中被引用,因此我以以下方式将每个对应的工作表对象设置为伪全局变量,例如“主”工作表:

通过这样做,我可以引用其他子例程中的每一页,例如:

    MAIN.Cells.ClearContents
我还以类似的方式定义了一些伪全局常量,它们位于“主”表上的固定位置,例如:

    Function NumLines() As Integer
        NumLines = MAIN.Range("C3").Value
    End Function
通过这种方式,我使用“NumLines”就像整个代码中的任何变量一样。 我希望有一种更有效的方法来管理这些全局访问的变量,我想知道,有什么更好的方法来实现这一点

我希望有一种更有效的方法来管理这些全局访问的变量,我想知道,有什么更好的方法来实现这一点

当我在VBA中使用全局变量时,我做了三件事

  • 我总是在全局变量前面加一个
    g
    前缀。VBA中的全局变量似乎经常有用。但我也花了太长时间试图在其他人的代码中找到“哪些变量是全局变量还是非全局变量?”。保持一个非常清晰的命名约定将在将来为您和任何查看您的代码的人节省大量的麻烦

    如果您作为开发人员的经验较少,这一点就更为重要。在VBA中,避免使用globals是很困难的,经验越少,就越有可能使用globals。对于其他人来说,帮助或维护代码变得非常重要

  • 如果要使用少量全局变量,则必须使用
    选项Explicit
    ,除非您想在维护代码时造成噩梦。当您编写代码时,跟踪这些错误已经足够困难了,更不用说几个月或几年后了

  • 我总是创建一个称为“全局变量”或类似的模块。该模块在一个位置包含所有的全局声明。对于更大的代码库,这可能会变得更长,但这对我来说总是有回报的,因为我确切地知道所有全局变量的定义位置。游戏中没有“这个变量实际上是在哪个文件中定义的?”


  • 在您的第一个示例中,也只是一个不相关的注释-我将使用而不是该函数。每个VBA工作表都有一个工作表名称(在您的示例中为“Main”)和一个代码名,您可以在VBA中设置该名称并保持不变。这可以防止用户更改“Main”的名称和中断代码


    您也可以直接引用它们,类似于使用
    MAIN.Cells
    的方式。有一个很好的例子。

    要获得可靠的工作表参考,我建议使用
    sheet.CodeName属性
    。每张纸都有其独特的代码名,您可以在下图标记为黄色的地方找到

    为了快速引用单元格值,我建议使用范围名称。选择C3单元格后,需要在下面标记为黄色的框中输入唯一名称。工作簿中的所有区域名称都是唯一的

    因此,您可以在项目中的每个子例程中使用图纸和单元引用,如下所示

    Sub Test_Macro()
    
        Debug.Print MAIN.Name   '>> result: Sheet1
        Debug.Print Range("CellC3").Value   '>> result: 100
    
    End Sub
    

    +1:提出一个好问题,恰当地构建它,自己大胆尝试,只是出于好奇心和改进的动力。更新内容,这是。+1:获取最佳实践提示和
    选项显式
    @enderland:感谢您的帮助。为什么在处理全局变量时“option explicit on”比处理基本子例程更重要?(我臭名昭著的是,我的大部分变量都没有声明,这可能是我应该处理的。)@teepee很抱歉没有回答,但因为对于全局变量,它们分散在整个代码中,而不是简单地放在一个地方(一个方法)。至少在这种情况下,您可以看到该变量的其他用途来“检查”拼写。全局变量没有这样的能力。@KazJaw:谢谢你为全局常量方面提供了非常简单的解决方案。到目前为止,每次我在工作表上移动对象时,我都必须更改代码中的范围引用。我以前知道范围命名,并将其用于其他用途,但从未知道VBA连接。这太棒了。
    Sub Test_Macro()
    
        Debug.Print MAIN.Name   '>> result: Sheet1
        Debug.Print Range("CellC3").Value   '>> result: 100
    
    End Sub