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

VBA Excel : Odd subscript out of range error (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 (作为参数传递的变量是正确的我确认了好几次)

这是我已经尝试过的:

-去掉参数"ByVal"中的

-去掉第一个"If Not"

-删除"Elseif"块

删除操作正确,没有任何 syntax/logic 错误。

我还以任何可能的方式检查了所有使用的变量(包括 "pTypes" 的字符串数组)。一切似乎都很好。

我还尝试将这段代码直接合并到我的另一个子程序中(它通过一个 For 循环遍历 CCase 对象数组)而不是通过 CCase 对象过程调用它,不知何故它适用于第一个 CCases 对象然后强制循环超出 CCase 数组上限...我无法理解这一点。

当我逐行查看代码时,错误发生在 "End sub" 行。但是,当我删除错误处理时,它会正常运行,但错误会以某种方式传递到代码中的其他地方,而该代码无论如何都与该 sub 无关,并且之前工作正常……然后,如果我只是删除对该 sub 的任何调用一切正常。

此外,即使发生错误,我的工作表行仍然使用 "N/A" 进行了很好的更新(这也是应该的,因为我的案例对象目前都没有类型)。就像潜艇被诅咒了一样。这让我发疯。

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

  1. 参数 ByVal colNb 没有类型。

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

  3. 如果单元格没有值并且使用了 Len(.Cells(rowNb, colNb).Value) - 1),当用作左函数的参数时会引发错误。我认为当数组只包含空字符串时会发生这种情况。

  4. isArrayEmpty:我想知道这个函数是做什么的。我假设它按照锡盒上的说明进行操作。

以上没有解释您的问题,"err" 小写很奇怪,如另一个答案中所述。如果 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