2012-01-31 65 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充当指针的意见。