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 :

goto qui ne marche pas indéfiniment


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut goto qui ne marche pas indéfiniment
    Bonjour,

    Je cherche a faire un truc assez simple mais qui marche pas. Je veux qu'a chaque fois que l'instruction i="a" est rencontree on aille au label "err" or ce qui se passe c'est que la premiere fois que cette instruction est rencontree on va bien a err mais au second passage j obtiens une erreur. Pourant je continue a faire du error handling puisque j ai pas fait on error goto 0. J ai un fusil a une balle et je veux une kalash avec un nombre de balles infinie...


    Merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim i As Integer
    err:
     
        For i = 0 To 0
     
        Next i
     
        On Error GoTo err
     
        i = "a"

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour et bienvenu sur le Forum,

    J ai un fusil a une balle et je veux une kalash avec un nombre de balles infinie.
    Quand même pas à ce point!

    Ton étiquette Erreur est placée avant ton GoTo
    Quant à ta boucle, 0 to 0..

    Quoi qu'il en soit, il serait plus efficace de retourner le code complet en précisant le message d'erreur et la ligne en anomalie (surlignée en jaune).

  3. #3
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Merci de ta réponse. J'ai modifié le code en conséquence et le problème est le même. Honnêtement le code au complet n'a rien à voir avec le problème que j'expose. Je dirai même que par pure curiosité je veux comprendre ce on error goto car normalement tant que j'ai pas fait on error goto 0 il doit continuer à gérer l erreur....

    Une idée ?
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    On Error GoTo err
        Dim i As Integer
    err:
     
        For i = 0 To 1
     
        Next i
     
        i = "a"

  4. #4
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    pour répondre a ta question, la ligne en cause est évidemment i="a" et le message renvoyé est "type mismatch" car integer n est pas string. C est un cas d école qui sera implémenté dans un code beaucoup plus compliqué et que je n ai aps le droit de poster nul part...

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Dans ce cas bien sûr, si i est déclarée en Integer, alors tu ne peux lui affecter une valeur String.

    L'étiquette Err doit être évidemment placée après le code générant une erreur.

    Avec ce peu d'éléments, il est difficile, du moins à mon humble niveau, d'en dire plus.

    Pour information, tu peux consulter ce tutoriel Gestion des erreurs

  6. #6
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    l affectation d un stringa un integer donne une erreur d'apres le dernier code postee. Le fait que la label erreur soit apres ne regle pas mon pb car je l ai essayer. Si je tombe sur la reponse, je la posterai pour d autres personnes...

    Merci pour ton temps.

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Bonjour a vous tous,


    i = "a" est automatiquement un string à cause des "" mais la variable est déclaré comme integer ... je presume que vous voulez avoir systématiquement un erreur.


    JE suis comme MarcelG j'ai besoin du code complet afin de générer le probleme et ou comprendre afin de pouvoir penser mettre une solution.


    À première vue, je suis d'avis que le error Handler devrais être à la fin. Également avez-vous fais du pas à pas afin de voir qu'Est-ce qui clocche la seconde fois à l'aide de F8 ??? Est-ce que la loop marche ???

  8. #8
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Citation Envoyé par jpvba Voir le message
    Bonjour a vous tous,


    i = "a" est automatiquement un string à cause des "" mais la variable est déclaré comme integer ... je presume que vous voulez avoir systématiquement un erreur.
    oui vous presumez bien.

    Citation Envoyé par jpvba Voir le message
    JE suis comme MarcelG j'ai besoin du code complet afin de générer le probleme et ou comprendre afin de pouvoir penser mettre une solution.
    Le code est complet et il teste le comportement du goto.

    La loop marche et le f8 montre que le goto est fait pour gérer une seule erreur, je présume car en général quand on a une erreur on affiche un msgbox et on termine le programme ou un truc dans le genre. j utilise moi le goto d une maniere differente: Tant qu on a une erreur a une certaine ligne, on va dans une boucle for pour exécuter (ou pas) un code. voila l algorithme.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Si tu veux reprendre le code suite à une erreur tu peux utiliser un code du genre de celui-ci-dessous mais je ne vois pas l'intérêt de reprendre sans avoir traité l'erreur et comme dis MarcelG () l'étiquette de reprise ne se place jamais avant le gestionnaire, utilise plutôt l'instruction "Resume" et avec bien de prudence de tout façon, il est primordial de traiter l'erreur et non de reprendre le code à un endroit sans avoir rien fait :
    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
    21
    22
     
    Sub Test()
     
        Dim i As Integer
        Dim J As Integer
     
        On Error GoTo err
     
    Reprise:
     
        If J = 20 Then Exit Sub 'permet d'avoir 20 reprises d'erreur
        i = "a"
     
    err:
     
        J = J + 1
        Debug.Print J; "Type d'erreur : "; err.Description; ", numéro de l'erreur : "; err.Number
     
        err.Clear 'nettoie le gestionnaire...
        Resume Reprise '...et reprend le code
     
    End Sub

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Tu as testé que ton imprimante était bien en ligne mais manque de chance au moment de l'envoyer elle tombe en panne?

    Tu as des coupures réseau intempestifs ?

    Qu'est ce qui justifie l'utilisation du on error et pas de qualifier les données que tu fournis à ton programme ?

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    Juste pour satisfaire ma curiosité :
    C'est quoi, cette variable i de type integer, à laquelle on attribue une chaîne de caractères (un seul, en fait) et qu'on utilise de toutes manières pas ?

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je pense que notre ami est entrain de tester le gestionnaire d'erreur

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Theze
    Ah oui. Je vois.
    Ce serait alors du genre (plus digeste) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim i As Integer
        Dim J As Integer
        On Error Resume Next
        Do While J < 20
          i = "a"
          J = J + 1
          If err Then MsgBox J & "  " & err.Description: err.Clear
        Loop
        On Error GoTo 0

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Je pense que Amir2121 s'interroge sur le fait que le gestionnaire ne gère l'erreur qu'une fois mais pour qu'il continu à gérer les erreurs suivantes il faut nettoyer le gestionnaire avec Clear !

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    puisque la gestion d'erreur est sensée opérer dans la boucle autant la mettre dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
        Dim i As Integer
        Dim J As Integer
        Do While J < 20
            J = J + 1
            On Error Resume Next
            i = "a"
            If Err Then MsgBox J & "  " & Err.Description: Err.Clear
            Err.Clear ' ou On Error GoTo 0
        Loop
     
    End Sub
    le "on error resume next " passe a la ligne suivante donc le message s'affiche et ensuite l'erreur est effacée de la memoire avec "err.clear" ou meme " On Error GoTo 0"
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Pas du tout d'accord avec patricktoulon.
    Et voici pourquoi :
    1) mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub unparia()
        Dim i As Integer
        Dim J As Integer
        On Error Resume Next
        Do While J < 5
          i = "a"
          J = J + 1
          If err Then MsgBox J & "  " & err.Description: err.Clear
        Loop
        On Error GoTo 0
        MsgBox 1 / 0 ' ----> cette erreur ne sera pas occultée par le on error resume next, qui n'est plus actif
    End Sub

    2) le code de patricktoulon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub patricktoulon()
        Dim i As Integer
        Dim J As Integer
        Do While J < 5
            J = J + 1
            On Error Resume Next
            i = "a"
            If err Then MsgBox J & "  " & err.Description: err.Clear
            err.Clear ' ou On Error GoTo 0
        Loop
        MsgBox 1 / 0 ' ---->> cette erreur sera malencontreusement occultée pat le error resume next, qui reste actif
    End Sub
    le code de patricktoulon ne fonctionnerait qu'avec On error goto 0 en ligne 0 et non err.clear. Mais alors : pourquoi en faire les frais 5 fois ?

  17. #17
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour et bonne année à tous,

    Coucou Patrick, je suis d'accord avec Jacques et j'aurais fait de même,
    d'ailleurs un exemple qui est plus que probant, car en plus la gestion d'erreur est obligatoire,
    concerne les Collections …

    • On mettra avant la boucle On Error Resume Next

    • Dans la boucle Err.Clear (selon ce que l'on veut)

    • Après la boucle On Error Goto 0 permettant que la suite du code ne soit pas impacté
    par une gestion d'erreur pouvant alors masquer d'éventuel problèmes …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  18. #18
    Membre averti
    Homme Profil pro
    Etude
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Etude

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Citation Envoyé par unparia Voir le message
    (on voit mal dans quelle circonstances on s'amuserait à reprendre en boucle la même erreur), mais c'est ce à quoi il s'exerce ...
    Souvent je change un peu ma question pour pas rentrer dans des debats sans fin a propos de quelque chose dans laquelle je ne veux pas rentrer.

    Pour repondre a ta question legitime, le i="a" est en fait dans mon programme un ordre de selection dans un fichier word a qui on aura donne l'ordre (par un shell) de s'ouvrir. Il se trouve que tant que le fichier word n est pas ouvert on aura une erreur a l'ordre selection. Je ne veux pas utiliser un "wait" ou sleep d un nombre de seconde que j aurai choisi. Je veux creer une boucle d attente qui attend TANT qu on a une erreur a une certaine instruction. Je ne veux pas un Resume Next car ca repond pas du tout a la problematique. Je ne veux pas utiliser un documents.open (qui redonne la main une fois que le fichier word est ouvert) car l'avantage de l instruction shell est qu elle choisi le programme adequate pour ouvrir un fichier. Comme certains l auront compris je cherche a faire un programme robuste, maleable....

    J'espere que la discussion ne partira pas en sucette et qu on debaterra de comment faire une boucle d attente tant qu on a une erreur a une instruction particuliere....

  19. #19
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10

  20. #20
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Amir2121 Voir le message
    Pour repondre a ta question legitime, le i="a" est en fait dans mon programme un ordre de selection dans un fichier word a qui on aura donne l'ordre (par un shell) de s'ouvrir. Il se trouve que tant que le fichier word n est pas ouvert on aura une erreur a l'ordre selection. Je ne veux pas utiliser un "wait" ou sleep d un nombre de seconde que j aurai choisi. Je veux creer une boucle d attente qui attend TANT qu on a une erreur a une certaine instruction.
    Au lieu de procéder ainsi avec une méthode vraiment pas propre, je te conseille de procéder ainsi :

    1 - Vérifier que le fichier existe en utilisant une fonction Dir() (si le nom de fichier est obtenu par une boite de dialogue, cette phase n'est pas utile).
    2 - Ouvrir le fichier avec un GetObject() qui ne nécessite pas de boucle d'attente.
    https://docs.microsoft.com/fr-fr/off...bject-function
    Ne pas oublier de mettre un Set devant pour placer la référence du fichier ouvert dans une variable (voir les exemples fournis dans le lien).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Méthode getSize() qui ne marche pas
    Par mush_H dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 20/03/2005, 02h29
  2. [SWING] KeyListener qui ne marche pas
    Par kindool dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2005, 20h04
  3. Iptables configuration qui ne marche pas....
    Par The_Nail dans le forum Sécurité
    Réponses: 7
    Dernier message: 03/02/2004, 15h27
  4. Réponses: 3
    Dernier message: 08/09/2003, 16h06
  5. Réponses: 9
    Dernier message: 07/05/2003, 13h57

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