繁体   English   中英

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”

-删除第一个“如果不是”

-删除“ Elseif”块

删除操作正确完成,没有任何语法/逻辑错误。

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

我还尝试将此代码直接合并到我的其他子代码中(该代码通过带有For循环的CCase对象数组),而不是通过CCase对象过程调用它,并且它以某种方式适用于第一个CCases对象,然后强制循环超越CCase数组的上限...我对此毫无意义。

当我逐行浏览代码时,错误发生在“ End sub”行。 但是,当我删除错误处理后,它可以正常运行,但是以某种方式,错误会传递到与该子程序无关的代码中的其他地方,并且在此之前运行良好……然后,如果我简单地删除了对该子程序的任何调用一切都按原样进行。

另外,即使发生错误,我的工作表行也仍然可以很好地更新为“ N / A”(这也可以推测是因为我的case对象现在都没有类型)。 这就像是被诅咒的潜艇。 这真让我抓狂。

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

  1. 参数ByVal colNb没有类型。

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

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM