Excel VBA全局变量

时间:2017-10-16 14:05:00

标签: excel vba excel-vba

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

我在一个模块中有一个sub,它为公共变量赋值。 我要求module1设置的值可以访问module2的值

5 个答案:

答案 0 :(得分:5)

全局变量需要具有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,而其他模块只能 {{1}通过foo属性 - 假设字段和属性在SomeFoo中定义:

Module1

答案 1 :(得分:4)

在@David的答案的基础上,这是如何使用Dim和Public及其差异(在模块中,名为import { ViewChild, AfterViewInit } from '@angular/core'; import { MatStepper } from '@angular/material'; Component({ ..... }) export class ComponentClass implements AfterViewInit { @ViewChild('stepper') stepper: MatStepper; ngAfterViewInit() { this.stepper.selectedIndex = 1; } } 编写以下内容并运行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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

' Public variable
Public a as String

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

第一个a是公开的,您可以在任意位置使用,第二个变量是本地的,您可以使用的唯一网站是函数hello()。所以这两个变量都不同。

答案 4 :(得分:0)

无法调出,因为您正在呼叫私人潜艇。

为了拥有可以公开更改的变量,请尝试在任何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

希望这有帮助!