VBA Excel:奇数下标超出范围错误(9)

我遇到了一个奇怪的VBA下标超出范围错误在这个简单的子:

Sub writeTypes(ByVal rowNb As Long, ByVal colNb, ws As Worksheet) On Error GoTo ErrorHandler_ObjMethod Const METHOD_NAME = "writeTypes (CCase)" With ws If Not isArrayEmpty(pTypes) Then For i = LBound(pTypes) To UBound(pTypes) If pTypes(i) <> "" Then .Cells(rowNb, colNb).Value = .Cells(rowNb, colNb).Value & pTypes(i) & ";" ElseIf i = UBound(pTypes) Then .Cells(rowNb, colNb).Value = Left(.Cells(rowNb, colNb).Value, Len(.Cells(rowNb, colNb).Value) - 1) End If Next i Else: .Cells(rowNb, colNb).Value = "N/A" End If End With ErrorHandler_ObjMethod: If err.Number <> 0 Then Workbooks(AA_RESOURCES_WB).Close SaveChanges:=True MsgBox (METHOD_NAME & vbNewLine & err.Number & vbNewLine & err.description) End End If End Sub 

这个过程的调用行是: pUnassignedCases(i).writeTypes j, 7, ws (作为params传递的variables是正确的,我确定了几次)

这是我已经试过的:

– 删除参数中的“ByVal”

– 要删除第一个“如果不是”

– 删除“Elseif”块

清除过程没有任何语法/逻辑错误。

我也以任何可能的方式检查了任何使用的variables(包括“pTypes”的string数组)。 所有的事情似乎都很好。

我也尝试将这个代码直接并入到我的另一个子(通过一个For循环的CCase对象数组),而不是通过一个CCase对象过程调用它,并以某种方式对第一个CCases对象,然后强制循环超越了CCase数组的上限……我无法理解这一点。

当我逐行通过代码时,错误发生在“End sub”行。 但是,当我删除error handling它很好,但不知何故错误被传递到代码中的其他地方,而不是在任何有关这个子和完美的工作之前…然后,如果我只是删除任何调用这个子一切都像以前一样工作。

再加上即使发生错误,我的工作表行仍然很好地更新与“不适用”(因为它应该是因为我的案件对象没有types现在)。 这就像子被诅咒。 这真让我抓狂。

我注意到了一些事情:我不知道这些是否会解决您遇到的问题,但它们可能是有用的:

  1. 参数ByVal colNb没有types。

  2. 我怀疑这行ElseIf i = UBound(pTypes) Then打算剥离尾随";" 如果是这种情况,类似的代码可能最好放在for循环之外。 请考虑:数组pTypes在UBound索引位置中的值是否可以是<> "" 。 如果是这样,你可能会有一个逻辑错误。

  3. 如果单元格没有值,并且使用Len(.Cells(rowNb, colNb).Value) - 1)则在用作左函数的参数时会引发错误。 我认为这将发生在数组只包含空string时。

  4. isArrayEmpty :我想知道这个函数做什么。 我假设它是这样说的。

以上不解释你的问题,“err”小写是另一回答中所说的怪异。 如果Exit sub在error handling程序之前,则会在没有发生错误时停止正在评估的if语句。

哈维

代码演示error handling不佳。

 Sub a3(optional RaiseAnError As Boolean = true) On Error GoTo errhand If RaiseAnError Then Err.Raise 1, "", "Simulating code that might raise and error " End If MsgBox "Got to the end of your code" errhand: If Err.Number <> 0 Then MsgBox "Err.Number = " & Err.Number Err.Raise 2, "", "Simulating code ie workbook close that might raise and error " MsgBox "ok" End End If End Sub