如何声明Excel VBA中的全局变量在工作簿中可见

如何声明Excel VBA中的全局变量在工作簿中可见,excel,module,global-variables,public,vba,Excel,Module,Global Variables,Public,Vba,我有一个关于全局范围的问题,并将该问题抽象为一个简单的示例: 在Excel工作簿中: 在表1中,我有两(2)个按钮。 第一个标记为SetMe,并链接到Sheet1模块中的子例程: 表1代码: Option Explicit Sub setMe() Global1 = "Hello" End Sub Option Explicit Public Global1 As String Debug.Print("Hello") Sub showMe() Debug.Print (Glo

我有一个关于全局范围的问题,并将该问题抽象为一个简单的示例:

在Excel工作簿中: 在表1中,我有两(2)个按钮。
第一个标记为SetMe,并链接到Sheet1模块中的子例程:
表1代码:

Option Explicit
Sub setMe()
    Global1 = "Hello"
End Sub
Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
    Debug.Print (Global1)
End Sub
第二个标记为ShowMe,并链接到此工作簿模块中的子例程:
此工作簿代码:

Option Explicit
Sub setMe()
    Global1 = "Hello"
End Sub
Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
    Debug.Print (Global1)
End Sub
单击SetMe
生成编译器
错误:未定义变量

当我创建一个单独的模块并将Global1的声明移动到其中时,一切都正常

所以我的问题是: 我读到的所有内容都表明,在任何代码之外,在模块顶部声明的全局变量应该对项目中的所有模块都可见。显然情况并非如此。 除非我对模块的理解不正确。
对象
Sheet1
Sheet2
此工作簿
,。。。工作簿附带的:这些模块不能在全局范围内声明变量吗


或者是唯一可以声明全局的地方,在类型为Modules

的单独模块中,您可以执行以下操作来学习/测试该概念:

  • 打开新的Excel工作簿,在Excel VBA编辑器中右键单击模块->插入->模块

  • 在新增加的模块1中添加声明<代码>公共全局1作为字符串

  • 在工作表VBA模块Sheet1(Sheet1)中放入代码段:

  • 在工作表VBA模块Sheet2(Sheet2)中放入代码段:
  • 依次运行Sub
    setMe()
    和Sub
    showMe()
    以测试var
    Global1的全局可见性/可访问性
  • 希望这会有所帮助。

    您的问题是: 这些模块不能在全局范围内声明变量吗

    回答:是的,他们“有能力”

    唯一的一点是,必须完全限定
    此工作簿
    或工作表模块中对全局变量的引用(例如,称为
    此工作簿.Global1
    ) 只有在出现歧义的情况下(例如,如果有多个标准模块定义了一个名为
    Global1
    的变量,并且您打算在第三个模块中使用该变量),标准模块中对全局变量的引用才必须完全限定

    例如,在
    Sheet1
    code

    Public glob_sh1 As String
    
    Sub test_sh1()
        Debug.Print (glob_mod)
        Debug.Print (ThisWorkbook.glob_this)
        Debug.Print (Sheet1.glob_sh1)
    End Sub
    
    Public glob_this As String
    
    Sub test_this()
        Debug.Print (glob_mod)
        Debug.Print (ThisWorkbook.glob_this)
        Debug.Print (Sheet1.glob_sh1)
    End Sub
    
    放入
    本工作簿
    code

    Public glob_sh1 As String
    
    Sub test_sh1()
        Debug.Print (glob_mod)
        Debug.Print (ThisWorkbook.glob_this)
        Debug.Print (Sheet1.glob_sh1)
    End Sub
    
    Public glob_this As String
    
    Sub test_this()
        Debug.Print (glob_mod)
        Debug.Print (ThisWorkbook.glob_this)
        Debug.Print (Sheet1.glob_sh1)
    End Sub
    
    在标准模块代码中

    Public glob_mod As String
    
    Sub test_mod()
        glob_mod = "glob_mod"
        ThisWorkbook.glob_this = "glob_this"
        Sheet1.glob_sh1 = "glob_sh1"
        Debug.Print (glob_mod)
        Debug.Print (ThisWorkbook.glob_this)
        Debug.Print (Sheet1.glob_sh1)
    End Sub
    
    三个潜艇都很好

    PS1:这个答案基本上是基于来自中国的信息。这本书很值得一读(出自伟大的奇普·皮尔森)

    PS2:您的行
    Debug.Print(“Hello”)
    将显示编译错误
    无效的外部过程

    PS3:您可以(部分)在VB编辑器中使用Debug->Compile VBAProject检查代码。所有编译错误都将弹出

    PS4:也检查一下

    PS5:您可能无法在,比如说,
    Sheet1
    中声明全局变量,并在其他工作簿的代码中使用它(阅读我没有测试这一点,所以这个问题尚待确认)。但无论如何,在你的例子中,你不是有意这么做的


    PS6:在不完全限定全局变量的情况下,有几种情况会导致歧义。你可以稍微修补一下以找到它们。它们是编译错误。

    我相信UserForms的代码属于category类型模块,尽管它实际上并没有被列为category类型模块。是这样吗?@sancho.s我删除了它以避免混淆:)我错过了Pearson的链接,并误解了我发布的MSDN链接中的一行。今天学到了一些新东西:)你在这里找到了有用的答案吗?提供反馈总是好的,这样其他用户就可以看到。我误解了我发布的链接中的一行。今天学到了一些新东西:)。肯定是+1。如果我能不止一次投票,我就会这么做。这让我发疯——将
    公共事物作为新事物添加到模块中而不是此工作簿中,解决了尝试访问
    事物时出现的所有“424”错误问题。something()
    简单,thx,对我有效。我将其中一个模块命名为“Globals”,它只用于定义全局变量——没有子模块、函数或任何代码,只有定义的全局变量。欢迎使用!很高兴它对你有用。如果您对解决方案感到满意,请将答案标记为已接受。顺致敬意,