Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA在启用错误处理程序后仍会中断_Vba_Excel - Fatal编程技术网

Excel VBA在启用错误处理程序后仍会中断

Excel VBA在启用错误处理程序后仍会中断,vba,excel,Vba,Excel,我有一段非常简单的代码,它循环遍历一列数据并向集合中添加唯一的值 它是VBA,所以当然Collection缺少Exists函数(谁会想要它?),我宁愿避免对列中的每个单元格重复整个集合,我决定采用错误处理方法-尝试从集合中检索项,捕获不存在的错误并添加: 'Trucated the code slightly, I know I should be checking the actual error code, but omitted that for brevity Dim r As Ran

我有一段非常简单的代码,它循环遍历一列数据并向集合中添加唯一的值

它是VBA,所以当然
Collection
缺少
Exists
函数(谁会想要它?),我宁愿避免对列中的每个单元格重复整个集合,我决定采用错误处理方法-尝试从集合中检索项,捕获不存在的错误并添加:

'Trucated the code slightly, I know I should be checking the actual error code, but omitted that for brevity

Dim r As Range
Set r = MySheet.Range("B2") 'First cell in column

Dim uniqueValues As New Collection
Do While r.Value <> ""
    On Error GoTo ItemExists
    'If r.Value doesn't exist in the collection, throws an error
    uniqueValues.Add(Item:=r.Value, Key:=r.Value) 
ItemExists:
    r.Offset(1)
Loop
”稍微解释了一下代码,我知道我应该检查实际的错误代码,但为了简洁起见省略了它
调光范围
设置r=MySheet.Range(“B2”)列中的第一个单元格
将唯一值设置为新集合
当r.值“”时执行此操作
出现错误时,转到项目已存在
'如果集合中不存在r.Value,则抛出错误
uniqueValues.Add(项:=r.Value,键:=r.Value)
项目存在:
r、 偏移量(1)
环
问题出在哪里?Excel似乎完全忽略了出错时的
行,破坏了代码并抛出了
继续
/
结束
/
调试
对话框

我已经检查了VBA中的选项,它被正确设置为
未处理错误时中断。


知道为什么会发生这种情况吗?

您可以在下一步的错误恢复中使用,但最好将错误处理封装在它自己的子或函数中。例如,类似于:

Private Sub AddIfNotPresent(Coll As Collection, Value As Variant, Key As Variant)
    On Error Resume Next
    Coll.Add Item:=Value, Key:=Key
End Sub
您可以按如下方式使用:

Do While r.Value <> ""
    AddIfNotPresent uniqueValues, r.Value, r.Value
    r = r.Offset(1)
Loop

接下来可以使用On Error Resume,但最好将错误处理封装在它自己的子或函数中。例如,类似于:

Private Sub AddIfNotPresent(Coll As Collection, Value As Variant, Key As Variant)
    On Error Resume Next
    Coll.Add Item:=Value, Key:=Key
End Sub
您可以按如下方式使用:

Do While r.Value <> ""
    AddIfNotPresent uniqueValues, r.Value, r.Value
    r = r.Offset(1)
Loop

改用ArrayList,它有一个.Contains方法和其他方便的方法,比如.Sort方法

With CreateObject("System.Collections.ArrayList")

    .Add "Item 1"
    .Add "Item 2"

If .Contains "Item 1" Then Msgbox "Found Item 1"
If .Contains "Item 3" Then Msgbox "Found Item 3"


End With

还有一些示例使用ArrayList,它有一个.Contains方法和其他方便的方法,比如.Sort方法

With CreateObject("System.Collections.ArrayList")

    .Add "Item 1"
    .Add "Item 2"

If .Contains "Item 1" Then Msgbox "Found Item 1"
If .Contains "Item 3" Then Msgbox "Found Item 3"


End With

更多示例

使用
词典
而不是
收藏
在哪里可以找到词典?它似乎不是标准库的一部分。添加对您可能感兴趣的
Microsoft脚本运行时
CreateObject(“Scirpting.Dictionary”)
的引用。整个项目现在可以在上找到。(哦,请不要在错误恢复下一步时使用
,除非您真正了解它的作用。)@bp_uu在这种情况下,OERN绝对没有问题。它可能经常被误用,但这并不意味着没有地方放它!;)使用
词典
而不是
收藏
在哪里可以找到词典?它似乎不是标准库的一部分。添加对您可能感兴趣的
Microsoft脚本运行时
CreateObject(“Scirpting.Dictionary”)
的引用。整个项目现在可以在上找到。(哦,请不要在错误恢复下一步时使用
,除非您真正了解它的作用。)@bp_uu在这种情况下,OERN绝对没有问题。它可能经常被误用,但这并不意味着没有地方放它!;)虽然我讨厌在错误处理程序中推广使用
On Error Resume Next
,但这个答案是正确的,因为OP没有
Resume
。为了给未来的谷歌用户提供更多的信息,我很难为这一点投票;我最喜欢的错误处理来源之一:这或多或少就是我最后所做的(尽管后来改为@vba4all建议使用字典来避免错误处理)。干杯~尽管我讨厌在错误处理程序下一步恢复时推广使用
这个答案是正确的,因为OP没有在错误处理程序中恢复
。为了给未来的谷歌用户提供更多的信息,我很难为这一点投票;我最喜欢的错误处理来源之一:这或多或少就是我最后所做的(尽管后来改为@vba4all建议使用字典来避免错误处理)。干杯~