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

use*_*241 14 excel vba module public global-variables excel-vba

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

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

Option Explicit
Sub setMe()
    Global1 = "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)

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

Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
    Debug.Print (Global1)
End Sub
Run Code Online (Sandbox Code Playgroud)

单击SetMe可生成编译器error: variable not defined.
当我创建一个单独的模块并将Global1的声明移入其中时,一切正常.

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

或者是唯一的地方可以宣告一个全球性的,在类型的单独的模块的模块.

san*_*ica 18

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

答:是的,他们"有能力"

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

例如,放在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
Run Code Online (Sandbox Code Playgroud)

放在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
Run Code Online (Sandbox Code Playgroud)

并在标准模块代码中

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
Run Code Online (Sandbox Code Playgroud)

所有三个潜艇工作正常.

PS1:这个答案主要基于此处的信息.值得一读(来自伟大的Chip Pearson).

PS2:你的行Debug.Print ("Hello")会给你编译错误Invalid outside procedure.

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

PS4:检查还将Excel-VBA代码放入模块或工作表中?.

PS5:你可能无法在Sheet1中声明一个全局变量,并在其他工作簿的代码中使用它(阅读http://msdn.microsoft.com/en-us/library/office/gg264241%28v= office.15%29.aspx#sectionSection0 ;我没有测试这一点,所以这个问题还没有得到证实.但无论如何,你并不是故意在你的例子中这样做.

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


Ale*_*ell 4

您可以执行以下操作来学习/测试该概念:

  1. 打开新的 Excel 工作簿,然后在 Excel VBA 编辑器中右键单击“模块”->“插入”->“模块”

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

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

Sub setMe()
      Global1 = "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)
  1. 在工作表 VBA 模块 Sheet2(Sheet2) 中放置代码片段:
Sub showMe()
    Debug.Print (Global1)
End Sub
Run Code Online (Sandbox Code Playgroud)
  1. 按顺序运行 Sub setMe(),然后运行 ​​SubshowMe()以测试 var 的全局可见性/可访问性Global1

希望这会有所帮助。