VBA:Err.Clear,Resume,Resume Next不要阻止On Error GoTo从只执行一次
因此,在“On Error GoTo once once”下出现了几个SO问题和Google结果,几乎每种情况下,推荐的解决scheme是添加Err.Clear
或Resume
某个论坛来清除错误。 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 Error
error handling的情况要好得多。