2012-01-31 61 views
2

我試圖存儲一個數組值,以便在Sub被多次調用時可以重用。 如果存在值,我想阻止將值重新賦值給數組。如何在VBScript中聲明全局數組

我的代碼是這樣的。

Dim views() 

Sub runit() 
    For i=0 To 3 
     test() 
    Next  
End Sub 

Sub test() 
     ReDim Preserve views(0)= "test" 

     ' - other codes that I want to run- 
End Sub 

我得到「類型不匹配:'chosenviews'」錯誤。

如果我在「Sub test」裏面移動「Dim views()」,我不會收到錯誤。 如何在VBScript中聲明全局數組? 如果這是不可能的,是否有任何方法來防止調用Sub時重新分配數組?

以下代碼不起作用,但您可能會明白我正在嘗試做什麼。

Dim views() 

    Sub runit() 
     For i=0 To 3 
      test() 
     Next  
    End Sub 

    Function IsArrayDimmed(arr) 
     IsArrayDimmed = False 
     If IsArray(arr) Then 
     On Error Resume Next 
     Dim ub : ub = UBound(arr) 
     If (Err.Number = 0) And (ub >= 0) Then IsArrayDimmed = True 
     End If 
    End Function 


    Sub test() 
     If IsArrayDimmed(views) Then 

     Else 
      ReDim Preserve views(0)= "test" 

     End If 
       ' - other codes that I want to run- 
    End Sub 

謝謝你的幫助。

回答

5

如果我理解正確,看起來好像要聲明一個全局數組變量,然後將項添加到該數組中,而不限於靜態數量的元素。換句話說,您需要通過重新分配來動態增加數組的大小。

全局聲明是正確的,屬於的地方你知道了:

Dim views() 

你寫在這裏是不正確的語法,你不能在同一時間:

ReDim Preserve views(0)= "test" 
分配一個值,使用ReDim什麼

此外,這將ReDim數組大小0,這是你想要的相反。

如果你希望「推」該數組中的值,你應該使用這樣的函數,其處理REDIM增加值到數組的尾部之前增加數組的大小:

Function Push(ByRef arrTarget, ByVal varValue) 
    Dim intCounter 
    Dim intElementCount 

    ReDim Preserve arrTarget(UBound(arrTarget) + 1) 

    If (isObject(varValue)) Then 
     Set arrTarget(UBound(arrTarget)) = varValue 
    Else 
     arrTarget(UBound(arrTarget)) = varValue 
    End If 

    Push = arrTarget 
End Function 

使用方法如下:

Call Push(views,"test") 
0

任何變量在全球範圍內實例化將是一個「全局」變量。但是,如果您希望在原始範圍內保留任何更改,則應該「通過引用」將該變量顯式傳遞給其他範圍。您可以使用Function或Sub聲明中的ByRef keword來完成此操作。

Sub test(ByRef viewsArray) 

現在測試中您將引用viewsArray充當指針的意見。