VBA:Err.Clear,Resume,Resume Next不要阻止On Error GoTo从只执行一次

因此,在“On Error GoTo once once”下出现了几个SO问题和Google结果,几乎每种情况下,推荐的解决scheme是添加Err.ClearResume某个论坛来清除错误。 VBA错误只能一次处理一次,所以需要清除。

执行这些,正如你可能已经猜到的,我遇到了这个问题的On Error GoTo只执行一次,我不明白为什么。

下面是我的循环。 我确实在顶部留下了一些代码,因为它有相当多的代码,并且不相关。 大多数用户提示和数组。 为了解释发生了什么, conos()是一个包含特定列值的数组。 根据文件名的一部分,它search数组中的代码,以获得其对应于该行的索引。

如果没有Match则触发该错误。 这只是说有一个文件,但没有联系发送给。 它应该跳到NoContact并创build这些文件的列表。

所以我的文件,第一个有一个联系人,并生成电子邮件,第二个不跳转到NoContact并将文件添加到列表。 另外五个与联系人运行,然后到另一个应该去NoContact ,但Unable to get the Match property of the WorksheetFunction class出现。

这似乎没有得到清除第一个错误。 不知道为什么。

 For Each objFile In objFolder.Files wbName = objFile.Name ' Get the cono along with handling for different extensions wbName = Replace(wbName, ".xlsx", "") wbName = Replace(wbName, ".xlsm", "") wbName = Replace(wbName, ".xls", "") ' Split to get just the cono fileName() = Split(wbName, "_") cono = fileName(2) ' Create the cell look up c = Cells(1, WorksheetFunction.Match("Cono", cols(), 0)).Column ' ******************** ISSUE IS HERE *************************** On Error GoTo NoContact r = Cells(WorksheetFunction.Match(cono, conos(), 0), c).Row Cells(r, c).Select ' Fill the variables email = Cells(r, c).Offset(0, 1).Value firstName = Cells(r, c).Offset(0, 3).Value lastName = Cells(r, c).Offset(0, 4).Value account = Cells(r, c).Offset(0, -2).Value username = Cells(r, c).Offset(0, 6).Value password = Cells(r, c).Offset(0, 7).Value fPassword = Cells(r, c).Offset(0, 8).Value ' Mark as completed Cells(r, c).Offset(0, 9).Value = "X" ' Set the object variables Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) ' Body of the email str = "Hi " & firstName & "," & vbNewLine & vbNewLine & _ "This is line 1" & vbNewLine & _ "This is line 2" & vbNewLine & _ "This is line 3" & vbNewLine & _ "This is line 4" ' Parameters of the email On Error Resume Next With OutMail .To = email .CC = "" .BCC = "" .Subject = "This is the Subject line" .Body = str 'You can add a file like this '.Attachments.Add ("C:\test.txt") End With On Error GoTo 0 ' Based on the user prompts, whether or not the emails will be sent without checking them first If finalCheck = vbYes Then OutMail.Send Else OutMail.Display End If NoContact: ' Determiine which files don't have a corresponding email and add to list If email = Empty Then If conoB <> "" Then conoB = conoB & ", " & cono Else conoB = cono End If End If Err.Clear ' Clear variables for next use Set OutMail = Nothing Set OutApp = Nothing cono = Empty email = Empty firstName = Empty lastName = Empty account = Empty username = Empty password = Empty fPassword = Empty Next: 

Err.Clear只是清除Err对象中最后一个错误的信息 – 它不会退出error handling模式。

如果检测到错误,并且您的On Error GoTo NoContact被调用,您的代码跳转到NoContact标签,然后最终find它的方式回到您的For Each objFile In objFolder.Files的开始For Each objFile In objFolder.Files循环中,仍处于error handling模式

如果仍然处于error handling模式时发生另一个错误,VBA会抛出错误,因为它不能再陷入错误。

你应该沿着…的方向构build你的代码

  For Each objFile In objFolder.Files '... On Error GoTo NoContactError '... NoContact: '... Next '... Exit Sub NoContactError: 'Error handling goes here if you want it Resume NoContact End Sub 

但是,正如Tim Williams所评论的那样 – 尽可能避免需要On Errorerror handling的情况要好得多。