MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?

Posted

技术标签:

【中文标题】MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?【英文标题】:MS Access VBA Nested loop error handling. I need to do different error handling in each nested loop. How does it work? 【发布时间】:2021-11-30 15:21:15 【问题描述】:

我编写了 VBA 代码来为多个状态和报告实体创建 Nacha 文件。有 3 个嵌套循环来创建和写入文件,每个循环向 nacha 文件写入一行并更新块数、行数和总美元金额。由于将记录写入文件,我需要在每个循环中进行不同的错误处理。如果附录记录中有错误,我需要删除详细记录的先前书面行并更新计数/金额。我可以将 On Error GoTo 放在一个循环内并在循环外停止吗?我想做的如下所示。

Function MyStuff()
Do While Not batch.EOF
        On Error GoTo BatchError
        Do Something
        write to file

        Do While Not EntryDetail.EOF
                On Error GoTo EntryError
                Do Something
                Write to File
                'Update Values for counts and dollars

                Do While Not Addenda.EOF
                        On Error GoTo AddendaError
                        Do Something
                        Write to File
                        'Update Values for counts and dollars
                        Loop
                Loop
        'Update Values for Counts and Dollars
         Loop
End Function

BatchError:
        'handle errors
        Resume Next

EntryError:
        'handle errors
        Resume Next
AddendaError:
        'Handle Errors
        Resume Next

如果这样做,一旦当前循环结束,错误处理是否会恢复到先前的循环?因此,如果在 addenda 循环中发生错误,它将转到 AddendaError 处理,当该循环结束时,它将恢复到 EntryError 处理程序,然后当该循环结束时,它将恢复到 BatchError 处理程序?

【问题讨论】:

您应该删除循环外的所有“做某事”。如果这些内容冗长,请写入临时表。然后导出 - 如果您可以打开文件并写入第一行,则极不可能,在写入文件的其余部分时会发生错误。 【参考方案1】:

On Error GoTo 对循环一无所知。最后遇到的将是活动的。如果要在循环后恢复到前一个,则必须再次调用它。例如

Function MyStuff()
    Do While Not batch.EOF
        On Error GoTo BatchError
        Do Something
        write to file

        Do While Not EntryDetail.EOF
            On Error GoTo EntryError
            Do Something
            Write to File
            'Update Values for counts and dollars

            Do While Not Addenda.EOF
                On Error GoTo AddendaError
                Do Something
                Write to File
                'Update Values for counts and dollars
            Loop

            On Error GoTo EntryError '<<<<<< repeat here! =================
            'Do Entry stuff
        Loop
        On Error GoTo BatchError '<<<<<< repeat here! =====================
        'Do Batch stuff
    Loop
    Exit Function '<<<<< Do not forget before error handling! =============

BatchError:
    'handle errors
    Resume Next

EntryError:
    'handle errors
    Resume Next

AddendaError:
    'Handle Errors
    Resume Next
End Function

另外,不要忘记错误处理标签之前的Exit Function

End Function 出现在最后。

【讨论】:

谢谢你,我试试看。而且我在处理错误之前确实有一个“退出函数”,只是忘了把它放在我的代码示例中。 我知道有人会评论“问另一个问题”,但是如何强制执行下一个循环而不是在错误处理程序中执行 resume next? 你也可以在循环中使用On Error Resume Next,当遇到错误时,会执行下一条语句。然后您可以测试If Err.Number = 0 Then &lt;no error&gt; Else &lt;error&gt; End If 是否有错误,并使用Err.Description 获取消息并使用Err.Clear 清除错误。但是您也可以在错误处理程序中设置一个布尔标志,然后在循环中测试那个标志并执行Exit Do 以离开循环或检查循环条件中的标志。

以上是关于MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA 文件对话框崩溃

在大型 VBA/MS Access 项目中查找语法错误

是否有内置的 MS Access VBA 事件来简化数据验证和 SetFocus

MS ACCESS VBA 运行时错误'3021';使用 .MoveNext

运行查询时出现运行时错误 3075 MS Access VBA

Ms-访问,VBA 错误