2011-03-07 65 views
3

我有一個關於VBA中的變量和函數的問題。我不打算包括項目的確切內容,希望最初的問題不會變得模糊。如果有要求,我可以解釋這個項目將被使用。VBA函數和變量

是否可以在VBA中創建通用變量以便所有函數都可以使用它們?

例:

Dim testVariable As String 
Dim newVariable As String 

testVariable = "A" 

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

截至目前,testVariable(當它在功能)是 「空」

謝謝

傑西Smothermon

回答

3

是任何代碼之前,但價值分配必須在過程中發生:

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

1

離開變量出於任何子/功能,所以它們變成全局變量

然後,調用初始化函數運行包含默認設置,如代碼

Sub InitGlobalVars 
    testVariable = "A" 
End Sub 

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

非常簡單的例子:

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 

正如在其他帖子中提到:全局是一個不好的做法,和值有內部子被分配/功能。它們也應該在模塊的開頭定義。

2

是否可以在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

0

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

Public Const TESTVARIABLE = "A" 

我相信它更適合您的問題,而不是在特定函數中設置值。

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

Obs2 .:您不能在工作表代碼中設置一個全局常量。使用特定的模塊(例如global.bas)來執行此操作。

Rgds