2009-07-10 8 views
0

私はVBAを通じてクエリとレポートを生成しています。スナップショットとしてレポートを出力するかどうかをユーザーに尋ねるオプションがあります。私は最初にスナップショットをしたいかどうか尋ねます。彼らがいいえと言うなら、何も起こらない。彼らが「はい」と答えると、どこに保存するかを尋ねるプロンプトが表示されます。アクセス時に出力エラーを処理する

「はい」と答えてから「キャンセル」をクリックすると、レポートアクションがキャンセルされたというランタイムエラー2501が発生します。ここにコードがあります。

これも私の手順の終わりなので、すべての重要なことが起こって以来、ここでエラーが起きたかどうかは気にしません。私はちょうど彼らがそれを見るならば、どこかで猿が跳ねるだろうと知っています。このエラーを処理する方法はありますか? On Error Resume Nextはデバッグが将来悪夢になるため、オプションではありません。私はTry/Catchのようなものを探しているようだが、私はVBAがそれをサポートしているとは思わない。

答えて

1

これを処理するには少なくとも2つの方法があります。

1>レポートスナップショットを送信する前に、ファイル名を取得し、可能なキャンセルをステップで処理します。私はこれを最近行っていませんが、DoCmd.OutputToコマンド、またはファイルダイアログを使用するコマンド自体を必要としないバリエーションよりも、スナップショットレポートを生成する別の方法があります。私は古いアプリケーションでレポートスナップショットを生成し、ユーザーにファイル名を尋ねる必要はありませんでした。私はコードを見つけようとし、例を示します。

2>その後、バックオフ電源を入れ、エラーがありますかどうかを確認し、その後、唯一の右DoCmd.OutputToルーチンの前に、On Error Resume Nextを使用します。必要なのは、にある

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が何をしているかを調べる必要がありました。これは完璧です!ありがとう! – mandroid

+0

大歓迎です。私は、ジャンプベースのジャンプではなく、ローカライズされたエラー処理テクニックを使用する方が現実的だと思います。大文字小文字のステートメントへのルーチンの最後にジャンプし、次に別の場所にジャンプして続行するのではなく、その場所で予想されるエラーを処理します。だから、VBはスパゲッティコードを宣伝していると非難されています。 – Todd

+0

On Error Resume Nextは非常に危険です。一度に複数のコード行に使用してはならず、直ちにqithをオフにしてください。エラーが発生すると0になります。この状況が発生したことを知っている特定のエラー番号をトラップし、その特定のエラーを破棄する方がはるかに優れています。上記のコードでは、予期しないエラーが発生した場合は無視しますが、アドバイスを受けた場合は、ユーザーに報告されます(または適切に処理されます)。 –

2
On Error GoTo errHandler 
    .... 
    Exit Sub 

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

End Sub 
+0

私はここにコードブロックを投稿するのが良いとは思わない。要点は、エラーハンドラを取得し、そのエラーだけで「次のレジューム」を使用することです。悪夢はない。 – Smandoli

+0

行のブロックを選択し、エディタで "コード"アイコン(0と1)を押して、正しくフォーマットします。または、各行の前に4つのスペースを入れて同じことをします。 – Todd

+0

これは、DoCmd.OpenReportの前にOn Error Resume Nextを使用するための非常に好ましい方法です。 –

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 

これにより、キャンセルを元に戻して、その操作をユーザーに知らせることができます。

関連する問題