Question pour On Error

Signaler
Messages postés
12
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
10 mars 2013
-
Messages postés
12
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
10 mars 2013
-
Bonjour,
A ceux qui liront ce post je vous remercie d'avance!
Alors voila je me suis créer une sorte d'emploi du temps en VBA et a chaque lancement du fichier je lance une procédure pour rechercher certaine valeurs ou données spécifique afin de simplifier le code qui suis...
Le soucis c'est que des fois quand il plante les données ne sont plus sauvegarder il faut donc relancer la procédure mais l'ironie c'est qu'il plante parce qu'il n'as plus les données.
Exemple un numéro de ligne qui vaut 0.

J'aimerais donc savoir si un code permet de en cas d'erreur lancer UNE PROCEDURE. laquelle serait juste d'initialiser ce dont j'ai besoin.

Je ne veux pas mettre dans tout mes SUB "on error go to 'machin'" avec 'machin' qui appelle l'init. Plutôt quelque chose comme "Worksheet_OnError()"

Voila j’espère que c'est pas trop sombre ce que je demande et surtout que c'est réalisable!!
Merci encore a ceux qui prendront le temps d'y penser.

Adrien

7 réponses

Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,

Il suffit de mettre tout le code dans une fonction,
qui renverait False si erreur.
Et si c' est False lancer la procédure initialiser.
Exemple:
Function PROCEDER() As Boolean
  On Error Goto EEXIT
 
   <traitement>
   PROCEDER=True

Exit Function

EEXIT:
End Function

Sub INITIALISER
 <traitement>
End Sb



Puis appeler cette function:

If PROCEDER=False Then INITIAMISER

[] Ce qui va sans dire. va mieux en le disant.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Si tu es sûr qu' après avoir initialiser, tout sera OK, rien n' empêche de rappeler la fonction.

If PROCEDER=False Then 
   INITIAMISER 
   Call PROCEDER
End If



[] Ce qui va sans dire. va mieux en le disant.
Messages postés
12
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
10 mars 2013

Merci de ta réponse rapide libre_max mais je suis pas sûr que c'est ce que je cherche...
J'ai 7 modules plusieurs userform...
Le problème ne survient pas dans les forms car je leur fait transmettre toutes les infos a des variables du classeur. Mais ta solution si j'ai bien compris implique que mes 7 modules soit compris dans cette fonction...

Je cherche plutôt un moyen de centraliser une erreur qui survient n'importe ou dans le classeur et d'effectuer une action a ce moment la.

Bien sur quand j'en serais la il faudra aussi que je trouve comment traiter l'erreur pour ne pas toutes les gérer de la même manière sinon je risque d'en créer encore plus.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
" Mais ta solution si j'ai bien compris implique que mes 7 modules soit compris dans cette fonction... "


Non ! Pas forcément.

A chaque module , sa procédure spécifique.
Il ne faudra donc pas chercher à mettre tout dans le même sac.
Mais si tu as des procédures qui se ressemble dans le fond, résumes les en une seule procédure publique mais en passant comme arguments le module apelant, l' user_form concerné,..etc.

Ceci dit, au sein d' une même fonction, on pourra placer, plusieurs ON ERROR, qui renverraient chacun à une etiquette spécifique.

Exemple:
Function PROCEDER() As Integer
   On Error Goto Err_1
   <traitement1>
 
  On Error Goto Err_2
   <traitement2>

  On Error Goto Err_3
   <traitement3>

Exit Function
Err_1:
PROCEDER=1
Exit Function

Err_2:
PROCEDER=2
Exit Function

Err_3:
PROCEDER=3
End Function


Puis appeler cette function
If PROCEDER=1 Then
   CORRIGER_1
ElseIf PROCEDER=2 Then
   CORRIGER_2
If PROCEDER=3 Then
   CORRIGER_3
End If


PS:
Dans mon précédent poste la sub INITIALISER voulait dire CORRIGER,et non tout remettre à zéro.


[] Ce qui va sans dire. va mieux en le disant.
Messages postés
12
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
10 mars 2013

Excuse moi je suis encore assez novice en la matière... Mais je suis justement en train de refaire intégralement ce petit emploi du temps pour le simplifier l'améliorer le clarifier...
Donc j'ai déjà (dans la limite de mes connaissances) réduit au minimum les procédures et les fonctions dont j'ai besoin...

Il serait presque plus simple de faire un copier coller dans chaque procédure qui peut avoir un problème.

Mais si je souhaite l'étendre alors je devrais a nouveau copier coller la demande d'init.
Même avec ta solution ca reste encore très lourd.

il n'y a vraiment aucun moyen de faire un go to en sortant de la sub actuelle?

Désolé d'être si retord par rapport a ta solution mais je cherche vraiment a centraliser le tout si c'est possible sinon bah je ferais comme tu as dit!
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Mais si je souhaite l'étendre alors je devrais a nouveau copier coller la demande d'init.
Même avec ta solution ca reste encore très lourd.


Encore une fois non !
Pas si tu passes à la procedure INIT l' arguemt de l' erreur (voir aussi du module appelant)3
Il suffit de faire un SELECT CASE après.

Sub CORRIGER (xxErr As Integer)
   Select Case xErr
    Case 1
       <correction 1>
    Case 2
       <correction 2>
    Case 3
       <correction 3>
End Select
End Sub


Puis:
E=PROVEDER
If E>0 Then Call CORRIGER(E)


Ceci dit, si tu as plusieurs Fonctions PROCEDER, éviter de reproduire les mêmes valeurs au niveau des etiquettes.
Et dans CORRIGER les traiter toutes.

(Par exemples dans l' une elle prend: 1 ou 2 ou 3.
Dans une autre: 4 ou 5 ou 6)
etc...

[] Ce qui va sans dire. va mieux en le disant.
Messages postés
12
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
10 mars 2013

Si je te passe mon dossier tu peux m'en faire un exemple...?
Vraiment désolé Libre_Max mais je ne vois toujours pas comment ça peut agir de la même façon que
Public sub Worksheet_SelectionChange() par exemple.

Dès que la selection change la procédure est engager pas besoin d'y faire appel.
Hors je souhaiterais mettre au max On Error Go To "Init".
Au mieux que dès qu'il y a une erreur le classeur se charge tout seul de lancer une procédure sans que la ligne de commande soit inscrite dans le sub.

Néanmoins cette dernière solution étant un peu utopique je suppose qu'il faut "prévenir" en début de sub que si il y a une erreur il sort de la procédure, engage une procédure "d'urgence", reviens au début de la procédure précédemment quittée...

Encore désolé mais je préfère passer du temps a chercher ce que j'ai en tête avant d'accepter la fatalité que c'est pas possible !