IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Gestion des erreurs : ou trouver les erreurs possibles pour une opération


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut Gestion des erreurs : ou trouver les erreurs possibles pour une opération
    Bonjour,

    j'ai une application VBA qui travaille sur base d'un folder distant pour lequel la communication se coupe parfois.

    Je voudrais intégrer dans mon code pour chaque instruction qui accède ce folder distant une gestion des erreurs adaptée à ce genre de déconnection.

    Pour ce faire, je recherche un espèce de "bible" ou je pourrais trouver pour telle opération, les erreurs possibles. Ce genre de "bible" exemple par exemple sur AS400.

    D'une manière générale, cela permettrait de gérer mieux les erreurs d'exécution de tous type.

    Cette information existe-t'elle quelquepart ?

    Pour l'instant, mon besoin est relatif à la partie de code ci-dessous, les lignes en gras.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Fullname = Folder & Found_Entry
        Open Fullname For Input As #1
        Found_keys = False
        Line Input #1, Laligne
        Do While Not EOF(1) And Found_keys = False
          Pos_REF = InStr(1, Laligne, "**(REF)", vbTextCompare)
          If Pos_REF > 0 Then
            Found_keys = True
           Else
           Line Input #1, Laligne
          End If
        Loop

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Il n'y a aucune raison de lire un fichier qui n'existe pas,... donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Command1_Click()
      folder = "d:\"
      Found_entry = "essai.txt"
      fullname = folder & Found_entry
      If Dir(fullname) = "" Then
        MsgBox "n'existe pas !  Je ne vais pas plus loin, alors ..."
        Exit Sub
      End If
      Open fullname For Input As #1
        Found_keys = False
        Do While Not EOF(1) And Found_keys = False
          Pos_REF = InStr(1, laligne, "**(REF)", vbTextCompare)
          If Pos_REF > 0 Then
            Found_keys = True
           Else
           Line Input #1, laligne
           MsgBox laligne
          End If
        Loop
    End Sub

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu peux également placer le test sur l'existence du fichier proposé par ucfoutu dans une boucle d'attente.
    En cas de coupure, tu auras une erreur que tu gères en renvoyant sur la boucle d'attente.
    Juste une idée

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Merci à tous les 2 mais ce que vous me proposez est trop simple, vu que je l'ai déjà mis en place.
    (N'oubliez pas que je suis pas top en VBA, mais au niveau conception général de programmation, je me défends assez bien. )

    En fait, le code de bouclage est dans un user form, que je n'ai pas sous la main à l'instant, mais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    res = dir(...)
    while res <> "" then
      procédure_dans_un_module
      res = dir(...)
    wend
    NB désolé, s'il y a des fautes de syntaxe mais je fais vite juste pour expliquer.

    Le code réel comprend encore une boucle extérieure à celle-ci, avec cycle d'attente quand il ne trouve rien pendant quelques secondes, tant que le bouton Stop du userform n'a pas été enfoncé.

    Mon application tourne donc seule, traitant les fichiers requis, puis passe en attente puis reprend du collier quand il y a de nouveau de l'input.

    Le couac se situe dans la procédure du module, d'où l'extrait que je vous ai montré proviens.

    Il y a souvent un décallage entre la situation du folder en remote (AS400) et ce que vois excel, mais surtout il y a des coupure de lien.

    Quand j'apppele le module, il est donc certain qu'à ce moment M le fichier a traiter existe et est accessible. Mais souvent la connection tombe.

    Je voulais donc simplement installer une gestion d'erreur intelligente sur les instructions accédant aux fichiers remote au cas ou ça coince.
    Un codage propre quoi, pour éviter que le VBA se plante à chaque fois.

    Vous me suivez mieux.

    Ce genre de gestion d'erreur se pratique courament sur d'autres plateformes ou langages, d'où ma question : ou puis-je trouver un catalogue des erreurs par instructions. (s'il existe !!)

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonjour,

    ou puis-je trouver un catalogue des erreurs par instructions. (s'il existe !!)
    F1 > Rechercher > Erreurs > La rubrique trappable errors (erreurs recuperables) donne une liste assez conséquente.

    Cordialement,

    Tirex28/

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Tu veux dire que ce qui existait peut brutalement ne plus exister ?

    Essaye alors de modifier ainsi mon code précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Open fullname For Input As #1
        Found_keys = False
        on error go to ciao ' <<<<<<<=======
        Do While Not EOF(1) And Found_keys = False
            Line Input #1, laligne
            ..............
        ciao :
            If err then msgox " bye" : exit do ' <<<<<<========
         Loop
    EDIT :
    Illustration : ici on fait un truc provoquant une erreur (on divise par zérpo!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
      On Error GoTo ciao
      toto = 3
      MsgBox toto / 0
    ciao:
       If Err Then
         MsgBox " bye (erreur N° " & Err.Number & "- " & Err.Description & " -)" : exit sub
       End If
     
    End Sub

  7. #7
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Merci à tous.

    je vais me débrouiller avec cela.

    Ucfoutu, question complémentaire pour toi, par rapport à la gestion d'erreur ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Command1_Click()
      On Error GoTo ciao
      toto = 3
      MsgBox toto / 0
    ciao:
       If Err Then
         MsgBox " bye (erreur N° " & Err.Number & "- " & Err.Description & " -)" : exit sub
       End If
     
    End Sub
    Mon code est bien sûr plus long que cela et j'ai par-ci, par-là une gestion d'erreur spécifique pour quelques instructions, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    on error resume next
    J esouhaite faire cohabiter ma gestion d'erreur ponctuelle avec la tienne que je devine globale.

    Comment puis-je faire pour qu'en dehors de ces lignes spéciales, ce soit ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      On Error GoTo ciao
    qui reprenne le pas. Je dois le remettre à la ligne suivante ?

    Désolé si la question est c.... mais la gestion d'erreur en VBA, c'est bien un truc que je ne parviens pas à bien maîtriser.
    D'autrepart je n'ai pas le code sous la mais pour le montrer (pas avant lundi).

    S'il y a un tuto quelquepart, je suis preneur

    merci d'avance.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bon...

    C'est comme avec Louis XVI (le dernier qui a parlé a raison) :

    Ce sera sonc le dernier des deux exprimés dans la même procédure (entre Resume Next et Goto) qui l'emportera ...
    Pour palier à celà, on préfèrera utiliser l'appel d'une procédure distincte et y mettre le On Error Resume Next, ce qui évitera de ne plus savoir gérer d'autres erreurs éventuelles dans la première procédure.

    Genre, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Command1_Click()
      On Error GoTo ciao
      toto = 3
      MsgBox toto / 0
      MsgBox "si erreur, tu ne me vois pas"
    ciao:
       If Err Then
         MsgBox " bye (erreur N° " & Err.Number & "- " & Err.Description & " -)"
       End If
      titi 25, 0 ' n'affichera rien
      titi 18, 3 ' affichera 6
    End Sub
    Private Sub titi(nb1 As Integer, nb2 As Integer)
      On Error Resume Next
      MsgBox nb1 / nb2
    End Sub
    Edit : ceci étant dit : l'emploi de la gestion d'erreurs doit être réellement exceptionnel et correspondre à ce qui est totalement imprévisible et donc non gérable autrement par des expressions conditionnelles "en prévention" et non "en guérison".
    J'ai très rarement eu plus d'une telle gestion par appli (aucune la plupart du temps)

    EDIT 2 : lorsque tu auras assimilé ce qui précède, nous parlerons du bon usage du Err.Clear (hé oui ...)

  9. #9
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Ok Ucfoutu.

    Je maîtrise, en tout cas j'espère, la gestion d'erreur.

    J'ai ajouté Err.clear après le traitement de l'erreur adéquat.

    Pour info mon problème est résolu.
    Il n'avait rien à voir avec excel, ni avec la logique du code VBA, quoique.

    Certains des fichiers en input (*.DAT) étaient traités et détruits par un software d'étiquette (impression directe) scannant le même folder. Dautres *.DAT étaient laissés tels quels par le même software d'étiquette (impression en PDF) pour que mon code VBA puisse les capter et envoyer le PDF créé à partir de l'impression Postscript du software d'étiquette.

    J'ai renommé les fichiers *.DAT pour PDF en *DAF et adapté mon code en amont et VBA en fonction. Plus de soucis alors de fichier trouvé par DIR mais qui manquait à l'OPEN.

    C'est par hasard que j'ai compris le problème.

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2011, 00h11
  2. Gestion des sorties standards et d'erreurs en Perl/Tk
    Par djibril dans le forum Interfaces Graphiques
    Réponses: 14
    Dernier message: 25/11/2009, 17h34
  3. [XL-2007] Trouver les erreurs
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 19/08/2009, 22h37
  4. Réponses: 3
    Dernier message: 21/05/2008, 16h37
  5. [Débutant] trouver les erreurs dans un code
    Par rouliane dans le forum C++
    Réponses: 11
    Dernier message: 26/01/2008, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo