Appel de fonction

  • Initiateur de la discussion Stéphane
  • Date de début
S

Stéphane

Guest
Bonjour le forum,

Depuis une procédure, j'aimerais si une erreur se produit dans le programme, me rendre immédiatement dans une procédure qui traite les messages d'erreurs. Je n'arrive pas à mettre mon code en place. voici le code :

*****************************************************
Sub test()
Dim Réponse As Long
On Error GoTo erreursaisie

Réponse = InputBox('Veuillez saisir un numéro SVP ')
Range('B8').Select
ActiveCell.Value = 'Votre saisie correspond à : ' & Réponse

Exit Sub

erreursaisie:
GestionErreur 'appel de procédure

End Sub
*****************************************************


Et voici la procédure de gestion d'erreur :

*****************************************************
Public Function GestionErreur()
dim Réponse as integer


Select Case Réponse
Case 32 'Réponse non valide, la valeur doit êtrecomprise entre -2 147 483 648 et 2 147 483 647
MsgBox 'Réponse non valide, la valeur doit êtrecomprise entre -2 147 483 648 et 2 147 483 647 '
Exit Function

Case Else
MsgBox 'Numéro d'erreur = ' & Réponse, vbInformation, '...'

End Function
*****************************************************


C'est quoi qui cloche ?

Excel m'indique comme erreur 'erreur de compilation : sub ou function non définie'

Merci à vous


Stéphane
 

Ambroys9211

XLDnaute Nouveau
Bonjour

Remarque : Une fonction doit renvoyer une valeur à chaque appel, sinon ce n'est pas une fonction mais une procédure.

Sinon tu peux catcher l'erreur directment dans ta sub (comme tu l'as fait) et utiliser
l'objet Err qui est natif à Excel (du moins VB) en affichant Err.Number (le numéro d'erreur) et Err.Description (la description de l'erreur)

Moi ce que je fais :

Exit Sub

Main_Err:

If Err.Number = 999& Then
'Fonction de plus haut niveau : on ne redéclenche plus l'erreur
Else
g_ErrNr = Err.Number
g_ErrText = Err.Description
MsgBox 'Erreur ' & g_ErrNr & ' !' & Chr(10) & Chr(13) & g_ErrText _
& Chr(10) & Chr(13) & ' l_motif = ' & l_motif _
& Chr(10) & Chr(13) & ' l_fonction = ' & l_function, vbCritical
End If
End Sub

l_function est initialisé dés début de la fonction avec son nom
et l_motif initialisé pour chaque bloc (ou action) importante de la fonction l_function.
Ca me permet lorsque j'ai pas mal de fonctions et que c'est l'utilisateur qui se sert de la macro, de savoir ou ca a merde et de me retrouver plus facilement.
 

JJM

XLDnaute Occasionnel
Bonjour Stéphane, Creepy, Ambroys9211, le forum,

Il y a d'abord une erreur dans ton code, il manque l'instruction 'End Select' à la fin de la fonction.

Sinon cela fonctionne, bien que le fait d'utiliser une fonction soit surprenant : en général on utilise une fonction pour qu'elle retourne une valeur (ce qui permet de l'appeler à droite d'une expression) et le nom de la fonction doit être renseigné et appelé avant d'en sortir.
Pourquoi ne pas utiliser une procédure (d'autant plus que tu as bien indiqué 'Appel de procédure') ?

Bien sûr, cela marche en raison de la gestion de types par défaut (Variant, 0, chaîne vide, selon les opérations entreprises) et de syntaxe comportant des indications optionnelles, mais ce n'est pas très propre, 'VBAment' parlant.

De plus il est inutile de la qualifier de public, une fonction est publique par défaut.

Oups, mille excuses, nos réponses se cont croisées. Moi aussi j'utilise la gestion d'erreur d'Ambroys9211, plus satisfaisante.

Message édité par: JJM, à: 08/08/2005 17:06

Message édité par: JJM, à: 08/08/2005 17:07
 

Discussions similaires

Réponses
6
Affichages
286
Réponses
7
Affichages
581

Membres actuellement en ligne

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz