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

时间:2015-01-05 10:14:59

标签: excel vba range out subscript

我遇到一个奇怪的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”进行了很好的更新(因为它也是假设,因为我的案例对象现在都没有类型)。就像子被诅咒一样。这让我发疯了。

1 个答案:

答案 0 :(得分:1)

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

  1. 参数ByVal colNb没有类型。

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

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

  4. isArrayEmpty:我想知道这个功能是做什么的。我认为它完成了它在锡上所说的内容。

  5. 以上内容并未解释您的问题,&#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