我遇到过一个严重的情况,完全让我的剧本陷入困境,如下所示:
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时,然后引发异常,并且在异常块中我获得IndexSearch
的值4
而不是0
- 为什么会这样?请告诉我!
答案 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