【问题标题】:VBA Excel : Odd subscript out of range error (9)VBA Excel:奇数下标超出范围错误(9)
【发布时间】: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


【解决方案1】:

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

  1. 参数ByVal colNb没有类型。

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

  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

【讨论】:

  • 感谢您的回复。对于您的第 1 点:我已经纠正了它,它没有解决任何问题:( 第 2 点:您的怀疑是正确的 =)。其实你是对的,我有一个逻辑错误,我会纠正它,谢谢。否 3:我试图删除这段代码,因为它只是为了美观,但错误仍然存​​在。否 4:是的,它运作良好,我在其他地方使用它没有任何失败:)
  • @Jokas 您是否尝试添加退出子?您是否调查过小写的“错误”?如果数组包含的所有内容都是 "" ,isArrayEmpty 是否认为数组为空?为什么错误会在 end sub 上引发?我怀疑如果将无类型的 RyRef 参数更改为返回到的类型变量的无效值,会发生这种情况?你可能经历过这种情况?
  • 好的问题解决了我必须在调用我的“writeTypes”子的那个之后的几个子中添加“退出子”...我不知道为什么调用这个子强制我要添加那些“退出子”,我以前从未这样做过!你有想法吗 ?我想明白。无论如何,非常感谢你和克里斯:D
  • 我认为 err.number 不为零,因为 err 不是 Err 对象。什么是错误?添加Debug.Print TypeName(Err)
  • @Jojas。我有点卡住了。但是不使用退出功能是非常狡猾的。在您的代码中,如果工作簿关闭失败怎么办?它将引发和未处理的错误。例如,请参阅上面我的代码中的 Sub a3:
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多