2016-11-17 1 views
0
Private Sub CmdOpenInsp1201_Click() 
Dim xlApp As Excel.Application 
Dim xlWkb As Excel.Workbook 
    Dim xlWks As Excel.Worksheet 

Dim SQLCpt As String 
Dim SQLLt As String 

Dim rsCpt As DAO.Recordset 
Dim rsLt As DAO.Recordset 

SQLCpt = " SELECT [FirstName] & "" "" & [LastName] AS FullName, TblMembers.Position " & _ 
    " FROM TblMembers " & _ 
    " WHERE TblMembers.Position='Capt #1' " 

SQLLt = " SELECT [FirstName] & "" "" & [LastName] AS FullName, TblMembers.Position " & _ 
    " FROM TblMembers " & _ 
    " WHERE TblMembers.Position='Lt #1' " 

Set rsCpt = CurrentDb.OpenRecordset(SQLCpt, dbOpenSnapshot) 
Set rsLt = CurrentDb.OpenRecordset(SQLLt, dbOpenSnapshot) 

Set xlApp = New Excel.Application 

Set xlWkb = xlApp.Workbooks.Open(CurrentProject.Path & "\Trk_Insp_1201_10_08_2016.xlsx") 

Set xlWks = xlWkb.Sheets("Oct") 

xlApp.Visible = True 

With xlWks 

Do While Not rsCpt.EOF 
.Range("U42").Value = Nz(rsCpt!FullName, "") 
rsCpt.MoveNext 
Loop 
End With 

With xlWks 

Do While Not rsLt.EOF 
.Range("AA42").Value = Nz(rsLt!FullName, "") 
rsLt.MoveNext 
Loop 
End With 

SubExit: 
On Error Resume Next 

rsCpt.Close 
rsLt.Close 
Set rsCpt = Nothing 
Set rsLt = Nothing 

Exit Sub 

SubError: 

MsgBox "Error Number: " & Err.Number & "=" & Err.Description, vbCritical + vbOKOnly, "An error occured" 
GoTo SubExit 

    End Sub 

Dies funktioniert und läuft wie erwartet, aber ich bin mir nicht sicher über die Fehlerbehandlung. Ich brauche die Datei am Ende des Sub geöffnet, aber ich habe die rs freigegeben, ist das nötig? Ist der richtige Weg dies zu tun?Fehlerbehandlung bei Sub

Würden Sie es anders machen?

Danke für die Hilfe bis jetzt.

D

Antwort

0

Das ist ein schönes Muster, aber Sie On Error GoTo SubError vergessen haben, in Thomas' Antwort

Private Sub CmdOpenInsp1201_Click() 
    On Error GoTo SubError 
    ' Code 
SubExit: 
    On Error Resume Next 

    rsCpt.Close 
    rsLt.Close 
    Set rsCpt = Nothing 
    Set rsLt = Nothing 

    On Error GoTo 0 
    Exit Sub   
SubError: 

    MsgBox "Error Number: " & Err.Number & "=" & Err.Description, vbCritical + vbOKOnly, "An error occured" 
    GoTo SubExit 

End Sub 
+1

In der Fehlerbehandlung, sollte es sein 'Fortsetzen SubExit' statt' GoTo SubExit'. – Andre

+0

@Andre das ist interessant. Ich wusste nicht, dass du das kannst, aber es funktioniert nicht wie beabsichtigt. Die Verwendung von 'Resume SubExit' würde den gleichen Fehler verursachen. Was der OP tun möchte, ist eine Fehlermeldung für jeden Fehler, der ausgelöst wird, bevor die Objekte bereinigt werden. Nachdem er die Fehlermeldung erhalten hat, möchte er, dass die Verbindung und die Recordsets geschlossen sind und der Sub-Server beendet wird. –

+0

Ich denke, du hast es falsch verstanden. Ein Fehlerbehandlungsblock sollte mit "Fortsetzen

0

Aus unserer Diskussion. Überraschenderweise (ich verwende immer in Fehlerhandlern) GoTo SubExit funktioniert nicht für mich. Zeige Kommentare.

Das ist mein Standard-Fehlerbehandlung (automatisch mit einer Vorlage in MZ-Werkzeuge eingesetzt):

Public Sub TestErrorHandler() 

    Dim rs1 As DAO.Recordset 
    Dim rs2 As DAO.Recordset 

On Error GoTo TestErrorHandler_Error 

    ' Raise error 
    Set rs1 = CurrentDb.OpenRecordset("NonExistingTable") 
    ' This line will not be reached 
    Set rs2 = CurrentDb.OpenRecordset("OtherTable") 

TestErrorHandler_Exit: 
    ' This prints "0" because "Resume" clears the Err object 
    Debug.Print Err.Number, Err.Description 

    ' Only needed if something *can* go wrong in the "Exit" cleanup code 
    On Error Resume Next 

    ' The following line surprisingly raises error 91 "Object variable not set" 
    ' when "GoTo TestErrorHandler_Exit" is used in the error handler! 
    rs1.Close 
    rs2.Close 
    Set rs1 = Nothing 
    Set rs2 = Nothing 

    On Error GoTo 0 
    Exit Sub 

TestErrorHandler_Error: 
    Debug.Print Err.Number, Err.Description 
    MsgBox "Error " & Err.Number & " in Modulex.TestErrorHandler:" & vbCrLf & _ 
      Err.Description, vbExclamation, "Error" 
    ' Finish error handling 
    Resume TestErrorHandler_Exit 
    ' Don't use this 
    ' GoTo TestErrorHandler_Exit 

End Sub