我们可以在Dictionary Item()方法中放置一个函数吗?

时间:2012-12-28 14:48:39

标签: excel-vba vbscript vba excel

我遇到过一个严重的情况,完全让我的剧本陷入困境,如下所示:

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 rangeIf ArrayListTaskDetails(IndexSearch + 5) <> ""发生错误,则控件转到错误处理部分,这是完美的,但IndexSearch计数增加了4。让我们说当IndexSearch = 0时,然后引发异常,并且在异常块中我获得IndexSearch的值4而不是0 - 为什么会这样?请告诉我!

1 个答案:

答案 0 :(得分:1)

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

当您尝试MsgBox(DicForProcessEndDate.Item(47166954))时,您已为传递给DicForProcessEndDate的密钥编码了一个数字值。

Dictionary对象的键属性将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