2017-10-16 80 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