0

我遇到的一个严重的场景,完全让我的脚本有问题,如下所示:

On Error Resume Next

For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 Step 4

    If ArrayListTaskDetails(IndexSearch + 5) <> "" Then

        ArrayListTaskDetails(IndexSearch + 2) = ArrayListTaskDetails(IndexSearch + 5)

    'Else

        'ArrayListTaskDetails(IndexSearch + 2) = DicForProcessEndDate.Item(ob9.Cells(RowCount,1))

    End If 

Next

If Err Then

    Err.Clear
    MsgBox(IndexSearch) '4
    ArrayListTaskDetails(IndexSearch + 2) = DicForProcessEndDate.Item(ob9.Cells(RowCount,1))
    MsgBox(ob9.Cells(RowCount,1)) '47166954
    MsgBox(DicForProcessEndDate.Item(47166954)) ' here i am getting its value
    MsgBox(DicForProcessEndDate.Item(ob9.Cells(RowCount,1))) ' here i didn't see any value for the key ob9.Cells(RowCount,1). Even "47166954" and ob9.Cells(RowCount,1) are same

End If

On Error GoTo 0

你能帮我理解问题是什么吗?如果这确实是一个问题,并通过更改此处的方法来帮助我解决它。

编辑

Array out of range从该行发生错误时,If ArrayListTaskDetails(IndexSearch + 5) <> ""控制转到错误处理部分,这很完美,但IndexSearch计数增加了4. 可以说当IndexSearch= 0 时,然后引发异常,并且在 Exception 块中我得到了IndexSearch价值,而4不是,0- 为什么会这样?请告诉我!

4

1 回答 1

1

很可能ob9.Cells(RowCount,1)正在返回一个字符串值。

当您尝试时,MsgBox(DicForProcessEndDate.Item(47166954))您已经为传递给的键硬编码了一个数值DicForProcessEndDate

Dictionary 对象的 key 属性将47166954"47166954"视为不同的值。这是有道理的,因为一个是数字,另一个是字符串。

为避免您的问题,您可以通过将密钥包装在Clng()中来将其转换为数值。像这样:

MsgBox(DicForProcessEndDate.Item(clng(ob9.Cells(RowCount,1))))

或者,如果您想使用字符串值,您可以使用Cstr()


编辑:针对您的第二个问题:

你在做一个无效的假设。VBScript 错误捕获与 Excel VBA 的工作方式不同。具体来说,您不能执行类似On Error goto ErrorCorrection.

由于该行On Error Resume Next,无论是否发生错误,您的 for 循环都将继续。

如果您想停止 for 循环,就像您暗示的那样,您需要将您的逻辑更新为如下内容:

For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 Step 4
    If ArrayListTaskDetails(IndexSearch + 5) <> "" Then
        'Check to see if proceeding line caused an error
        If err then
            'Clear the error
            err.clear
            'Exit the loop
            exit for
于 2012-12-28T15:50:05.447 回答