如何将Excel VBA中的全局variables声明为在工作簿中可见

我有一个关于全球范围的问题,并把这个问题抽象成一个简单的例子:

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

Option Explicit Sub setMe() Global1 = "Hello" End Sub 

第二个标签为ShowMe ,并链接到ThisWorkbook模块中的子例程:
ThisWorkbook代码:

 Option Explicit Public Global1 As String Debug.Print("Hello") Sub showMe() Debug.Print (Global1) End Sub 

点击SetMe会产生一个编译器error: variable not defined
当我创build一个单独的模块,并将Global1的声明移入它时,一切正常。

所以我的问题是:我读过的一切都表明,在模块的顶部声明的全局variables,任何代码之外的variables应该对项目中的所有模块都可见。 显然情况并非如此。 除非我对Module的理解不正确。
对象Sheet1Sheet2ThisWorkbook ,…随工作簿一起提供:是不是可以在全局范围声明variables的模块?

或者是唯一可以声明一个全局的地方,在一个单独的Moduletypes模块中

你的问题是: 这些不是能够在全局范围声明variables的模块吗?

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

唯一的一点是,在ThisWorkbook或Sheet模块中对全局variables的引用必须是完全限定的(例如,称为ThisWorkbook.Global1 ,例如)。对标准模块中全局variables的引用只有在模糊的情况下才能被完全限定(例如,如果有多个标准模块定义了名称为Global1的variables,并且您的意思是在第三个模块中使用它)。

例如,放置在Sheet1代码中

 Public glob_sh1 As String Sub test_sh1() Debug.Print (glob_mod) Debug.Print (ThisWorkbook.glob_this) Debug.Print (Sheet1.glob_sh1) End Sub 

放在ThisWorkbook代码中

 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")会给你编译错误Invalid outside procedure

PS3:你可以(部分)用VB编辑器中的debugging – >编译VBAProject来检查你的代码。 所有编译错误将popup。

PS4:检查还将Excel-VBA代码放在模块或表单中? 。

PS5:您可能无法在Sheet1中声明全局variables,并在其他工作簿的代码中使用它(阅读http://msdn.microsoft.com/en-us/library/office/gg264241%28v= office.15%29.aspx#sectionSection0 ;我没有testing这一点,所以这个问题还没有被确认)。 但是,无论如何,你的意思并不是这个意思。

PS6:在没有完全限定全局variables的情况下,有几种情况会导致模棱两可。 你可以稍微修改一下find它们。 他们是编译错误。

你可以做以下的学习/testing的概念:

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

  2. 在新添加的Module1中添加声明; Public Global1 As String

  3. 在工作表VBA模块Sheet1(Sheet1)放置代码片段:

 Sub setMe() Global1 = "Hello" End Sub 
  1. 在工作表VBA模块Sheet2(Sheet2)放置代码片段:
 Sub showMe() Debug.Print (Global1) End Sub 
  1. 依次运行Sub setMe()和Sub showMe()来testingvar Global1的全局可见性/可访问性

希望这会有所帮助。