我遇到一个奇怪的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
(作为参数传递的变量是正确的,我已多次确认)
以下是我已经尝试过的事情:
- 删除参数
中的“ByVal”- 删除第一个“If Not”
- 删除“Elseif”块
删除操作正确完成,没有任何语法/逻辑错误。
我还以任何可能的方式检查了所有使用过的变量(包括“pTypes”的字符串数组)。一切似乎都很好。
我还尝试将此代码直接合并到我的其他子(通过带有For循环的CCase对象数组)而不是通过CCase对象过程调用它,并且不知何故它适用于第一个CCases对象然后强制循环超出CCase数组的上限......我无法理解这一点。
当我逐行浏览代码时,错误发生在“End sub”行。但是,当我删除错误处理它很好,但不知何故错误传递到代码中的其他地方,无论如何与此子相关并且之前工作正常...然后,如果我只是删除任何调用此子一切都按原样运作。
另外,即使发生错误,我的工作表行仍然使用“N / A”进行了很好的更新(因为它也是假设,因为我的案例对象现在都没有类型)。就像子被诅咒一样。这让我发疯了。
答案 0 :(得分:1)
我注意到的一些事情: 我不知道这些是否会解决您遇到的问题,但它们可能会有用:
参数ByVal colNb
没有类型。
我怀疑行ElseIf i = UBound(pTypes) Then
旨在剥离尾随";"
如果是这种情况,类似的代码可能最好放在for循环之外。
考虑一下:数组pTypes
是否可以在UBound索引位置具有<> ""
的值。如果是这样,您可能会出现逻辑错误。
如果单元格没有值且使用Len(.Cells(rowNb, colNb).Value) - 1)
,则在用作左侧函数的参数时会引发错误。我认为当数组只包含空字符串时会发生这种情况。
isArrayEmpty
:我想知道这个功能是做什么的。我认为它完成了它在锡上所说的内容。
以上内容并未解释您的问题,&#34;错误&#34;如另一个答案所述,小写是奇怪的。如果Exit sub
在错误处理程序之前,它将在没有错误发生时停止评估if语句。
哈维
代码表明错误处理不佳。
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