Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Vba 如何通过退出嵌套循环来处理错误?_Vba_Outlook - Fatal编程技术网

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.Put
Option 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