VBA Do While循环操作数组报Subscript Out of Range,如何到UBound时自动退出?
解法1:增加边界判断,避免越界访问
由于VBScript的逻辑运算符不支持短路执行,我们可以把边界判断放在循环最前部,命中条件就直接退出,完全避免越界访问:
arrNo = 0 ' 注意:Split函数返回数组默认从0开始索引,如果你刻意设置了Option Base 1或者要跳过首个元素,可以保留原值1 strScreenList = PbWindow("w_genapp_frame").PbWindow("Application Enquiry Menu").PbList("lb_list").GetContent arrScreen = Split(strScreenList, VbLf, -1, 1) Do While True ' 优先判断索引是否超出数组上界,超出直接退出循环 If arrNo > UBound(arrScreen) Then Exit Do ' 再判断当前元素是否为空,为空退出循环,和原有逻辑一致 If arrScreen(arrNo) = "" Then Exit Do PbWindow("w_genapp_frame").PbWindow("Application Enquiry Menu").PbList("lb_list").Activate arrScreen(arrNo) strScreenName = arrScreen(arrNo) sf_EnquireScreens(strScreenName) arrNo = arrNo + 1 Loop
UBound(arrScreen)会自动适配数组的起始索引,不管你用的是0起始还是1起始的数组,都能正确拿到最大合法索引值,不需要手动硬编码数字。- 你之前遇到的报错就是因为没有提前判断边界,索引超出最大值后依然尝试访问数组元素导致的。
解法2:改用For Each循环遍历(更省心)
如果不需要手动维护索引计数,直接用For Each遍历数组是更稳妥的写法,完全不需要处理边界问题:
strScreenList = PbWindow("w_genapp_frame").PbWindow("Application Enquiry Menu").PbList("lb_list").GetContent arrScreen = Split(strScreenList, VbLf, -1, 1) For Each screenItem In arrScreen ' 遇到空值直接退出,和原有逻辑一致 If screenItem = "" Then Exit For PbWindow("w_genapp_frame").PbWindow("Application Enquiry Menu").PbList("lb_list").Activate screenItem sf_EnquireScreens(screenItem) Next
这个写法不需要声明和维护索引变量,也完全不会出现下标越界的问题。
内容的提问来源于stack exchange,提问作者Jeavo
相关产品推荐
相关产品推荐

