如何声明Excel VBA中的全局变量在工作簿中可见
我有一个关于全局范围的问题,并将该问题抽象为一个简单的示例: 在Excel工作簿中: 在表1中,我有两(2)个按钮。如何声明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
第一个标记为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的单独模块中,您可以执行以下操作来学习/测试该概念:
setMe()
和SubshowMe()
以测试varGlobal1的全局可见性/可访问性
此工作簿
或工作表模块中对全局变量的引用(例如,称为此工作簿.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”,它只用于定义全局变量——没有子模块、函数或任何代码,只有定义的全局变量。欢迎使用!很高兴它对你有用。如果您对解决方案感到满意,请将答案标记为已接受。顺致敬意,