2017-10-16 169 views
1

在ThisWorkbook Excel对象的Private Sub Workbook_Open中声明的变量可以被另一个模块中的另一个方法访问吗?我想在代码的开头声明和分配一个变量,任何使用它的模块都可以改变它。当下一个方法调用它时,这个变化应该反映在变量中。Excel VBA全局变量

我有一个模块中的公有变量赋值。 我需要module1设置的这个值可以访问module2的值

+0

是在程序范围内声明的变量不能是全球性的,这是* *本地到该程序。阅读范围,并学习如何在过程之间传递参数。 99%的全局变量可以通过参数完成。 –

回答

2

否 - 变量应该在普通模块中声明为Public。

0
' Public variable 
Public a as String 

' Local variable 
Public sub hello() 
    Dim a as String 
End sub 

第一a是公开的,你可以使用你想要和第二个变量是本地的,你可以使用唯一的网站是到函数hello()。所以这两个变量是不同的。

+1

'暗淡'从未公开。这个答案是错误的和误导性的。这个“私有变量”实际上是一个* local *变量,而你所称的“公共变量”实际上就是一个* private field *,这是一个模块范围变量,只能在该模块中访问。 –

+0

@ Mat'sMug谢谢你的评论,你有权利。我改变了我的答案。 – David

0

由于您正在呼叫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 

希望这帮助!

+0

公共VAR1作为字符串 子M1() VAR1 = “创先争优” 结束小组 子M2() MSGBOX VAR 结束小组 –

+0

好了,:'公共VAR1为String' - 使VAR1公共字符串,而不是'Sub M1()',使用'Public Sub M1()'因为这可以让你在另一个子类中使用变量。在你的第三个Sub中,你需要执行以下操作:'Sub M2(),调用M1,MsgBox var1,End Sub' – itChi

3

全局变量需要具有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 
3

建立在@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