如何在vbscript中清除数组的内容?
我在函数库中声明了一个二维数组,并将其与一个测试关联起来。在测试的操作1中,我尝试使用“擦除”语句清除数组。如何在vbscript中清除数组的内容?,vbscript,Vbscript,我在函数库中声明了一个二维数组,并将其与一个测试关联起来。在测试的操作1中,我尝试使用“擦除”语句清除数组。 我的代码- 在函数库中 Dim strVerifyAry(25,6) 在行动1中 erase strVerifyAry 错误消息 Run Error - Type mismatch: 'Erase' 如何清除此数组的内容?我不太明白为什么,但您可以创建类似 Public Sub DoErase (byRef Ary) Erase Ary End Sub 在库中,并从操作中调
我的代码-
在函数库中
Dim strVerifyAry(25,6)
在行动1中
erase strVerifyAry
错误消息
Run Error - Type mismatch: 'Erase'
如何清除此数组的内容?我不太明白为什么,但您可以创建类似
Public Sub DoErase (byRef Ary)
Erase Ary
End Sub
在库中,并从操作中调用它,如下所示:
DoErase StrVerifyAry
Sub EraseArray(ByRef arr)
For i = 0 To UBound(arr, 1)
For j = 0 To UBound(arr, 2)
If IsObject(arr(i, j)) Then
Set arr(i, j) = Nothing
Else
arr(i, j) = Empty
End If
Next
Next
End Sub
这就行了
更新:不,没有。数组被成功地传递到DoErase
,并且DoErase
调用工作正常,但是之后的测试仍然可以引用Erase
应该擦除的数组元素
如果测试声明了数组,那么它可以正常工作(Erase
擦除元素)
这很奇怪,可能和函数库中的奇怪作用域有关
如果您发现这里发生了什么,请告诉我们…在纯VBScript中对我有效,因此QTP运行VBScript代码时使用的任何引擎都很可能存在问题。对于这样的二维数组,您应该能够模拟
Erase
的行为:
DoErase StrVerifyAry
Sub EraseArray(ByRef arr)
For i = 0 To UBound(arr, 1)
For j = 0 To UBound(arr, 2)
If IsObject(arr(i, j)) Then
Set arr(i, j) = Nothing
Else
arr(i, j) = Empty
End If
Next
Next
End Sub
或者像这样,如果您不想将包含对象的字段设置为Nothing
:
Sub EraseArray(ByRef arr)
For i = 0 To UBound(arr, 1)
For j = 0 To UBound(arr, 2)
arr(i, j) = Empty
Next
Next
End Sub
这让我整个下午都发疯了,所以我想发布一个答案供将来参考。我使用Split命令填充了一个数组,然后需要在脚本再次通过该过程循环之前擦除它。我尝试的任何操作都不会擦除或清除该数组,并且下一次使用的Split只会附加到前面的数组元素中。
通过尝试上面的“array=Nothing”循环,我最终成功地生成了一个我研究过的“thisarrayisfixed或locked”错误。事实证明,我在“For Each..Next”循环中使用了该数组,该循环锁定了该数组,因此它不能被擦除或清除。更多信息可用我知道这是一种逃避。。。不要投我的票 在某些情况下,可以使用字典集合而不是数组。然后在需要清除时使用
RemoveAll
。当您的数组是由split函数或其他函数创建时,这并没有帮助,但在其他用例中它可以帮助您
Set myDict = CreateObject("Scripting.Dictionary")
...
myDict.RemoveAll
请参阅:+1以了解其可复制性,但显然不容易解释。我有一个类似的问题,作为解决方法,将数组设置为零,就像它是一个
int
。i、 e.strerveryAry=0
,然后在我再次需要它时将其重置为数组。QTP使用“真实”MS引擎。然而,我们在别处看到的这些和其他一些奇怪的症状指向了一个方向,即库的全局作用域在某些方面与测试脚本的全局作用域完全分离(GetRef结果并不总是可用的)。我在函数库中创建了一个子函数,没有参数,因为数组是在函数库本身中声明的。而且效果很好。但我仍然不明白为什么从测试中删除时它不起作用。