VBA函数和变量

问题描述:

我有一个关于VBA中的变量和函数的问题。我不打算包括项目的确切内容,希望最初的问题不会变得模糊。如果有要求,我可以解释这个项目将被使用。VBA函数和变量

是否可以在VBA中创建通用变量以便所有函数都可以使用它们?

例:

Dim testVariable As String 
Dim newVariable As String 

testVariable = "A" 

Function testFunction() As String 
    .... 
    newVariable = testVariable 
End Function 

截至目前,testVariable(当它在功能)是 “空”

谢谢

杰西Smothermon

是任何代码之前,但价值分配必须在过程中发生:

Public testVariable As String 
Public newVariable As String 

Sub SetTestVariable() 
    testVariable = "A" 
End Sub 

Function testFunction() As String 
    .... 
    newVariable = testVariable 
End Function 

请记住,这是普遍不好编程实践中使用了很多全局变量。你想限制变量的范围到它们将被使用的地方。有关范围在VBA更多信息,请参阅此Microsoft知识库文章:Scope of variables in Visual Basic for Applications

+0

谢谢你的回答,它的工作很完美。事实证明,我确实有许多变量需要用于许多不同的功能以及主要的Sub。我觉得Private可以解决这个问题,所以它只是模块级别。你对我应该使用什么类型的任务有任何建议吗?现在我有十个变量需要是全球性的,而且有很高的潜力,会增加更多的变量。再次感谢 – 2011-03-07 22:41:41

+2

@Jesse Smothermon - 一门课将是一个合理的选择。另外,可以将变量的初始化封装到类本身中。 – Thomas 2011-03-07 22:50:53

+0

正如@Thomas所说。 – mwolfe02 2011-03-08 00:14:13

离开变量出于任何子/功能,所以它们变成全局变量

然后,调用初始化函数运行包含默认设置,如代码

Sub InitGlobalVars 
    testVariable = "A" 
End Sub 

Sub MyProjectMain 
    InitGlobalVars 
    .... 
    ... rest of code 
End Sub 

非常简单的例子:

Dim testVariable As String 
Dim newVariable As String 

Sub setVariable(ByVal x as string) 
    testVariable = x 
End Sub 

Function testFunction() As String 
    testFunction = testVariable 
End Function 

Sub test() 
    Call setVariable("A") 
    MsgBox testFunction() 
    Call setVariable("B") 
    MsgBox testFunction() 
End Sub 

正如在其他帖子中提到:全局是一个不好的做法,和值有内部子被分配/功能。它们也应该在模块的开头定义。

是否可以在VBA中创建通用变量,以便所有函数都可以使用它们?

是的,虽然你需要通过mwolf02规定申报范围。 不过,你不能在VBA中做的事情是用VBScript在函数或过程之外调用它们。另外,如果您确实需要全局变量,则应该派生一个命名方案,将全局变量与本地声明变量区分开来(例如,以g_为前缀)。你可以得到这样的混乱场景:

Public testVariable as String 

Public Sub Main() 
    Call Foo() 
    Call Bar() 
End Sub 

Public Sub Foo() 
    testVariable = "Foo" 
End Sub 

Public Sub Bar() 
    Dim testVariable As String 
    testVariable = "Bar" 
End Sub 

testVariable的价值将是“富”,即使Bar后来叫。实际上,从Bar内部无法引用全局变量testVariable,因为它声明了一个具有相同名称的局部变量。

+0

带前缀想法的令人敬畏的点....对我来说不会发生,您将无法在稍后更改该变量。谢谢 – 2011-03-07 22:51:13

+0

这指出了另一个不好的做法,即VB语言家族让你绊倒自己 - 本地声明的变量不*必须具有与范围更广的可变变量相对应的唯一名称。范围较窄的变量只是“站在”更广泛的范围之前。 – RolandTumble 2011-03-10 00:43:41

或者,您可以使用全局常量而不是变量

Public Const TESTVARIABLE = "A" 

我相信它更适合您的问题,而不是在特定函数中设置值。

Obs1 .:全局常量(通常)以大写字母存储。

Obs2 .:您不能在工作表代码中设置一个全局常量。使用特定的模块(例如global.bas)来执行此操作。

Rgds