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 <no error> Else <error> End If
是否有错误,并使用Err.Description
获取消息并使用Err.Clear
清除错误。但是您也可以在错误处理程序中设置一个布尔标志,然后在循环中测试那个标志并执行Exit Do
以离开循环或检查循环条件中的标志。以上是关于MS Access VBA 嵌套循环错误处理。我需要在每个嵌套循环中进行不同的错误处理。它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
是否有内置的 MS Access VBA 事件来简化数据验证和 SetFocus
MS ACCESS VBA 运行时错误'3021';使用 .MoveNext