9-Charger La Source D
9-Charger La Source D
9-Charger La Source D
Dans cette formation Visual Basic Access, nous souhaitons préparer une application
qui permettra d'évaluer les candidats avec des questionnaires à choix multiples. Ici
nous nous contenterons de développer le formulaire d'accueil qui permettra à
l'utilisateur de choisir, par le biais d'une liste déroulante, le questionnaire sur lequel il
souhaite être évalué.
Ces questionnaires dépendent des noms des tables Access dans lesquelles ils ont été
bâtis et archivés. Au chargement du formulaire, un code VBA Access doit donc
parcourir toutes les tables de la base de données, afin de prélever leur nom et de les
charger dans une liste déroulante de choix. Au clic de l'utilisateur sur l'un des
questionnaires ainsi proposés, le QCM doit débuter par le biais d'un autre formulaire,
chargé dynamiquement des questions et choix de la table correspondante.
C'est tout l'enjeu du code que nous devons développer. Il s'agit certes de charger le
contenu d'une liste déroulante par le code Visual Basic Access. Mais il ne s'agit pas
de n'importe quel contenu, puisque nous devons être capables de récupérer les
informations de tables et plus précisément, leur nom.
La capture suivante, illustre les tables qui composent la base de données et archivent
les questionnaires. Il s'agit certes de QCM anciens mais qui feront très bien l'affaire
pour développer l'application Access.
Le numéro de cette librairie 6.1 peut dépendre de la version Office installée sur votre
poste.
La variable i servira de compteur pour insérer chacun des noms de table prélevés,
dans le tableau de valeur précédemment déclaré. Nous l'initialisons donc à zéro, soit
sur l'indice du premier élément à insérer. Les variables nom_table et
nom_champ stockent respectivement le nom de la table temporaire et de son champ
dans lequel seront ajoutés les titres des questionnaires. Enfin, nous initialisons
la variable objet la_base grâce au mot clé Set sur la base de données en cours. C'est
la méthode CurrentDb de l'objet VBA Access Application qui permet de pointer sur
la base de données courante.
Nous devons désormais parcourir toutes les tables de la base de données. Pour ce
faire nous devons exploiter la variable objet chaque_table afin de parcourir et
d'accéder à la définition de chacune d'elle. Et pour parcourir chacun de ces objets,
nous devons utiliser une boucle For Each.
En conséquence, ajouter les bornes de la boucle For Each comme suit :
For Each chaque_table In la_base.TableDefs
Next
Une boucle For Each se borne avec le mot clé Next. Les éléments parcourus se
situent à droite du mot clé In dans la syntaxe de la boucle. La propriété
TableDefs d'un objet base de données est une collection qui permet d'accéder à
toutes les tables qu'elle contient. L'élément à gauche du mot clé In doit être du
même type que le groupe parcouru. C'est pourquoi nous avions déclaré l'objet
chaque_table comme un TableDef.
Les tables système ne sont pas visibles par l'utilisateur mais sont accessibles par le
code. Il faut donc les exclure du traitement. Nous devons réaliser un test sur le nom
de chacune des tables dans la boucle, grâce à une instruction conditionnelle If pour
vérifier la condition. Le nom des tables système commence toujours par les trois
lettres Msy.
Dans la boucle, ajouter le test pour exclure les tables système du traitement :
If UCase( Left( chaque_table.Name, 3)) <> 'MSY' And Left( chaque_table.Name, 1) <>
'~' And chaque_table.Name <> 'Liste_tables' Then
End If
Si ces trois conditions sont vérifiées, nous savons que les tables restantes
correspondent bien aux questionnaires dont nous souhaitons prélever les noms. Pour
nous en assurer, nous allons réaliser un test grâce à la fonction MsgBox qui permet
d'afficher un message à l'écran.
Dans les bornes de l'instruction If de la boucle For Each, ajouter la ligne de code
suivante :
MsgBox chaque_table.Name
Enregistrer les modifications (CTRL + S),
Basculer sur le formulaire Access (ALT + F11),
Exécuter ce dernier (F5),
Ainsi, nous stockons chacun des noms prélevés (chaque_table.Name) dans une ligne
du tableau de valeur (tabval(i) = chaque_table.Name) après avoir incrémenté l'indice
qui permet de désigner la position (i = i + 1).
Avant de pouvoir stocker ces informations dans la table temporaire, nous devons
commencer par la supprimer, si elle a été générée par une précédente ouverture du
formulaire. Comme elle est exclue du traitement par le critère de l'instruction
conditionnelle If, nous devons ajouter cette nouvelle ligne de code après le End If,
mais toujours dans la boucle.
Après le End If mais avant le Next qui clôture la boucle, ajouter la ligne suivante :
If chaque_table.Name = nom_table Then
la_base.TableDefs.Delete nom_table
L'instruction If permet de vérifier si le nom de la table est bien celui de la table
prévue pour stocker tous les noms de questionnaires (nom_table). Si c'est le cas,
la méthode Delete de la propriété TableDefs de l'objet de base de données
la_base permet de supprimer cette table, en lui passant en paramètre, son nom
mémorisé par la variable.
Le mot clé Set est utilisé une fois de plus pour initialiser et instancier les objets de
base de données qui avaient été déclarés à cet effet. Ainsi la méthode
CreateTableDef de l'objet base de données permet de créer une table du nom passé
en paramètre. Mais ce n'est pas suffisant, une table doit avoir au moins un champ
typé. Et la création du champ comme celle de la table doivent être confirmées par
des méthodes VBA précises. C'est pourquoi nous exploitons la méthode
CreateField de l'objet fraîchement instancié afin de créer le champ nécessaire passé
en paramètre (nom_champ), avec son type (dbText) et sa longueur (25).
Enfin, comme nous l'avions appris dans la formation VBA pour archiver les données
de base Access, le mot clé Nothing permet de décharger ces objets, qui ne sont plus
exploités. Enfin, maintenant que la table est créée, nous devons y accéder par le
code, pour ajouter les enregistrements, dont les informations sont contenues dans le
tableau de valeur.
Nous allons tester que ces lignes de code ont bien permis de créer la table à la volée.
Enregistrer les modifications (CTRL + S),
Basculer sur le formulaire Access (ALT + F11) et exécuter ce dernier (F5),
A notre grande surprise, une erreur est générée. Il s'agit d'une incompatibilité de
type. Aussi étonnant que cela puisse paraître, c'est la référence à la
librairie Microsoft ActiveX Data Objects qui pose conflit. Nous devons la désactiver et
adapter les déclarations des variables objets afin d'accéder seulement aux classes
nécessaires, afin que tout conflit soit levé.
Cliquer sur le bouton Réinitialiser en haut de l'éditeur de code pour stopper
l'exécution,
Dérouler le menu Outils et cliquer sur Références dans la liste,
Décocher la case Microsoft ActiveX Data Objects 6.1 Library,
Ajouter le préfixe DAO dans la déclaration des variables d'objets de base de données :
Dim la_base As DAO.Database
Dim chaque_table As DAO.TableDef
Dim tabval(20)
Dim i As Integer, j As Integer
Dim nouvelle_table As DAO.TableDef : Dim nouveau_champ As DAO.Field : Dim
nouvel_enregistrement As DAO.Recordset
Dim nom_table As String, nom_champ As String
Enregistrer les modifications (CTRL + S),
Basculer sur le formulaire Access (ALT + F11) et exécuter ce dernier (F5),
Nous n'avons plus besoin des objets de base de données. Afin de coder proprement
nous devons les décharger.
Ajouter les lignes permettant de vider les variables objets de base de données de la
mémoire :
Set nouvel_enregistrement = Nothing
Set la_base = Nothing
Enregistrer les modifications (CTRL + S),
Basculer sur le formulaire Access (ALT + F11) et l'exécuter (F5),
Double cliquer sur le nom de la table ListeTables depuis le volet des objets Access,
Nous devons d'abord définir quelle est la nature de la source de données pour la liste
déroulante, comme si nous le faisions depuis la feuille de propriétés du formulaire.
C'est la propriété RowSourceType de l'objet zone de liste qui, affecté à la valeur
Table/Requête, permet d'indiquer que la source est une table. Alors, sa propriété
RowSource, affectée au nom de la table établit le lien.
Enregistrer les modifications, basculer sur le formulaire et l'exécuter,
Le lien est cette fois établi. Le code permettant de charger le contenu d'une zone de
liste avec les noms de tables de la base de données, a fonctionné. Cependant, si vous
cliquez sur l'un des sujets, rien ne se produit pour l'instant. Nous n'avons pas encore
écrit le code permettant de transmettre les informations nécessaires au formulaire
question, afin qu'il charge la table correspondante du QCM. C'est l'objet de la
prochaine formation permettant de modifier des données d'un formulaire depuis un
formulaire externe. Ainsi petit à petit, nous allons monter l'application finale qui
permettra d'évaluer les candidats selon leur choix de questionnaire.