Vba 如何通过退出嵌套循环来处理错误?
我想准备邮件,而有些邮件应该有多个附件 当出现错误时,我希望我的Vba 如何通过退出嵌套循环来处理错误?,vba,outlook,Vba,Outlook,我想准备邮件,而有些邮件应该有多个附件 当出现错误时,我希望我的出错转到chyba跳转到下一个I Sub novy_mail() Dim attachments(1 To 5, 1 To 3) As String prilohy(1, 1) = "subor1.txt" prilohy(1, 2) = "subor2.txt" prilohy(2, 1) = "subor2.txt" prilohy(2, 2) = "su
出错转到chyba
跳转到下一个I
Sub novy_mail()
Dim attachments(1 To 5, 1 To 3) As String
prilohy(1, 1) = "subor1.txt"
prilohy(1, 2) = "subor2.txt"
prilohy(2, 1) = "subor2.txt"
prilohy(2, 2) = "subor3.txt"
prilohy(3, 1) = "subor3.txt"
prilohy(3, 2) = "subor4.txt"
prilohy(4, 1) = "subor4.txt"
prilohy(5, 1) = "subor5.txt"
Dim oMsg As Outlook.MailItem
Dim i As Integer
Dim j As Integer
For i = 1 To UBound(attachments, 1)
Set oMsg = Application.CreateItem(olMailItem)
With oMsg
For j = 1 To UBound(attachments, 2)
On Error GoTo chyba
.Attachments.Add "C:\Users\" + attachments(i, j)
Next j
.Display
End With
chyba:
Next i
End Sub
您可以使用
On Error Resume Next
和在语句后检查Error.Number
来跳过循环。跳过通过设置循环计数器使循环终止来工作
不要忘记通过将错误转到0时的设置为0来重新启用常规错误处理,否则您的程序将开始异常运行
Sub novy_mail()
Dim attachments(1 To 5, 1 To 3) As String
Dim i As Integer, j As Integer
prilohy(1, 1) = "subor1.txt"
prilohy(1, 2) = "subor2.txt"
prilohy(2, 1) = "subor2.txt"
prilohy(2, 2) = "subor3.txt"
prilohy(3, 1) = "subor3.txt"
prilohy(3, 2) = "subor4.txt"
prilohy(4, 1) = "subor4.txt"
prilohy(5, 1) = "subor5.txt"
For i = 1 To UBound(attachments, 1)
With Application.CreateItem(olMailItem)
For j = 1 To UBound(attachments, 2)
On Error Resume Next
.Attachments.Add "C:\Users\" + prilohy(i, j)
If Err.Number <> 0 Then j = UBound(attachments, 2)
On Error Goto 0
Next j
.Display
End With
Next i
End Sub
就我个人而言,我会尽量避免使用多维数组。这在VBA中是不好的。我还将创建一个只创建一封邮件并多次调用的函数:
Sub create_mails()
novy_mail "C:\Users\subor1.txt|C:\Users\subor2.txt"
novy_mail "C:\Users\subor2.txt|C:\Users\subor3.txt"
novy_mail "C:\Users\subor3.txt|C:\Users\subor4.txt"
novy_mail "C:\Users\subor4.txt"
novy_mail "C:\Users\subor5.txt"
End Sub
Function novy_mail(attachments As String) As Outlook.MailItem
Dim path As Variant
Set novy_mail = Application.CreateItem(olMailItem)
For Each path In Split(attachments, "|")
If Not TryAddAttachment(oMsg, path) Then Exit For
oMail.Display
Next
End Sub
如果错误处理程序在错误转到0时已捕获错误,则重新使用该错误处理程序
For i = 1 To UBound(attachments, 1)
Set oMsg = CreateItem(olMailItem)
With oMsg
For j = 1 To UBound(attachments, 2)
On Error GoTo chyba
.Attachments.Add "C:\Users\" + attachments(i, j)
Next j
.Display
End With
chyba:
' can be used whether an error has been caught or not
on error goto 0
Next i
您需要对错误进行注释,转到chyba
,并在没有预期错误的地方进行测试。一旦修复了任何意外错误,请取消注释。什么是不工作?发生了什么,应该发生什么?错误?当prilohy(i,j)未定义时,代码应跳转到chyba:并停止尝试在邮件项目中添加新附件。发生的情况是,当内部循环尝试到达未定义的prilohy(i,j)时,它显示错误。哪个数组是真正的数组-附件或prilohy?与其检查错误,不如检查文件是否存在!“vba文件存在”的Web搜索将在代码顶部显示how-to.PutOption Explicit
。这可能会导致一致的数组命名。研究如何设置VB编辑器,在默认情况下添加选项Explicit
,以强制声明变量。
For i = 1 To UBound(attachments, 1)
Set oMsg = CreateItem(olMailItem)
With oMsg
For j = 1 To UBound(attachments, 2)
On Error GoTo chyba
.Attachments.Add "C:\Users\" + attachments(i, j)
Next j
.Display
End With
chyba:
' can be used whether an error has been caught or not
on error goto 0
Next i