2009-07-10 91 views
0

我正在通過VBA生成查詢和報告。我可以選擇詢問用戶是否要將報告輸出爲快照。我首先問他們是否想快速拍攝。如果他們拒絕,沒有任何反應。如果他們回答是,他們會立即詢問他們想要保存的地方。處理Access中的輸出錯誤

一切工作很好,除非他們說是,然後在提示上單擊取消,它會引發一個運行時錯誤2501說報表操作被取消。這是代碼。

DoCmd.OpenReport "CONCERNS", acViewPreview, lstFee.Value & " DETAILS" 
If MsgBox("Do you wish to create a snapshot of this report?", vbQuestion + vbYesNo) = vbYes Then 
    DoCmd.OutputTo acReport, "CONCERNS", "SnapshotFormat(*.snp)", "" 
End If 

這也是我的過程結束,所以如果一個錯誤發生在這裏,因爲所有重要的東西已經發生了,我不很​​在意。我只知道某個地方的猴子會看到它會翻轉。有沒有辦法來處理這個錯誤?在錯誤恢復下一個不是一個選項,因爲這將使調試將來的噩夢。這聽起來像我正在尋找像Try/Catch這樣的東西,但我不認爲VBA支持。

回答

1

有(至少)兩種方式來處理這個問題。

1>獲取文件名並在發送報告快照之前的一個步驟中處理可能的取消。我最近沒有這樣做,但還有另一種生成快照報告的方式,而不是DoCmd.OutputTo命令,或者一些不需要命令本身來使用文件對話框的變體。我在舊應用程序中生成報告快照,並且不必向用戶索要文件名。我會盡力找到代碼並展示一個例子。

2>使用上的錯誤繼續下一步,但DoCmd.OutputTo程序之前,唯一正確的,然後看看是否有錯誤,然後再將其關閉:

If MsgBox("Do you wish to create a snapshot of this report?", _ 
    vbQuestion + vbYesNo) = vbYes Then 

    On Error Resume Next 
    DoCmd.OutputTo acReport, "CONCERNS", "SnapshotFormat(*.snp)", "" 
    if Err.Number = 2501 Then 
     '' log or ignore error 
    Else 
     '' log or warn other unexpected errors 
    End If 
    On Error Goto 0 

End If 
+0

不得不查看On Error GoTo 0的功能。太棒了!謝謝! – mandroid 2009-07-10 22:26:02

+0

非常歡迎。我認爲使用本地化的錯誤處理技術比基於goto的跳轉更實用。在發生的地方處理你期望的錯誤,而不是跳到例程的結尾去做一些大的語句,然後跳回到其他地方繼續。這就是爲什麼VB被指責推銷意大利麪代碼的原因。 – Todd 2009-07-10 22:33:20

2
On Error GoTo errHandler 
    .... 
    Exit Sub 

errHandler: 
    If (Err.Number = 2501) Then 
    Resume Next 
    End If 

End Sub 
2

所有你需要的是處理錯誤,即:

On Error Goto HandleErr 
DoCmd.OpenReport "CONCERNS", acViewPreview, lstFee.Value & " DETAILS" 
If MsgBox("Do you wish to create a snapshot of this report?" _ 
    , vbQuestion + vbYesNo) = vbYes Then  
    DoCmd.OutputTo acReport, "CONCERNS", "SnapshotFormat(*.snp)", "" 
End If 

ExitHere: 
Exit Sub 'or Function 

HandleError: 
Select Case Err.Number 
Case 2501 'Report Was Cancelled 
    If MsgBox ("Did you really want to cancel saving the report?", _ 
     vbYesNo + vbDefaultButton2 ,"Please Confirm") = vbNo then 
     Resume 
    Else 
     Resume ExitHere 
    End if 
Case Else 
    Msgbox "An Unexpected error Occurred " & Err.Description, _ 
     vbExclamation,"Error" 
    Resume ExitHere 
End Select 

這將使用戶可以選擇撤消取消並讓他們知道他們做了什麼。