Excel VBA: instruction on Error Goto ne fonctionne pas à l'intérieur De la Boucle
Je suis en train de passer à travers un tableau dans excel. Les trois premières colonnes de ce tableau, le texte des titres, le reste d'entre eux ont des dates pour les en-têtes. Je veux attribuer ces dates, de manière séquentielle, à une variable de type Date, puis effectuer quelques opérations sur la base de la date
Pour ce faire, je suis l'aide d'une boucle foreach sur myTable.ListColumns. Depuis les trois premières colonnes n'ont pas d'en-têtes de date, j'ai essayé de mettre la boucle de sorte que, si il y a une erreur de l'affectation de la chaîne d'en-tête de la variable de type date, la boucle va directement à la colonne suivante
Cela semble fonctionner pour la première colonne. Cependant, lors de la deuxième colonne d'en-tête est "attribuées" à la variable de type date, la macro rencontre une erreur, même si il est à moins d'une erreur de manipulation bloc
Dim myCol As ListColumn
For Each myCol In myTable.ListColumns
On Error GoTo NextCol
Dim myDate As Date
myDate = CDate(myCol.Name)
On Error GoTo 0
'MORE CODE HERE
NextCol:
On Error GoTo 0
Next myCol
Pour rappel, l'erreur est levée sur le second tour de la boucle, à la déclaration
myDate = CDate(myCol.Name)
Quelqu'un peut-il expliquer pourquoi l'instruction on Error arrêts de travail?
Si vous êtes "à l'aveugle" de la manipulation de l'erreur plutôt que de prendre une action spécifique sur une erreur de type, vous devez simplement utiliser une
On Error Resume Next
à l'extérieur de votre boucle. Au moment où vous l'utilisez erreur de manipulation de nouveau sur chaque colonne.Je ne pense pas que vous pouvez simplement reprendre prochaine. L'idée est de passer sur le "plus de code ici" code si la date de conversion échoue. Vous devez donc vous rendre dans un gestionnaire de sorte que vous pouvez reprendre à une ligne spécifique. En outre, vous ne voulez que le gestionnaire activé pour la date de conversion, et non pas l'ensemble du corps de boucle.
À la réflexion, je suis d'accord. Je voudrais voir "plus d'un code ici".
OriginalL'auteur Swiftslide | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
Avec le code comme indiqué, vous êtes toujours considéré comme dans la routine de gestion d'erreur lorsque vous frappez la
next
déclaration.Qui signifie que par la suite, les gestionnaires d'erreur ne sont pas autorisés jusqu'à ce que vous reprenez à partir de l'actuel.
Une meilleure architecture serait:
Cela définit clairement la gestion d'erreur de code standard et garantit que le cours d'exécution de gestionnaire d'erreur à la fin avant que vous essayez d'installer un autre gestionnaire.
Ce site a une bonne description du problème:
Erreur De Manipulation De Blocs Et On Error Goto
Une erreur du bloc de gestion, également appelé un gestionnaire d'erreur, est une section de code dont l'exécution est transférée par l'intermédiaire d'un
On Error Goto <label>:
déclaration. Ce code doit être conçue pour résoudre le problème et reprendre l'exécution du bloc de code principal ou de mettre fin à l'exécution de la procédure. Vous ne pouvez pas utiliser laOn Error Goto <label>:
déclaration de simplement ignorer les lignes. Par exemple, le code suivant ne fonctionnera pas correctement:Lors de la première erreur est générée, l'exécution des transferts à la ligne suivante
Err1:
. L'erreur virage est toujours actif lorsque la deuxième erreur se produit, et, par conséquent, la deuxième erreur est de ne pas être piégés par laOn Error
déclaration.eh bien, oui, c'est peut-être préférable, mais "les Besoins doivent quand le diable vomit dans votre marmite" 🙂
Le
On Error GoTo 0
partie est redondante dans ton premier code.Grâce paxdiablo, je ne savais pas que c'était la façon dont il a travaillé.
Je ne suis pas si sûr. Vous voulez que le gestionnaire d'erreur activée au cours de la conversion de données, pas dans la partie qui dit "plus de code ici".
OriginalL'auteur paxdiablo
Vous devez ajouter
resume
de quelques sortes dans votre code de gestion d'erreur pour indiquer l'erreur de manipulation. Sinon, le premier gestionnaire d'erreur est toujours actif et vous n'êtes jamais "résolu".Voir http://www.cpearson.com/excel/errorhandling.htm (plus précisément la rubrique "Erreur de Manipulation de Blocs Et on Error Goto" et à la suite de l'article)
OriginalL'auteur enderland
Suivi paxdiablo accepté de répondre. C'est possible, permettant à deux interruptions d'erreur dans le même sous, l'un après l'autre :
À l'aide de
On Error GoTo -1
annule le gestionnaire d'erreurs active et permet à une autre (eterr.clear
ne pas le faire!). Si c'est une bonne idée ou non est laissé comme exercice pour le lecteur, mais ça fonctionne!OriginalL'auteur AjV Jsy
Effacement de tous les paramètres des propriétés de l'objet Err n'est pas la même que la réinitialisation du gestionnaire d'erreur.
Essayez ceci:
Vous remarquerez le juste comme l'OP, il va attraper l'erreur correctement lorsque
i =1
mais elle échoue sur la ligne 10 quandi = 2
, même si nous avons utiliséErr.Clear
OriginalL'auteur Profex