如何在VBScript中声明全局数组

时间:2012-01-31 23:24:33

标签: vbscript

我正在尝试存储一个数组值,以便在Sub被多次调用时可以重用。 如果值存在,我想阻止将值重新分配给数组。

我的代码是这样的。

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

我收到“类型不匹配:'chooseviews'”错误。

如果我在“子测试”中移动“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

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

如果我理解正确,似乎你想要声明一个全局数组变量,然后将项添加到该数组,而不限于静态数量的元素。换句话说,您需要通过重新分配来动态增加数组的大小。

全球声明是正确的,属于你所拥有的地方:

Dim views()

你在这里写的是不正确的语法,你不能同时指定一个值和ReDim:

ReDim Preserve views(0)= "test"

此外,这会将数组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")

答案 1 :(得分:0)

在全局范围中实例化的任何变量都将是“全局”变量。但是,如果要在原始范围中保留任何更改,则应将该变量显式传递到“通过引用”的其他范围。您可以使用函数或子声明中的ByRef关键字来执行此操作。

Sub test(ByRef viewsArray)

现在,在测试中,您将引用viewsArray作为指向视图的指针。