2016-11-17 35 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 

這工作並按預期運行,但我不確定錯誤處理。我需要在子結尾處打開文件,但是我發佈了rs,這是否需要?是做這個子的正確方法。錯誤處理分

你會這樣做嗎?

感謝迄今爲止所有的幫助。

d

回答

0

這是一個很好的模式,但你忘了On Error GoTo SubError

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

在錯誤處理程序,它應該是'恢復SubExit'取代'轉到SubExit'。 – Andre

+0

@這很有趣。我不知道你可以這樣做,但它不能按預期工作。使用'Resume SubExit'會繼續拋出相同的錯誤。 OP想要做的是獲得一個錯誤消息,以清除對象之前拋出的任何錯誤。他收到錯誤消息後,希望關閉連接和記錄集並退出子。 – 2016-11-17 06:49:09

+0

我想你誤會了。一個錯誤處理程序塊應該以'Resume

0

從我們在托馬斯的回答討論。令人驚訝的是(我總是在錯誤處理程序中使用Resume <Exit>GoTo SubExit不適用於我。看評論。

這是我的標準錯誤處理(在MZ-工具模板自動插入):

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