Prés requis▲
Ce tutoriel nécessite la connaissance des bases du langage Visual Basic et notamment la gestion des erreurs : Tutoriel sur la gestion des erreurs
Introduction▲
Lors des premiers jours d'utilisation de vos applications Access suivant leur déploiement, vous devez parfois exécuter certaines tâches de maintenance. Vous devez alors faire confiance à l'utilisateur en ce qui concerne les différents messages d'erreur qu'il a pu rencontrer.
Malheureusement, ses dires ne reflètent pas toujours la réalité. Aussi une solution simple consiste à enregistrer ces messages d'erreur dans un fichier texte qui portera le même nom que l'application suivi de l'extension .log (Fichier de log d'erreur).
Toutefois, il serait fastidieux d'avoir à écrire des lignes de code relatives aux manipulations de ce fichier texte dans chaque procédure de votre projet. La meilleure approche consiste donc à créer une classe d'objet qui se chargera d'ouvrir le fichier texte, d'écrire les informations à l'intérieur, ainsi que de le fermer.
1. Création de la classe GestionnaireErreur▲
Il s'agit là d'une classe toute simple dotée d'un seul attribut et de trois méthodes publiques.
Attribut privé
- oFichierLog
Méthodes publiques
- Instancier
- EnregistrerErreur
- Fermer
1-A. Manipuler un fichier texte▲
Il existe plusieurs techniques pour manipuler les fichiers texte. Il est ainsi possible d'utiliser des fonctions VBA (Open, Print), des fonctions de l'API Windows ou bien encore les objets TextStream de la référence Microsoft Scritping Runtime.
Celle retenue ici sera l'utilisation des TextStream. La raison est assez simple. Les opérations effectuées sur les fichiers texte avec les fonctions Open et Print de VBA ne sont pas instantanées. Les modifications sont apportées en mémoire mais ne sont écrites qu'à la fermeture du fichier texte. Autrement dit, cela vous obligerait à fermer et ouvrir le fichier texte à chaque inscription d'une erreur. Quant aux fonctions de l'API Windows, leur programmation est beaucoup trop compliquée pour le résultat escompté. Il est de loin préférable de tirer partie des possibilités offertes pas les objets TextStream.
Il vous faut donc ajouter la référence Microsoft Scripting Runtime à votre projet.
Insérez ensuite un nouveau module de classe à votre projet VBA et sauvegardez le sous le nom de GestionnaireErreur.
1-B. Ouverture du fichier texte▲
L'ouverture du fichier texte se fait lors de l'appel de la méthode Instancier de l'objet GestionnaireErreur. Cette méthode reçoit donc le nom du fichier comme paramètre. Une fois le fichier ouvert, l'objet TextStream résultant est affecté à la variable privée oFichierLog à l'aide de la méthode OpenTextFile de l'objet FileSystemObject.
Public
Sub
Instancier
(
strnomfichier As
String
)
On
Error
GoTo
GestionErreur
'Instancie un objet FileSystemObject
Dim
oFso As
New
FileSystemObject
'Ouvre le fichier texte en mode ajout
Set
oFichierLog =
oFso.OpenTextFile
(
strnomfichier, ForAppending, True
)
GoTo
Fin
GestionErreur
:
MsgBox
"Impossible d'instancier le gestionnaire d'erreurs"
, vbCritical
Fin
:
End
Sub
1-C. Ecriture dans le fichier texte▲
Une fois l'objet TextStream instancié, il est possible d'appeler sa méthode WriteLine afin d'écrire une nouvelle ligne dans le fichier texte.
Cette opération est exécutée par la procédure EnregistrerErreur. Elle reçoit comme paramètre le numéro de l'erreur à enregistrer, sa description ainsi que le nom de la procédure qui l'a déclenchée.
Public
Sub
EnregistrerErreur
(
intErrNumber As
Integer
, _
strErrMessage As
String
, Optional
strNomProc =
""
)
On
Error
GoTo
GestionErreur
If
Not
oFichierLog Is
Nothing
Then
oFichierLog.WriteLine
"["
&
Now
&
"] Procédure : "
&
_
strNomProc &
" -> "
&
intErrNumber &
":"
&
strErrMessage
Else
MsgBox
"Le gestionnaire d'erreur n'est pas instancié"
, vbCritical
End
If
GoTo
Fin
GestionErreur
:
MsgBox
"Impossible d'écrire dans le fichier du gestionnaire d'erreur."
, vbCritical
Fin
:
End
Sub
1-D. Fermeture du fichier▲
La fermeture du fichier texte est une étape à ne pas oublier pour éviter les conflits en écriture sur celui-ci. Il est primordial que le fichier soit déverrouillé à la fermeture de votre application.
Pour cela deux méthodes ont été envisagées. Une fermeture explicite et une autre implicite.
La fermeture explicite se fera à l'aide de la méthode Fermer de l'objet GestionnaireErreur. Celle implicite se fera à la destruction de l'objet via la méthode Class_Terminate prédéfinie en VBA et automatiquement invoquée par le programme lors de la destruction de l'objet. Cette méthode implicite est impérative pour traiter le cas d'un arrêt critique de votre application.
Pour ne pas écrire deux fois le même code, la méthode Fermer consistera en un simple appel de la méthode Class_Terminate.
Public
Sub
Fermer
(
)
Class_Terminate
End
Sub
Private
Sub
Class_Terminate
(
)
On
Error
GoTo
GestionErreur
oFichierLog.Close
Set
oFichierLog=
Nothing
GestionErreur
:
End
Sub
2. Utilisation de l'objet GestionnaireErreur dans votre application▲
2-A. Instanciation d'un nouvel objet au démarrage▲
L'instanciation de l'objet se fera via une macro dont la seule action sera d'éxecuter du code placé dans un module.
Ajoutez un nouveau module à votre projet (un module simple, pas un module de classe), et placez-y le code suivant :
Public
oGestErreur As
GestionnaireErreur
Public
Function
Macro_Autoexec
(
)
Dim
strLogFileName As
String
'Récupère le nom du fichier de base de données et lui ajoute l'extension .log
strLogFileName =
Left
(
CurrentDb.Name
, Len
(
CurrentDb.Name
) -
4
) &
".log"
Set
oGestErreur =
New
GestionnaireErreur
oGestErreur.Instancier
strLogFileName
End
Function
Cette fonction instancie un nouvel objet GestionnaireErreur nommé oGestErreur. Cet objet est public, il sera donc disponible depuis n'importe quelle procédure de votre projet.
Pour que ce code soit exécuté automatiquement au démarrage de votre application, créez une macro nommée AutoExec (le simple fait de lui donner ce nom fera que son lancement sera automatique dès l' ouverture de l'application.
- Action : ExécuterCode
- Nom Fonction : Macro_Autoexec()
2-B. Utilisation dans les procédures du projet▲
L'utilisation est très simple. Là où vous avez mis en place une gestion d'erreurs via On Error, il suffit de faire un appel à la méthode EnregistrerErreur de l'objet oGestErreur.
Avant :
Sub
test
(
)
On
Error
GoTo
GestionErreur
Dim
i As
Integer
i =
10
/
0
GoTo
Fin
GestionErreur
:
Select
Case
err
.Number
Case
11
: MsgBox
"Division par zéro"
, vbCritical
Case
Else
: MsgBox
"Erreur inconnue"
, vbCritical
End
Select
Fin
:
End
Sub
Après :
Sub
test
(
)
On
Error
GoTo
GestionErreur
Dim
i As
Integer
i =
10
/
0
GoTo
Fin
GestionErreur
:
Select
Case
err
.Number
Case
11
: MsgBox
"Division par zéro"
, vbCritical
Case
Else
: MsgBox
"Erreur inconnue"
, vbCritical
End
Select
'Enregistre l'erreur dans le fichier de log
oGestErreur.EnregistrerErreur
err
.Number
, err
.Description
, "Test()"
Fin
:
End
Sub
Le fichier d'erreur ressemblera alors à :
[11/12/2005 14:57:00] Procédure : Test()-> 11:Division par zéro
Conclusion▲
Cette méthode de gestion d'erreurs est quelque peu simpliste mais constitue une bonne base pour les développeurs effectuant leurs premiers pas sur Microsoft Access. Une historisation beaucoup plus complète peut en être dérivée en incluant par exemple les valeurs de certaines variables critiques de votre projet. C'est à vous de personnaliser cette approche afin de réaliser un traitement qui saura correspondre à vos besoins.
Je tiens à remercier Jean-Philippe Ambrosino et Olivier Lance pour leur relecture et leurs corrections.