我正在使用一些处理一些毛茸茸的EDI的传统意大利面条代码。大多数代码都是难以理解的,并且没有缩进或注释,甚至没有好的变量名称,但是当我删除导致脚本始终超时的On Error Resume Next
语句时,有一行会给我带来麻烦。
If UBound(arylin) >= 1 Then
Do Until arylin(0) = "PB" and arylin(1) = "DEF"
' Processing goes here - not relevant for this
Loop
End If
脚本在“Do Until”行执行条件但错误,说:
Microsoft VBScript runtime error '800a0009' Subscript out of range: '[number: 0]'
现在,如果我在检查它之前测试上限,那么为什么地球上会出现错误,并且它说上限至少为1?
如果必须的话,我可以发布更多的代码,但我不愿意,因为我的前任是一个完整的黑客,代码非常难看。
答案 0 :(得分:3)
参见AnthonyWJones评论)
(使用VB,你可以设置数组的基数从0或1开始 - 它应该在模块的顶部或附近:寻找Option Base 1或者选项基础0。)
LBound将始终返回0. (您也可以使用LBound()来检查数组的下边界。)
(只是去表明:不要指望MS一致!)
虽然您检查数组大小是否> = 1 - 这将确保arylin(0)有效,但不一定是arylin(1)。索引是从零开始的,所以如果一个元素存在,它将在index = 0,而index = 1将超出范围。
在这种情况下,您必须检查数组大小> = 2。如果一致地使用两个条目,则必须对(array-size)mod 2 = 0进行检查。
还要确保UBound实际返回的值。我用Google搜索并得到了相反的信息:this表示它会返回'count'而this one表示它返回物理限制(='count'-1)。
关于'On Error Resume Next'事项,maybe it should stay there ...
答案 1 :(得分:3)
UBound()
返回数组中最后一个元素的索引。默认情况下,vb.net之前的vb语言中的数组从1开始而不是0(意味着计数和索引通常是相同的,尽管您可以使用Option Base
更改默认值。)
把它们放在一起,你会发现它在这里失败了:
arylin(0) = "PB"