我正在尝试存储一个数组值,以便在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
感谢您的帮助。
答案 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作为指向视图的指针。