FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Comment mettre un point d'arrêt dans mon code ?
- Qu'est-ce que la fenêtre de débogage ?
- Comment déboguer une requête générée par code ?
- Que faire si une erreur de compilation : « Projet ou bibliothèque introuvable. DLL manquante » est levée ?
- Pourquoi une erreur d'exécution 94 : « Utilisation incorrecte de Null » ?
- Pourquoi une erreur de compilation : « Type défini par l'utilisateur non défini » ?
- Pourquoi une erreur : « Fonction ou variable attendue » ?
- Pourquoi le message d'erreur : « Type de données incompatible dans l'expression du critère » ?
- Comment écrire une fonction de gestion des messages d'erreur ?
- Pourquoi le message d'erreur : « Fonction non définie dans l'expression » ?
- Comment afficher la liste des propriétés d'un objet dans l'éditeur VBA au cours de la frappe (après un .) ?
- Comment obliger ma barre de progression à se rafraîchir ?
- Pourquoi le message : « Vous avez écrit une sous-requête pouvant renvoyer plus d'un champ sans utiliser le mot réservé EXISTS dans la clause FROM de la requête principale » ?
- Pourquoi l'éditeur VBA ignore-t-il mes points d'arrêt pendant l'exécution de mon code ?
- Comment afficher la fenêtre "Debug" en VBA ?
- Comment accéder à une classe d'une autre base ?
- Pourquoi l'éditeur VBA est-il lent et signale-t-il des erreurs inexistantes lors de la saisie du code ?
Un point d'arrêt dans le code permet de stopper son exécution, permettant ainsi de contrôler son bon déroulement.
Pour ajouter un point d'arrêt, placez le curseur sur la ligne concernée et appuyez sur la touche F9.
Quand l'exécution passe sur cette ligne, elle est interrompue. Vous pouvez alors décider de continuer en mode "Pas à pas" (F8) ou de reprendre une exécution normale (F5).
Lorsque vous fermez VBA, les points d'arrêt sont perdus. Pour utiliser des points d'arrêt enregistrés avec le code, utilisez l'instruction VBA Stop.
Exemple :
Msgbox
"A"
Stop
Msgbox
"B"
La fenêtre de débogage (aussi appelée fenêtre d'exécution) permet de consulter le déroulement du code VBA.
Elle permet par exemple de lancer du code VBA vous donnant ainsi la possibilité de tester le comportement de votre code.
Par exemple, la syntaxe Debug.Printvariable affiche le contenu de variable.
Pour afficher cette fenêtre, rendez-vous dans VBA, menu Affichage, Fenêtre Exécution.
Le débogage d'une requête codée dans VBA passe bien souvent par l'utilisation de debug.print SQLdelarequête. Pour plus de détails, vous pouvez consulter le tutoriel de cafeine :
Initiation - Débogage : requêtes écrites par VBA.
Allez dans un module (page où on écrit le code VBA).
Dans la barre de menus d'Access cliquez sur Outils puis Références.
S'il manque une bibliothèque ou une DLL elle sera marquée comme telle dans la liste déroulante.
Il suffit alors de la copier dans le répertoire "system32" de l'ordinateur et de taper : REGSVR32 C:\WINDOWS\SYSTEM32\maDLL.DLL
ou REGSVR32 C:\WINDOWS\SYSTEM32\monOCX.OCX.
Le produit est alors enregistré dans la base de registre et reconnu par le système (sous NT il faut taper WINNT au lieu de WINDOWS).
Lors de calculs, vous rencontrez fréquemment cette erreur. Elle survient souvent lorsqu'une des variables composant le calcul a la valeur Null.
Pour que le calcul ne prenne pas en compte le champ vide en question, et ainsi éviter ce message, il suffit d'utiliser la fonction Nz().
Cette fonction est également utilisable dans les requêtes SQL.
Exemple :
MsgBox
Nz
(
ZoneDeTexte) +
1
Ce message d'erreur apparaît par exemple sur :
Dim
labase As
DAO.Database
Il s'agit probablement d'une dll manquante.
Dans le code VBA : allez dans le menu "Outils/références" et cochez Microsoft DAO 3.x Object library.
Lien : Pourquoi une erreur d'exécution '13' « Incompatiblité de type » ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Il ne faut mettre les '()' que lorsque vous attendez un résultat à utiliser ultérieurement.
Ainsi quand vous écrivez :
MaFonction
(
Paramètre1, Paramètre2)
Vous lui demandez de renvoyer une valeur, mais vous ne lui dites pas où mettre ce résultat.
Il est plus correct d'écrire :
Result =
MaFonction
(
Paramètre1, Paramètre2)
En effet une fonction renvoie une valeur, il faut donc la stocker quelque part. Ici, le résultat est stocké dans la variable Result.
Si vous n'attendez pas de réponse, il suffit de ne pas mettre les parenthèses :
MaProcedure txtErreur, txtErreurVar
Ceci fonctionne également pour les MsgBox().
Si vous utilisez un Recordset et la bibliothèque DAO :
dans un module (là où vous tapez le code VBA), faites : Outils/références et cochez Microsoft DAO 3.x Object Library.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
'Permet d'afficher l'ensemble des erreurs de l'application par ce biais
Public
Sub
SUB_Display_Error
(
intErrNumber As
Integer
, strErrDescription As
String
_
, strErrSource As
String
, strErrModule As
String
, strErrFonction As
String
)
On
Error
GoTo
SUB_Display_Error
MsgBox
"Erreur : "
_
&
intErrNumber &
Chr
(
13
) &
" Description : "
_
&
strErrDescription &
Chr
(
13
) &
" Source : "
&
strErrSource &
Chr
(
13
) &
_
" Module : "
&
strErrModule &
Chr
(
13
) &
" Fonction : "
&
_
strErrFonction, vbCritical
Exit
Sub
SUB_Display_Error
:
MsgBox
"Erreur : "
&
Err
.Number
&
Chr
(
13
) &
"Description : "
&
Err
.Description
&
Chr
(
13
) &
_
"Source : "
&
Err
.Source
&
Chr
(
13
) &
_
"Module : General_Module Démarrage"
&
Chr
(
13
) &
_
"Fonction : Public Sub SUB_Display_Error(intErrNumber As "
&
_
"Integer, strErrDescription As String, strErrSource As String, "
&
_
"strErrModule As String, strErrFonction As String)"
, vbCritical
End
Sub
Ceci peut être provoqué par un problème de références, par exemple lors de l'utilisation d'un autre PC alors que tout fonctionne bien sur le poste d'origine.
- Allez dans un module.
- Allez dans Outils/Références.
- Décochez les références marquées "MANQUANTE" (s'il y en a).
- Recochez les références que vous devriez avoir (si vous en avez décoché).
- Décochez au minimum une référence et validez la boîte de références, avant d'aller la recocher...
Ceci est une option normalement activée par défaut. Pour l'activer, si elle ne fonctionne pas, allez dans VBA, puis dans le menu Outils, Option, cocher la case Complément automatique des instructions.
Souvent la barre de progression fonctionne très bien du moment que le traitement n'est pas trop gros. Si ça dépasse un certain temps, le curseur de la souris se change en sablier, la fenêtre ne se met plus à jour et la barre de progression non plus.
Un simple DoEvent dans le code avant Mise à jour de la barre de progression arrangera cela.
Ce message d'erreur peut s'afficher lorsque vous travaillez avec des requêtes imbriquées.
La règle est que la sous-requête imbriquée ne doit sélectionner qu'un seul champ (celui sur lequel s'applique la condition).
Vérifiez que les touches spéciales d'accès sont disponibles.
Pour cela :
Menu Outils/Démarrage, la case Utiliser les touches spéciales d'accès doit être cochée.
Vous pouvez utiliser la méthode suivante :
DoCmd.RunCommand
acCmdDebugWindow
Pour référencer les objets d'une autre base (base A) dans une base B, il faut lui établir une référence. Dans VBA (menu Outils/Références...).
Une fois la référence établie, vous verrez que vous avez accès à tous les modules normaux mais pas aux modules de classe.
Pour résoudre ce problème vous devez :
1. Modifier la portée de la classe pour la rendre publique.
Dans l'IDE VBA, sélectionnez la classe, et dans la fenêtre des propriétés, modifiez la propriété [Instancing] avec la valeur [2. PublicNotCreatable].
Access permet de choisir entre les portées [Private] Ou [Public not creatable].
Cette dernière signifie que les instances de la classe peuvent être utilisées par
n'importe quelle application Access qui référence la base A, avec une grosse limitation :
seul le code contenu dans la base A est autorisé à instancier la classe (en clair, l'instruction New clsTest n'est pas valide en-dehors de la base A) ;
2. Étant donné que la classe n'est pas instanciable ailleurs que depuis A, il faut créer
une méthode publique dans un module (pas un module de classe) qui instanciera l'objet et retournera une référence vers celui-ci.
C'est cette méthode qui sera appelée dans B.
Dans A :
Public
Function
NewTitre
(
) As
clsTitre
Set
NewTitre =
New
clsTitre
End
Function
Dans B :
Function
test
(
)
Dim
oTitre As
clsTitre
Set
oTitre =
Newtitre
(
)
End
Function
Parce que du code VBA est en cours d'exécution.
Ceci peut arriver quand une procédure événementielle est exécutée, suite au déclenchement de l'événement Timer d'un formulaire, ou encore s'il y a un appel à une procédure de l'application Access via OLE automation.
Dans l'environnement de développement Visual Basic (IDE) la barre de titre affiche [Exécution en cours] pour signaler que du code est en cours d'exécution.