您的问题是:
这些模块不能在全局范围内声明变量吗?
答案:可以,在全局范围内声明变量是“可行的”。
唯一的问题在于,对于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
将代码放置在 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:这个答案主要基于这里提供的信息,非常值得一读(来自伟大的Chip Pearson)。
PS2:你的代码行Debug.Print("Hello")
会给你编译错误Invalid outside procedure
。
PS3:你可以用VB编辑器中的调试->编译VBAProject部分地检查你的代码。所有编译错误都会弹出。
PS4:还可以查看将Excel-VBA代码放在模块或工作表中?。
PS5:你可能无法在例如Sheet1
中声明全局变量,并在其他工作簿的代码中使用它(阅读http://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0;我没有测试这一点,所以这个问题仍然需要确定)。但是在你的例子中,这并不是你的意思。
PS6:在不完全限定全局变量的情况下,会有几种导致歧义的情况。你可以稍微调整一下来找到它们。它们是编译错误。