在ThisWorkbook Excel对象的Private Sub Workbook_Open中声明的变量可以被另一个模块中的另一个方法访问吗?我想在代码的开头声明和分配一个变量,任何使用它的模块都可以改变它。当下一个方法调用它时,这个变化应该反映在变量中。Excel VBA全局变量
我有一个模块中的公有变量赋值。 我需要module1设置的这个值可以访问module2的值
在ThisWorkbook Excel对象的Private Sub Workbook_Open中声明的变量可以被另一个模块中的另一个方法访问吗?我想在代码的开头声明和分配一个变量,任何使用它的模块都可以改变它。当下一个方法调用它时,这个变化应该反映在变量中。Excel VBA全局变量
我有一个模块中的公有变量赋值。 我需要module1设置的这个值可以访问module2的值
否 - 变量应该在普通模块中声明为Public。
' Public variable
Public a as String
' Local variable
Public sub hello()
Dim a as String
End sub
第一a
是公开的,你可以使用你想要和第二个变量是本地的,你可以使用唯一的网站是到函数hello()
。所以这两个变量是不同的。
'暗淡'从未公开。这个答案是错误的和误导性的。这个“私有变量”实际上是一个* local *变量,而你所称的“公共变量”实际上就是一个* private field *,这是一个模块范围变量,只能在该模块中访问。 –
@ Mat'sMug谢谢你的评论,你有权利。我改变了我的答案。 – David
由于您正在呼叫Private Sub,因此无法呼叫。
为了拥有它可以公开地被改变的变量,尝试之外的任何子的:
Public wBk As Workbook
Public var As String
这将声明的变量。要修改的值,则需要将它们放置在公共子程序:
Public Sub myPublicVar()
Set wBk = Workbooks("Workbook1.xlsm")
Set var = "Whatever you like"
End Sub
如果当时你想让你的模块或子程序,包括变量,你会做以下
Sub myOtherSub()
Call myPublicVar
MsgBox var
End Sub
希望这帮助!
公共VAR1作为字符串 子M1() VAR1 = “创先争优” 结束小组 子M2() MSGBOX VAR 结束小组 –
好了,:'公共VAR1为String' - 使VAR1公共字符串,而不是'Sub M1()',使用'Public Sub M1()'因为这可以让你在另一个子类中使用变量。在你的第三个Sub中,你需要执行以下操作:'Sub M2(),调用M1,MsgBox var1,End Sub' – itChi
甲全局变量需要具有Public
可访问性,和在模块范围在标准模块(.BAS)中声明。
Option Explicit
Public Foo As Long ' global variable
问题与全局变量是他们可以阅读和被任何东西在代码的任何地方写入:全局状态容易导致不可维护的面条代码,应尽量避免。
有许多替代方案,特别是使用参数:
Option Explicit
Public Sub SomeEntryPoint()
Dim foo As Long ' local variable
DoSomething foo
MsgBox foo 'prints 42
End Sub
'this procedure could be in any module, public.
Private Sub DoSomething(ByRef foo As Long)
foo = 42 'byref assignment; caller will receive the updated value
End Sub
另一种选择,如果变量需要是通过对其进行声明的模块写入,但需要为读从别的地方,就是用性能:
Option Explicit
Private foo As Long ' private field
Public Sub DoSomething()
'do stuff...
foo = 42
'...
End Sub
Public Property Get SomeFoo() As Long
SomeFoo = foo
End Property
现在代码在该模块可以写到foo
根据需要,和其它模块只能通过SomeFoo
属性读foo
- 假设字段和属性在Module1
定义:
Debug.Print Module1.SomeFoo 'gets the value of the encapsulated private field
建立在@David的答案,这就是如何使用Dim和Public及其区别(在Modul中,命名为Modul1
,编写以下并运行TestMe
):
Dim a As String
Public b As String
Private c As String
Global d As String
Private Sub TestA()
'Whatever is not declared in TestMe, would take its value from here for the print.
'^-If it is declared, the value would be attached to the public/private/dim/glb above.
a = 11
b = 22
c = 33
d = 44
End Sub
Private Sub TestMe()
Dim a As String
'Dim b As String
'Dim c As String
Dim d As String
a = 1
b = 2
c = 3
d = 4
TestA
Debug.Print a; vbTab; Modul1.a
Debug.Print "----------------"
Debug.Print b; vbTab; Modul1.b
Debug.Print "----------------"
Debug.Print c; vbTab; Modul1.c
Debug.Print "----------------"
Debug.Print d; vbTab; Modul1.d
End Sub
这是你会得到什么:
1 11
----------------
22 22
----------------
33 33
----------------
4 44
是在程序范围内声明的变量不能是全球性的,这是* *本地到该程序。阅读范围,并学习如何在过程之间传递参数。 99%的全局变量可以通过参数完成。 –