【发布时间】:2015-03-02 20:43:10
【问题描述】:
我在这个简单的 sub 中遇到了一个奇怪的 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”(因为它也是如此,因为我的案例对象目前都没有类型)。就像潜艇被诅咒了一样。这让我发疯了。
【问题讨论】:
-
我忘记在参数中定义“As Long”colNb,但我添加了它,它并没有改变任何东西。我还尝试将 rowNb 和 colNb 设置为整数。
标签: excel vba range out subscript