2009-07-10 5 views
0

Je génère une requête et un rapport via VBA. J'ai l'option de demander à l'utilisateur s'il veut sortir le rapport sous forme d'instantané. Je leur demande d'abord s'ils veulent faire un cliché instantané. S'ils disent non, rien ne se passe. S'ils disent oui, ils reçoivent un message demandant où ils veulent l'enregistrer.Gestion d'une erreur de sortie dans Access

Tout fonctionne très bien, sauf si l'on dit oui et que l'on clique sur Annuler à l'invite, cela déclenche une erreur d'exécution 2501 indiquant que l'action de rapport a été annulée. Voici le code.

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 

C'est aussi la fin de ma procédure, donc je ne me soucie pas vraiment si une erreur se produit ici depuis toutes les choses importantes est déjà arrivé. Je sais juste qu'un singe va basculer quelque part si jamais ils le voient. Y a-t-il un moyen de gérer cette erreur? On Error Resume Next n'est pas une option car cela ferait du débogage un cauchemar dans le futur. On dirait que je cherche quelque chose comme un Try/Catch mais je ne pense pas que VBA supporte cela.

Répondre

1

Il y a (au moins) deux façons de gérer cela. 1> obtenir le nom du fichier et gérer l'annulation possible dans une étape avant d'envoyer l'instantané du rapport. Je ne l'ai pas fait récemment mais il existe une autre façon de générer le rapport d'instantané que la commande DoCmd.OutputTo, ou une variante qui ne nécessite pas la commande elle-même pour utiliser une boîte de dialogue de fichier. J'ai généré des instantanés de rapport dans une ancienne application et je n'ai pas eu à demander à l'utilisateur un nom de fichier. Je vais essayer de trouver le code et montrer un exemple.

2> Utilisation On Error Resume Next, mais juste avant la routine DoCmd.OutputTo, puis voir s'il y a une erreur, puis le désactiver:

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

J'ai dû rechercher ce que GoTo 0 fait. C'est parfait! Merci! – mandroid

+0

Vous êtes les bienvenus. Je pense qu'il est plus pratique d'utiliser une technique de gestion des erreurs localisée plutôt que de sauter autour. Manipulez l'erreur que vous attendez à l'endroit où cela se produit, plutôt que de sauter à la fin de la routine dans une grosse déclaration de cas, puis de revenir à un autre endroit pour continuer. C'est pourquoi VB est accusé de promouvoir le code spaghetti. – Todd

+0

On Error Resume Suivant est très dangereux. Vous ne devriez jamais l'utiliser pour plus d'une ligne de code à la fois, et désactivez immédiatement qith On Error GoTo 0. Il est préférable d'intercepter le numéro d'erreur SPECIFIC que vous connaissez et de supprimer cette erreur SPECIFIC. Si une erreur que vous n'aviez pas anticipée se produit, le code ci-dessus l'ignorera, mais si vous suivez mon conseil, il sera signalé à l'utilisateur (ou traité de manière appropriée). –

2
On Error GoTo errHandler 
    .... 
    Exit Sub 

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

End Sub 
+0

Je ne semble pas être bon pour poster des blocs de code ici. Le point est que vous obtenez un gestionnaire d'erreurs, et il utilise "reprendre ensuite" pour juste cette erreur. Pas de cauchemars. – Smandoli

+0

Sélectionnez votre bloc de lignes et cliquez sur l'icône "Code" (zéros et uns) dans l'éditeur pour les formater correctement.Ou mettre 4 espaces devant chaque ligne, même chose. – Todd

+0

Il s'agit d'une approche largement préférable à l'utilisation de la reprise sur erreur suivant avant le DoCmd.OpenReport. –

2

Tout ce que vous avez besoin est de gérer l'erreur ie:

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 

Ceci donnera à l'utilisateur la possibilité d'annuler l'annulation et de lui indiquer ce qu'il a fait.

Questions connexes