'对于下一个'循环重置计数器在达到'ubound'之前导致无限循环…可能的名称/参考冲突?

我正在开发一个数千行的程序,收集/生成一堆数据文件,所有格式都不相同,然后收集(制表)一部分数据并进行一些分析。

该计划几星期前工作正常。 现在,尽pipe没有触及它,但是连续两次的testing运行和两个逐步debugging会话已经无限地降落到了i = lbound(…)到ubound(…)…. next i循环中。 相关代码转载如下。

显示的函数只是简单地通过二维数组(通过将范围赋值给一个变体创build)循环到类似于一维数组的string中。 导致错误的范围是238×33。 然而,“行”索引“我”达到44,然后重置为0,而不是增加到45及以上。 而且,当发生这种情况时,被反对的string从“* example *”跳转到“** example **”,每当“i”计数器重置为0时,星号的数量逐渐增加。

我最好的猜测是有一些名称/参考冲突。 但是,为什么现在才出现,并且说出来,似乎有点超出我的意思。

function定义:

Function arrayFirstLike(ByRef dataArr As Variant, ByVal fieldArr As Variant, _ Optional ByVal byRows As Boolean = True, Optional ByVal exactSearch As Boolean = False) As Variant 

呼叫线路:

 Set infowb = addSaveTemplate(rootPath & templatesPath & "\yFcstIndexInfo", rootPath & countryInfoPath & "\matureMarketFcst") Set datawb = Workbooks.Open(rootPath & countryPath & "\spdjFcst", updateLinks:=False, ReadOnly:=True) dataArr = datawb.Worksheets("ESTIMATES&PEs").UsedRange.Value Call closeNoAlerts(datawb) fieldArr = Array("Data as of the close of", "S&P 500 5YR") fieldArr2 = arrayFirstLike(dataArr, fieldArr) 'returns 2x3 zero base array of variants 

函数体(请注意,这是一个在程序中其他地方成功调用的实用程序函数:所以,在嵌套循环开始之前,函数参数被重构):

 Dim i As Long, j As Long, k As Long, fieldsFound As Long Dim tempArr() As Variant If Not IsArray(fieldArr) Then 'fieldArr is a single string fieldArr = Array(fieldArr) Else On Error GoTo skipRedim i = LBound(fieldArr, 2) On Error GoTo 0 ReDim tempArr(LBound(fieldArr, 1) To UBound(fieldArr, 1)) As Variant For i = LBound(tempArr, 1) To UBound(tempArr, 1) tempArr(i) = fieldArr(i, LBound(fieldArr, 2)) Next i fieldArr = tempArr afterRedim: End If If Not exactSearch Then For i = LBound(fieldArr, 1) To UBound(fieldArr, 1) fieldArr(i) = "*" & fieldArr(i) & "*" Next i End If ReDim tempArr(LBound(fieldArr, 1) To UBound(fieldArr, 1), 0 To 2) As Variant fieldsFound = 0 If byRows Then For i = LBound(dataArr, 1) To UBound(dataArr, 1) 'rows For j = LBound(dataArr, 2) To UBound(dataArr, 2) 'cols For k = LBound(fieldArr, 1) To UBound(fieldArr, 1) 'searchlist If tempArr(k, 0) = Empty Then 'check for nonoccurance If dataArr(i, j) Like fieldArr(k) Then 'k,1: seach string tempArr(k, 0) = dataArr(i, j): tempArr(k, 1) = i: tempArr(k, 2) = j fieldsFound = fieldsFound + 1 Exit For End If End If Next k If fieldsFound = UBound(fieldArr, 1) - LBound(fieldArr, 1) + 1 Then Exit For Next j If fieldsFound = UBound(fieldArr, 1) - LBound(fieldArr, 1) + 1 Then Exit For Next i Else For j = LBound(dataArr, 2) To UBound(dataArr, 2) 'cols For i = LBound(dataArr, 1) To UBound(dataArr, 1) 'rows For k = LBound(fieldArr, 1) To UBound(fieldArr, 1) If tempArr(k, 1) = Empty Then 'check first occurance If dataArr(i, j) Like fieldArr(k) Then 'k,1: seach string tempArr(k, 0) = dataArr(i, j): tempArr(k, 1) = i: tempArr(k, 2) = j fieldsFound = fieldsFound + 1 Exit For End If End If Next k If fieldsFound = UBound(fieldArr, 1) - LBound(fieldArr, 1) + 1 Then Exit For Next i If fieldsFound = UBound(fieldArr, 1) - LBound(fieldArr, 1) + 1 Then Exit For Next j End If arrayFirstLike = tempArr Exit Function skipRedim: Resume afterRedim 

那这个呢:

 On Error GoTo skipRedim i = LBound(fieldArr, 2) On Error GoTo 0 

如果出现错误,请跳到afterRedim:所以请勿执行On Error GoTo 0 。 这意味着任何后来的错误将使用相同的error handling程序,并很容易导致您描述的行为。 我会尽力先做。

编辑:你可以创build一个函数来检查数组的维度 – 请参阅这里的答案中的示例VBA检查数组是否是一维的