gpt4 book ai didi

VBA:Err.Clear、Resume、Resume Next 不会阻止 On Error GoTo 仅执行一次

转载 作者:行者123 更新时间:2023-12-02 18:58:41 28 4
gpt4 key购买 nike

因此,在“On Error GoTo 执行一次”下出现了几个 SO 问题和 Google 结果,几乎在每种情况下,推荐的解决方案都是添加 Err.Clear或者Resume的一些论坛清除错误。 VBA 错误一次只能处理一个,因此需要清除。

实现这些后,正如您可能已经猜到的那样,我遇到了这个问题,其中 On Error GoTo只执行一次,我不明白为什么。

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

如果没有Match它会触发错误。这仅仅意味着有一个文件,但没有可以发送给的联系人。它应该跳到NoContact并创建这些文件的列表。

因此,对于我的文件,第一个文件有联系人并生成电子邮件,第二个文件没有联系人并跳至 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 对象中清除有关最后一个错误的信息 - 它不会退出错误处理模式。

如果检测到错误并调用 On Error GoTo NoContact,您的代码会跳转到 NoContact 标签,然后最终找到回到开头的位置For Each objFile In objFolder.Files 循环同时仍处于错误处理模式

如果仍处于错误处理模式时发生另一个错误,VBA 会抛出该错误,因为它无法再捕获该错误。

您应该按照以下方式构建代码:

    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 错误处理的情况。

关于VBA:Err.Clear、Resume、Resume Next 不会阻止 On Error GoTo 仅执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42572243/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com