15

我在程序的第一部分使用

On Error GoTo start

假设在我的第二部分我再次使用

On Error Resume Next

第二个错误陷阱将不会被激活,因为第一个错误陷阱仍将处于活动状态。有什么方法可以在使用第一个错误处理程序后停用它?

Set objexcel = CreateObject("excel.Application")
                     objexcel.Visible = True
                     On Error GoTo Openwb
                     wbExists = False
                     Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
                     Set objSht = wbexcel.Worksheets("Sheet1")
                     objSht.Activate
                     wbExists = True
Openwb:
                     
                     On Error GoTo 0
                     If Not wbExists Then
                     objexcel.Workbooks.Add
                     Set wbexcel = objexcel.ActiveWorkbook
                     Set objSht = wbexcel.Worksheets("Sheet1")

                     End If
                     
                     On Error GoTo 0
                                         
Set db = DBEngine.opendatabase("C:\book.mdb")
Set rs = db.OpenRecordset("records")

Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection


For Each tdf In CurrentDb.TableDefs
   
   If Left(tdf.Name, 4) <> "MSys" Then
        rs.MoveFirst
        strsql = "SELECT * From [" & tdf.Name & "] WHERE s=15 "

        Do While Not rs.EOF
            On Error Resume Next
            
            rs2.Open strsql 

执行最后一条语句后,我想忽略错误并转到下一张表,但错误处理似乎不起作用。

4

5 回答 5

17

On error goto 0使用 Visual Basic 进行错误处理(在一般消息框中)

On error goto label会将您的代码重定向到标签:

On error resume next将忽略错误并继续

Resume next引发错误后将代码重定向到下一行

这意味着指令的组合,例如

    On Error goto 0
    ...
    On Error goto 0

没有意义

如果你想重定向一个“错误”指令,你必须这样做:

    Do While Not rs.EOF
        
        On Error Resume Next
        rs2.Open strsql
        On error Goto 0

        rs2.moveNext

    Loop

如果您想将错误重定向到标签(用于处理或其他),然后返回发生错误的代码,您必须编写如下内容:

    On error goto label
    ...
    ...
    On error goto 0
    exit sub (or function)

    label:
    ....
    resume next
    end function

但我真的建议您对错误管理更加严格。您首先应该能够执行以下操作:

    Set objexcel = CreateObject("excel.Application")
    objexcel.Visible = True

    On Error GoTo error_Treatment
    wbExists = False
    Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
    Set objSht = wbexcel.Worksheets("Sheet1")
    objSht.Activate
    wbExists = True
    On error GoTo 0

    Set db = DBEngine.opendatabase("C:\book.mdb")
    Set rs = db.OpenRecordset("records")

    Set rs2 = CreateObject("ADODB.Recordset")
    rs2.ActiveConnection = CurrentProject.Connection

    For Each tdf In CurrentDb.TableDefs
        ....
        'there are a number of potential errors here in your code'
        'you should make sure that rs2 is closed before reopening it with a new instruction'
        'etc.'
    Next tdf

    Exit sub

    error_treatment:
    SELECT Case err.number
       Case **** '(the err.number raised when the file is not found)'
           objexcel.Workbooks.Add
           Set wbexcel = objexcel.ActiveWorkbook
           Set objSht = wbexcel.Worksheets("Sheet1")
           Resume next 'go back to the code'
       Case **** '(the recordset cannot be opened)'
           ....
           ....
           Resume next 'go back to the code'
       Case **** '(whatever other error to treat)'
           ....
           ....
           Resume next 'go back to the code'
       Case Else
           debug.print err.number, err.description '(check if .description is a property of the error object)'
           'your error will be displayed in the immediate windows of VBA.' 
           'You can understand it and correct your code until it runs'
       End select
    End sub

下一步将是预测代码中的错误,以便不会引发 err 对象。例如,您可以编写一个像这样的通用函数:

    Public function fileExists (myFileName) as Boolean

然后,您可以通过测试 xls 文件的存在来在代码中利用此功能:

    if fileExists("C:\REPORT3.xls") Then
        Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
    Else
       objexcel.Workbooks.Add
       Set wbexcel = objexcel.ActiveWorkbook
    Endif        
    Set objSht = wbexcel.Worksheets("Sheet1")
    objSht.Activate

你不再需要你的 wbExist 变量了......

同样,您应该预料到您的记录集没有记录的情况。在测试之前写下 rs.MoveFirst 可能会引发错误。然后你应该写

    If rs.EOF and rs.BOF then
    Else
        rs.moveFirst
        Do while not rs.EOF
             rs.moveNext
        Loop
    End If
于 2008-12-01T16:43:23.117 回答
5

您需要清除错误。尝试将此代码放入:

If Err.Number > 0 Then
    Err.Clear
End If

您还可以使用 Err.Number 来处理特定的错误情况。

于 2008-12-01T14:41:13.690 回答
3

避免错误而不是处理错误几乎总是更好。例如:

Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True

'On Error GoTo Openwb '
'wbExists = False '

If Dir("C:\REPORT3.xls") = "" Then
    objexcel.Workbooks.Add
    Set wbexcel = objexcel.ActiveWorkbook
    Set objSht = wbexcel.Worksheets("Sheet1")
Else
    Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
    Set objSht = wbexcel.Worksheets("Sheet1")
End If

objSht.Activate
'wbExists = True '
于 2008-12-01T14:57:38.900 回答
1

尝试

On Error Goto 0

如需进一步帮助,请查看此处:http: //msdn.microsoft.com/en-us/library/bb258159.aspx

于 2008-12-01T14:11:03.893 回答
1

答案和解决方案是有区别的。有时我们只需要一个答案,感谢警告,让我们从经验中了解到这实际上并不是一个好的解决方案。话虽如此,我发现了这个

您需要使用 On Error GoTo -1 或 Err.Clear 来重置错误捕获。

检查我几个月前发布的这个答案以获得更详细的解释。

于 2018-09-12T22:49:45.693 回答