在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%的全局變量可以通過參數完成。 –