Você está na página 1de 253

Informatique

Synthèse
de cours
&
exercices
corrigés

Access 2007
Microsoft®
®

et VBA

Les fonctionnalités pour créer des bases


de données performantes

Des dizaines d’exemples et d’exercices


avec leurs corrigés détaillés

Les fichiers sources des exercices disponibles


à l’adresse www.pearson.fr

collection
Synthex

Bernard MINOT
Access Livre Page I Mercredi, 27. f vrier 2008 7:28 07

Informatique

Synthèse
de cours
& exercices
corrigés

Access 2007 ®

et VBA
Bernard Minot
université Paris-Est

Avec la relecture de Jean-Michel Léry


université Paris-Est

collection
Synthex
Access Livre Page II Mercredi, 27. f vrier 2008 7:28 07

ISBN : 978-2-7440-4014-6
ISSN : 1768-7616

Copyright© 2009 Pearson Education France


Tous droits réservés

Composition sous FrameMaker : TyPAO

Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚
et 3˚ a) du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson
Education France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.
Access Livre Page III Mercredi, 27. f vrier 2008 7:28 07

Sommaire

Introduction 1

Chapitre 1 • Les objets d’Access 9

Chapitre 2 • Le modèle relationnel,


concevoir une base de données 37

Chapitre 3 • Les différentes formes d’acquisition de données,


importer et attacher 65

Chapitre 4 • Les requêtes 83

Chapitre 5 • Les formulaires 123

Chapitre 6 • Les états 167

Chapitre 7 • Les macros 181

Chapitre 8 • Le langage VBA sous Access 205

Chapitre 9 • La finalisation, monter une application 235

Sommaire III
Access Livre Page IV Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 1 Mercredi, 27. f vrier 2008 7:28 07

Introduction

Positionnement d’Access dans la gamme


Microsoft
Le positionnement du programme Microsoft Access se révèle singulier à tous les points de
vue. Dans la gamme Office, en premier lieu, il est considéré comme un peu marginal,
beaucoup moins utilisé que Word, Excel et Outlook, et considéré, à tort, comme beaucoup
plus complexe. Parmi les produits de la firme de Bill Gates, ensuite, il n’est que le « petit
frère » de SQL Server, une base de données beaucoup plus puissante. Dans le monde
des bases de données, enfin, Access se singularise par une multiplicité des fonctions
peu commune.

Base de données ou produit intermédiaire ?


Access n’est pas qu’une base de données au sens strict du terme, mais un ensemble d’outils
permettant de gérer complètement une base de données, ce qui s’avère très différent.
Au-delà des tables et de leur organisation relationnelle (fonction essentielle des bases de
données), Access met à disposition un outil permettant de monter des formulaires et
de mettre en place une interface graphique avec l’utilisateur ; cet outil ne fait pas partie des
fonctions classiques d’une base de données. De la même manière, Access possède un géné-
rateur d’états qui offre au programmeur la possibilité de construire des impressions de
bonne qualité : deuxième exception. Enfin, et comme tous les produits de la gamme
Office, Access fait appel au langage VBA (Visual Basic for Application) pour la program-
mation. Ces fonctionnalités ne nous permettent plus de placer Access dans la catégorie
« base de données » au sens strict. Et pourtant, on ne peut pas classer Access parmi ce qu’il
est convenu d’appeler les ateliers de génie logiciel (AGL) qui offrent, par exemple, des
fonctions d’aide à la modélisation plus développées. Produit intermédiaire, donc, Access

Introduction 1
Access Livre Page 2 Mercredi, 27. f vrier 2008 7:28 07

se positionne au plus près des besoins des PME : ni trop complexe, auquel cas il serait
réservé aux professionnels de l’informatique, ni trop léger et voué alors à un échec
commercial certain.

Un premier pas vers la modélisation


et la gestion de tables
Access possède toutes les qualités et toute la solidité d’une bonne base de données rela-
tionnelle. Il sert très souvent comme outil de première approche aux étudiants avant que
d’autres produits tels Oracle, DB2 ou SQL Server, plus abstraits et plus puissants, ne
fassent l’objet d’études plus approfondies. L’une des caractéristiques majeures des bases de
données, en effet, réside dans la nécessité de connaître quelques aspects théoriques de la
modélisation avant que la structure de la base ne soit mise en place. Le lecteur n’échappera
donc pas, évidemment, à un large chapitre sur les fondements de la théorie relationnelle
qui gouverne la construction de tout système d’information. On aborde là les notions
élémentaires du métier informatique qui, pris au pied de la lettre et au sens noble, est la
science du traitement de l’information. Toutes les propriétés essentielles des bases de données
relationnelles, les notions de clés primaires et étrangères, l’intégrité référentielle et bien
d’autres encore sont opérationnelles sur Access et leur connaissance peut être extrapolée
sur les autres bases du marché.

Contexte professionnel d’utilisation d’Access


Les informaticiens professionnels ont parfois sur Access une opinion mitigée, regardant
avec condescendance l’une des plus petites bases de l’offre actuelle. C’est là une vision bien
étroite et dépourvue du contexte dans lequel sont utilisés ces produits. Nul besoin d’être
un spécialiste du langage SQL pour mettre en place une requête sous Access, nul besoin
d’embaucher des équipes entières : pour des besoins limités, dans un environnement
réduit, Access suffit largement à répondre à la demande de petites entités dans des structu-
res économiques à taille humaine. L’assistant à la création de requête, si la structure de la
base est adéquate, répond parfaitement à ce niveau de compétence. Il génère des requêtes
qui peuvent atteindre une complexité appréciable et donner, dans de courts délais, des
résultats extraits d’assez gros volumes.

Une approche intuitive grâce aux assistants


La création de formulaire est, elle aussi, accompagnée de nombreux assistants. Par
exemple, il suffit de dessiner une zone de texte ou une liste déroulante pour obtenir
immédiatement sa création. Là encore, et à condition que la structure soit bien conçue,
une approche intuitive peut pallier l’absence de savoir direct. En revanche, il vaudra

2 Access® 2007 et VBA


Access Livre Page 3 Mercredi, 27. f vrier 2008 7:28 07

mieux bien connaître la palette des outils à disposition (les types de contrôles dans le jar-
gon du métier) afin de choisir à bon escient celui qui sera le plus pertinent pour l’utilisa-
teur. L’esthétique des formulaires, qui peut être relativement poussée si le dessinateur veut
s’en donner la peine, comptera ici beaucoup moins que l’efficacité dans la présentation et
le traitement des données.

La programmation en Visual Basic


Le passage à la programmation, enfin, se fera graduellement, avec une escale sur les
macros. Fondamentalement différentes de celles d’Excel, les macros d’Access sont une
simple mise en place et enregistrement sur interface graphique d’actions préprogram-
mées. Elles peuvent être insérées directement dans l’ensemble des autres éléments de la
base mais gagnent à être traduites en langage Visual Basic. Dès lors, le programmeur
débutant lit à la fois le déroulement des actions qu’il veut générer et le code VB qui s’y
associe. Le pied à l’étrier, il ne lui reste plus qu’un effort sémantique à faire pour accéder à
la programmation proprement dite. C’est tout ce chemin qui sera parcouru dans les lignes
qui viennent. Qu’il soit bien clair, toutefois, que l’ouvrage ne prétend pas faire du lecteur
un programmeur en 256 pages !

Nouveautés d’Access 2007


Les nouveautés d’Access 2007 par rapport à ses versions antérieures ne sont pas négli-
geables. Si les principes fondamentaux de la théorie relationnelle restent constants
(comment pourrait-il en être autrement !), les changements sur la forme et le fond
sont conséquents.

En premier lieu, mais l’utilisateur ne le verra pas, le moteur de base de données Microsoft
Jet des versions 2003 et antérieures a été remplacé par ADE (Access Data Engine) ; l’une des
conséquences de cette évolution se constate dans le changement de type de fichier
(« .accdb » à la place de « .mdb »), qui rend toutes les versions antérieures incompatibles.
Access 2007 peut lire les fichiers « .mdb » mais Access 2003 ne lit pas les fichiers « .accdb ».
L’utilisateur aura donc tout intérêt à transférer ses bases au nouveau format, avec les
nombreuses implications visuelles que cela entraîne.

À l’image d’Excel et de Word, en effet, Access 2007 se singularise par un changement


radical du haut de l’écran. Le ruban, large zone remplie d’icônes, prend la place des sous-
menus que l’utilisateur connaissait depuis toujours. Avec la base de données, cette évolu-
tion a une double portée, qui nécessitera des adaptations : non seulement l’utilisateur
devra s’habituer à ce nouveau cadre de travail (comme dans les autres produits Office),
mais le programmeur Access, quant à lui, devra réécrire toutes les procédures de menus et
sous-menus pour mettre à jour les applications déjà développées.

Introduction 3
Access Livre Page 4 Mercredi, 27. f vrier 2008 7:28 07

Et sur ce point, les concepteurs d’applications Access ne seront pas aidés par le nouveau
produit : alors que la version 2003 était dotée d’un assistant graphique fort commode
pour réaliser rapidement des menus complets, le nouvel outil, qui utilise désormais le
langage XML, nécessite la saisie manuelle du code sur un éditeur externe à Access !
Autre innovation, le volet de navigation, à gauche de l’écran, présente tous les objets de la
base et peut, le cas échéant, devenir une forme de menu général (en plus de la barre de
menu et des rubans). L’ergonomie générale des applications développées s’en trouvera
donc fortement modifiée, même si ce volet peut être rétractable.
Alors qu’Access 2003 présentait toujours ses éléments en pleine page, la version 2007 offre
la possibilité d’ouvrir simultanément de nombreux documents et de les présenter sous
forme d’onglets supérieurs, un peu à la manière des onglets bas d’Excel. Le graphisme
général a ainsi été profondément modifié, le plus souvent en mieux : les zones de date, par
exemple, sont désormais systématiquement associées à un petit calendrier, alors que tou-
tes les colonnes peuvent être triées et filtrées avec les mêmes menus contextuels que sous
Excel.
Les assistants à la création d’objets (requêtes, formulaires, états) ont été poussés à tel point
qu’un simple clic suffit désormais à une génération immédiate, sans même d’étapes de
conception, devenues seulement optionnelles. Microsoft insiste là sur la capacité d’Access
à monter très vite de petits projets d’entreprise : il s’agit du créneau essentiel d’utilisation
du produit.
Tout au contraire, Microsoft n’insiste plus sur la mise en ligne sur Internet des projets
Access, secteur dans lequel d’autres concurrents, notamment du monde libre avec des
produits comme MySQL, ont largement pris de l’avance. En revanche, tous les pro-
duits Office peuvent désormais partager des données sur un site SharePoint sous Win-
dows Server 2003, publié sur Internet. Cette nouvelle notion permet de partager et de
synchroniser, par exemple, des tables communes à tous les services d’une petite entre-
prise.
La taille maximale d’un fichier « .accdb », enfin, est maintenue à 2 Go, comme dans les
versions antérieures, limitant par là les velléités de projets inadaptés. À l’inverse
d’Excel, qui a multiplié par 1 000 le nombre de cellules d’une feuille, Access reste donc
contraint dans son ancienne volumétrie : les projets plus ambitieux devront passer à
SQL Server !

Structure de l’ouvrage
Le dessin général du livre reprend, très classiquement, l’ordre dans lequel est construite
une base de données. Mais nous avons inséré des points sur lesquels il nous semble indis-
pensable d’insister.
Le premier chapitre part à la découverte du produit via une base de données fournie par
Microsoft pour répondre aux questions du néophyte. Quels sont les éléments constituant
une base de données ? Comment lie-t-on tous ces éléments entre eux ? À la découverte du
vocabulaire se joint une réflexion sur la manière dont se construit un système d’infor-
mation.

4 Access® 2007 et VBA


Access Livre Page 5 Mercredi, 27. f vrier 2008 7:28 07

Fondamentale, la modélisation couvre une bonne partie du deuxième chapitre avec de


multiples exemples et un fort accent mis sur la méthode, sans pour autant tomber dans
une abstraction excessive. L’expérience montre, en effet, que d’innombrables bases de
données sont créées dans les PME (qui constituent, rappelons-le, l’essentiel du tissu
économique du pays) avec de nombreuses erreurs de conception qui les rendent peu
exploitables. Il y a, sur ce point, de réels efforts à fournir pour pouvoir mieux stocker
l’information et mieux la faire circuler.
Création et utilisation des tables, des requêtes, des formulaires et des macros forment
la suite logique et l’essentiel de l’ouvrage. À chaque fois, la synthèse de cours fait appel
à des exemples rapidement fournis, au détriment du discours mandarinal : suffisam-
ment simples, ils visent directement le thème du cours sur un mode démonstratif ;
suffisamment volumineux, ils montrent en grandeur nature la problématique rencontrée en
entreprise.
Reprenant l’objectif ouvertement affiché par Access de RAD (Rapid Application Develop-
ment), l’exposé est conçu pour permettre des mises au point rapides sur des solutions
« légères ». L’informaticien professionnel n’y trouvera donc pas son compte de… com-
plexité. On préférera passer plus de temps à réfléchir sur le papier dans le cadre d’un
échange utilisateur/concepteur sur les éléments de base (tables, relations, maquettes
d’écrans et d’états), et moins de temps sur le clavier et la souris.
Le chapitre entièrement consacré à VBA se base, initialement, sur la conversion automati-
que des macros. Considérant que le lecteur a déjà, au moins, une petite expérience des
autres produits de la gamme Office, il aborde le sujet comme si la même approche a déjà
été pratiquée avec Excel, par exemple. Cela permet de découvrir des sujets peu étudiés
dans les courts ouvrages publiés en la matière, mais qui ouvrent des voies très larges pour
des projets plus ambitieux.
Le dernier chapitre, enfin, décrit rapidement la démarche à adopter pour mettre en place
une application : les changements dans la nouvelle version d’Access n’épargneront donc
pas un détour par XML.
Tous les chapitres sont divisés en deux parties à parts égales, les exercices et leur correction
prenant donc une proportion considérable. Chaque exercice reprend une partie du cours
et l’applique dans un contexte différent, mais de nouvelles manières de procéder sont éga-
lement introduites. L’ensemble des exercices porte sur une même base de données mise à
disposition sur le site des éditions Pearson : www.pearsoneducation.fr.

Périmètre de l’ouvrage
Toutes les fonctionnalités et tous les détails d’Access ne sont pas passés en revue. Il ne s’agit
pas d’une encyclopédie inventoriant l’exhaustivité des possibilités offertes : il faudrait
pour cela un ouvrage beaucoup plus volumineux, que d’autres ont déjà fait, qui servirait plus
de référentiel occasionnel que de livre de travail et d’études.
Tout au contraire, il nous a été difficile de ne pas aborder certains sujets un peu moins
importants : après arbitrage, le livre contient l’essentiel des fonctions utilisées généra-
lement et, parmi celles-ci, de très simples comme d’assez complexes.

Introduction 5
Access Livre Page 6 Mercredi, 27. f vrier 2008 7:28 07

Dans la partie relative à la programmation en langage Visual Basic, il nous a paru plus
important d’insister sur l’utilisation du langage SQL via VBA et sur la notion de jeu
d’enregistrements qui ouvre la voie à de nombreux programmes, plutôt que sur la partie
boucles ou gestion des entrées/sorties.

À qui s’adresse ce livre


Au premier chef, les étudiants de tous niveaux trouveront ici les bases nécessaires pour
démarrer d’un bon pied la conception et la création d’un petit système d’information. La
partie relative à la modélisation leur permettra d’éviter les pièges les plus répandus et celle
portant sur VBA confortera leur initiation à la programmation. Le reste de l’ouvrage leur
donnera un large panorama des fonctionnalités du produit.

De nombreux professionnels liront aussi ces lignes avec intérêt, et en particulier :

• ceux qui pratiquent déjà Access et profitent de la version 2007 pour approfondir leurs
connaissances ;
• ceux qui pratiquent déjà Access et ressentent le besoin d’un appui pour passer à la nouvelle
version, en particulier pour mettre à jour les bases de données déjà conçues ;
• tous les professionnels qui, de près ou de loin, ont besoin de mettre en place de petites
bases de données dans le cadre de leur métier de gestionnaire, dans la plus large acception
du terme.

Les suppléments
Les fichiers des exercices et des exemples, au format source « .accdb », sont téléchargeables
sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr. Le lecteur pourra les mettre
en œuvre pour son apprentissage, mais aussi les compléter et se constituer ainsi sa propre
base d’exemples.

L’auteur
Bernard Minot est professeur associé (PAST) à l’université Paris-Est. Docteur en histoire
économique, diplômé d’audit informatique et Certified Information Systems Auditor, il
dirige également un cabinet d’audit informatique. Sa mission à l’université consiste à
rapprocher les mondes universitaire et professionnel ; dans ce cadre, il assure un ensei-
gnement sur la mise en pratique des tableurs et des bases de données, ainsi que sur l’audit
informatique.

6 Access® 2007 et VBA


Access Livre Page 7 Mercredi, 27. f vrier 2008 7:28 07

Remerciements
Remerciements à Jean-Michel Léry, relecteur méthodique et efficace, pour son assistance.
Une attention toute particulière pour Caroline Rimbault-Minot et sa constante
complicité.

Introduction 7
Access Livre Page 8 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 9 Mercredi, 27. f vrier 2008 7:28 07

Les objets d’Access


1
Chapitre

1. Les éléments essentiels


En vue de simplifier la terminologie, on parle géné-
de la base............................... 10 riquement de la « base de données Access » pour
Problèmes et exercices
désigner l’ensemble du logiciel. En fait, Access
1. Créer un client
et une commande .................... 25 n’est pas qu’une simple base de données, mais
2. Pratiquer un réassort................ 28
plus exactement un ensemble d’objets beaucoup
3. Analyser les processus
et les états ............................... 31 plus large et dont le cœur est constitué par une
4. Analyser les données ............... 33
base de données. Ce premier chapitre commence
5. Retoucher un formulaire
en mode création .................... 35 par décrire sommairement l’ensemble des objets
contenus dans la base, puis aborde l’utilisation du
produit en se limitant à la gestion d’une base exis-
tante. Il existe, en effet, deux manières d’utiliser le
produit : soit manipuler les données contenues
dans des objets existants (le contenu), soit créer et
modifier la structure elle-même, les objets de la
base (le contenant).

9
Access Livre Page 10 Mercredi, 27. f vrier 2008 7:28 07

(1) Les éléments essentiels de la base


Quelle que soit la manière d’aborder la base de données, il est indispensable, en premier
lieu, d’identifier chacun des objets qu’elle contient afin d’accéder rapidement à l’outil
voulu. En vue d’énumérer et d’exposer brièvement la nature de chacun d’entre eux, la
base exemple de Microsoft « Northwind » est employée ici après avoir été mise en place.
Pour ce faire, démarrez Access (Démarrer > Tous les programmes > Micro-
soft Office > Microsoft Office Access 2007). La grille-écran représentée à la figure 1.1
apparaît.

Figure 1.1
Démarrage
d’Access.

• Le pavé central permet de choisir parmi des bases de données « prêtes à l’emploi »
concernant des domaines variés (Contacts, Etudiants, etc.).
• L’icône en haut à gauche du pavé central permet de créer un fichier vide qui contiendra
ultérieurement tous les objets que l’on créera.
• La partie droite de l’écran permet d’ouvrir des fichiers déjà créés ou des bases récemment
utilisées.
La base de données à sélectionner se trouve sous le libellé « Exemple » de la partie de gauche
de l’écran et s’appelle « Northwind ».
1. Cliquez sur « Exemple » à gauche.
2. Cliquez sur « Northwind ».
3. Cliquez sur le bouton « Créer » en bas à droite après avoir noté le chemin où sera créé
le fichier Northwind.accdb 1.
4. Une boîte message propose la connexion sous un nom d’utilisateur : prendre celui par
défaut et cliquer sur Connexion.

1. Dans une configuration Microsoft Vista, le fichier est inséré sous C:\Users\Nom_Utilisateur\Documents ; dans une configuration
Microsoft XP, il sera sous C:\Documents and Settings\Nom_Utilisateur\Mes documents.

10 Access® 2007 et VBA


Access Livre Page 11 Mercredi, 27. f vrier 2008 7:28 07

Figure 1.2
L’accueil dans la base de données se visualise comme à la figure 1.2.
1
Chapitre

Barre de Barre d’outils


menu Ruban d’accès rapide
Principaux éléments
de l’organisation
d’Access.

Volet de navigation Formulaire d’accueil

1.1 LA BARRE D’OUTILS D’ACCÈS RAPIDE ET LE BOUTON OFFICE

Comme pour l’ensemble de la gamme Office, la présentation de la partie supérieure de


l’écran a largement évolué entre la gamme des produits Excel, Word et Access de 2003 et
celle de 2007.
La barre bleue supérieure s’appelle désormais une barre d’outils d’accès rapide et com-
porte en standard les raccourcis les plus utilisés : Enregistrer, Annuler ou Répéter Frappe,
Imprimer ou Faire un aperçu avant impression. Il est possible d’ajouter à cette barre tous
les autres raccourcis de l’application Access.
Chaque option de la barre de menu (Accueil – Créer – Données Externes – Outils de base
de Données) ne comporte plus de sous-menus comme dans les versions antérieures, mais
ouvre ce qu’on appelle un « ruban » dans lequel on trouvera de très nombreuses icônes.
Chaque ruban est composé de groupes d’icônes, tel que « Affichages – Presse-papier, etc. »
contenant chacun les icônes elles-mêmes.
On lira dans le dernier chapitre comment personnaliser les rubans, soit en les augmentant
avec des boutons personnalisés, soit en créant soi-même des menus et rubans complète-
ment nouveaux. Avant toute personnalisation, l’exhaustivité des commandes disponibles
est regroupée dans les quatre options du menu général 1.
Le bouton « Office », en haut à gauche, remplace en partie le menu « Fichier » des appli-
cations antérieures. Outre les items classiques « Ouvrir – Fermer – Enregistrer – Quitter », il
contient les options d’impression, de gestion des propriétés, d’ouverture des fichiers
récents et surtout l’accès aux options d’Access, particulièrement importantes.

1. Il n’existe pas, comme dans Word ou Excel, d’option de menu supplémentaire et spécifique « Développeur ».

Les objets d’Access 11


Access Livre Page 12 Mercredi, 27. f vrier 2008 7:28 07

1.2 LE VOLET DE NAVIGATION

La partie gauche de l’écran intègre un volet de navigation qui contient et représente tous
les objets de la base, qu’ils soient préexistants ou créés par l’utilisateur. La nature même
des objets n’est pas toujours indiquée, la seule distinction étant désormais établie par le
logo de l’objet. Fondamentalement, on retiendra donc les grandes classes suivantes,
comme elles se présentent à la figure 1.3.

Figure 1.3
Types et logos
des objets Access.

• Les tables contiennent les données stockées ; leur nombre est illimité. Ces tables peu-
vent être en relation les unes avec les autres, d’où l’expression de base de données
relationnelle.
• Les requêtes mémorisent des instructions d’interrogation des tables. On parlera dans
d’autres bases de données de « Vues ». Une requête peut être lancée à tout moment
pour obtenir des résultats soit de visualisation, soit de manipulation des données
(ajout, modification, suppression).
• Les formulaires génèrent des masques de visualisation des données. Alors que l’affi-
chage des tables n’a pour rendu qu’une grille de données (un peu comme dans un
tableur), les formulaires procurent une interface homme/machine agréable. Un formu-
laire peut être basé directement sur une table mais aussi sur une requête ; il permet
toutes les manipulations de données.
• Les états permettent les impressions ; paramétrables, ils autorisent des tris et totali-
sations des données à imprimer.
• Les macros, fondamentalement différentes de celles d’Excel, mémorisent des actions
présélectionnées. Elles peuvent être lancées directement ou bien à partir de boutons
créés dans des formulaires.
• Les modules sont des containers de code Visual Basic. Ils peuvent être écrits directement
ou résulter de la traduction de macros.
Le volet de navigation peut être caché pour laisser plus de place et de visibilité aux formu-
laires et autres objets ouverts. Cliquez sur le double chevron tourné vers la gauche pour le
faire disparaître ; il sera possible de le faire réapparaître à tout moment.

12 Access® 2007 et VBA


Access Livre Page 13 Mercredi, 27. f vrier 2008 7:28 07

Alors que cette partie gauche de l’écran était constante dans les versions d’Access anté-
rieures à 2007, elle est maintenant devenue paramétrable. L’idée consiste à permettre de
construire une sorte de menu en utilisant cette partie de l’écran et non plus la barre de menus
1
Chapitre

supérieure comme par le passé. Le volet de navigation comprend la mention « Les Comp-
toirs » en haut : il s’agit d’un libellé et d’un menu 1 créés par le programmeur pour afficher
les objets voulus. En dessous, « Clients et commandes », « Inventaires et achats » sont de
grandes rubriques contenant elles-mêmes les objets Access. Ainsi, l’objet « Les dix premières
commandes » compris dans la rubrique « Clients et commandes » est une requête, alors
que l’objet immédiatement en dessous est un formulaire. Un double-clic sur l’un de ces
objets en permet l’ouverture dans la partie droite de l’écran.
1. Cliquez sur le triangle tourné vers le bas, situé en haut à droite du Volet de Navigation.
Une zone de liste déroulante permet d’ordonner différemment les objets de la liste.
2. Cliquez sur « Type d’objet » : le volet de navigation n’affiche plus que les grandes classes
d’objets Access vues plus haut.
3. Développez les tables en cliquant sur le double chevron tourné vers le bas : vous listez
la totalité des tables contenues dans la base (voir figure 1.4).

Figure 1.4
Visualisation des
seules tables dans le
volet de navigation.

Un clic sur le triangle à droite de « Tous les objets Access » suivi du choix de « Les Comptoirs »
permet de revenir à la situation de départ.
Cette manipulation montre que le travail sur la base Northwind peut s’opérer de deux
manières :
• soit en qualité de simple utilisateur grâce aux menus de gauche tels qu’ils ont été conçus
par le programmeur ;

1. Et plus précisément une « catégorie » du volet de navigation comme on le verra plus loin.

Les objets d’Access 13


Access Livre Page 14 Mercredi, 27. f vrier 2008 7:28 07

• soit en qualité de développeur, en affichant tous les objets, même ceux qui ne sont pas
inclus dans le volet de navigation préparamétré.
Outre ces deux approches, il est possible d’afficher les objets sous divers autres ordonnan-
cements comme les dates de création ou de modification, l’association d’objets (tables et
formulaires liés par exemple) et d’autres critères encore. Il est inutile, au moins dans un
premier temps, de multiplier les affichages sous peine de se disperser dans différentes voies
d’accès aux objets.
Un clic droit sur la catégorie « Les Comptoirs », en haut à gauche, ouvre une fenêtre
déroulante qui présente, en sus des options déjà vues :
• Les « Options de navigation », qui permettront plus tard de monter des menus person-
nalisés.
• Un « Volet de recherche » ouvrant une petite fenêtre de recherche en haut du volet de
navigation. Les recherches se feront par mot-clé, l’établissement de la liste résultante se
réalisant au fur et à mesure de la saisie.

1.3 LA FENÊTRE PRINCIPALE D’AFFICHAGE

En ouvrant la base de données Northwind, un formulaire d’accueil apparaît automatique-


ment dans la fenêtre principale. Il a été conçu pour être le plus ergonomique possible ;
avec les menus présentés dans le volet de navigation, il constitue l’environnement général
de l’utilisateur final.
Le fait qu’il s’agisse d’un formulaire est attesté par la présence du logo contenu dans
l’onglet supérieur : ce formulaire a pour nom « Interne ». Il se ferme en cliquant sur la
croix placée au même niveau à droite de l’écran ; la fenêtre principale se vide mais il est
possible de retrouver ce formulaire en parcourant les objets dans le volet de navigation et
en faisant un double-clic sur l’objet « Interne ».
1. Faites un double-clic dans le volet de navigation sur « Les dix premières commandes »,
un deuxième onglet apparaît à droite de « Interne » et vient recouvrir le contenu du
menu d’accueil.
2. Faites un double-clic sur « Liste commandes » : un troisième onglet se surajoute.
3. Faites un double-clic sur « Détail commande » : cette fois une fenêtre s’ouvre au-dessus
de l’ensemble, sans incrustation dans la fenêtre des onglets. Il s’agit dans ce cas d’une
fenêtre « indépendante ».
4. Fermez la fenêtre « Détail commande » en cliquant sur la croix supérieure droite.
5. Fermez tous les onglets successivement, chacun avec sa croix de fermeture.
Tous ces effets visuels ont été préparés par le programmeur et s’inscrivent dans une
démarche logique d’enchaînement des tâches.

Manipulation d’un formulaire de visualisation


Faites un double-clic sur le formulaire « Liste commande ». Si l’on essaie d’effectuer une
modification dans les données qui s’affichent, toute opération sera systématiquement
rejetée : les données sont fixes et le formulaire ne s’ouvre qu’en mode visualisation. Seules
les deux actions « Ajouter une nouvelle commande » ou « Afficher la facture », en haut,
permettent une interactivité.

14 Access® 2007 et VBA


Access Livre Page 15 Mercredi, 27. f vrier 2008 7:28 07

En bas à gauche de l’écran apparaissent les « boutons de déplacement » qui permettent de


naviguer rapidement parmi les lignes (ou enregistrements) de la liste résultant d’une
requête. Le libellé « 1 sur 49 » indique que l’utilisateur pointe à ce moment sur le premier
1
Chapitre

enregistrement d’une série de 49. Il est plus rapide d’employer les boutons de déplacement
que les flèches directionnelles du clavier. Ces boutons permettent respectivement, et de
gauche à droite, d’aller au premier, au précédent, au suivant et au dernier de la liste.
Parmi les champs affichés, certains ont des caractéristiques bien particulières :
• le champ Date de commande, quand il est actif, s’accompagne d’un petit calendrier à
droite qui devrait permettre le choix d’une date ;
• le champ Représentant est une zone de liste déroulante qui affiche tous les représentants
présents dans la base ;
• le champ Client est une autre zone de liste déroulante.
Là encore, toutes ces commodités de saisie sont des artifices créés par le programmeur
pour simplifier ou guider la tâche de l’utilisateur. Nous apprendrons à les créer dans les
prochains chapitres.
En haut de chaque colonne, chaque nom de champ s’accompagne d’un petit triangle à sa
droite, dont l’ouverture donne la possibilité de trier et filtrer la liste suivant de nombreux
critères (voir figure 1.5).

Figure 1.5
Tris et filtres sur une
liste de formulaire.

• Les deux premières lignes proposent de trier par ordre alphabétique : Access sait que la
colonne concernée est alphabétique et suggère d’emblée un critère de tri logique.
• La ligne Filtres de texte propose de nombreux critères de filtres comme Est égal à,
Commence ou Ne commence pas par, etc.

Note
On rappelle ici la distinction fondamentale entre tri et filtre : un tri réordonne une liste en conser-
vant tous les arguments, un filtre ne fait plus apparaître dans une liste que les enregistrements
correspondant aux critères préétablis.

Les objets d’Access 15


Access Livre Page 16 Mercredi, 27. f vrier 2008 7:28 07

• Le dernier encart, plus bas, énumère des cases à cocher correspondant aux occurrences
trouvées dans la colonne. Le fait de décocher l’une de ces cases provoque la disparition
de la liste des items cités.
Cette présentation des tris et filtres est exactement similaire à celle des autres produits de
la gamme Office 2007. Elle s’adapte à la nature de chaque colonne visée : un clic sur le
triangle voisin du champ Date d’expédition propose des critères de filtre très raffinés sur
la base de dates, alors que celui portant sur les colonnes de chiffres de droite ne sélectionne
que des filtres numériques.
Enfin, nous pouvons remarquer que le bouton « Afficher la facture » est un bouton
contextuel qui affiche la facture correspondant exactement à la ligne de commande active
au moment du clic. Là encore, il s’agit d’un mécanisme créé de toutes pièces par le
programmeur.

Manipulation d’une requête de visualisation


Après avoir fermé le formulaire « Liste des commandes », faites un double-clic dans le
volet de navigation sur la première option « Les dix premières commandes » pour ouvrir
la requête correspondante.
Comme dans le premier cas de figure, la requête est paramétrée pour ne permettre que la
visualisation et non pas la modification. L’effet graphique obtenu est moins raffiné que
dans un formulaire : il ne s’agit que d’un affichage en mode Feuille de Données, en tous
points comparable à un tableau Excel. Le raccourci clavier Ctrl + A, ou un clic droit dans
le coin supérieur gauche du tableau, puis un « Coller » permettent de placer l’ensemble
des données dans le presse-papiers. Un simple « Coller » dans une feuille Excel nouvelle
(ou Word, ou toute autre application graphique) reportera les données copiées dans le
nouveau document.
Toutes les commandes de tris et de filtres s’emploient de la même manière qu’avec un
formulaire.
Dans le cas précis du formulaire « Les dix premières commandes », le programmeur a créé
une requête spécifique qui n’affiche que les dix plus importantes commandes enregistrées
dans la base. Il n’est pas possible d’afficher toutes les commandes par cette option. Si ce
besoin est impératif, l’utilisateur peut ouvrir une autre requête, plus bas, nommée « Com-
mande de produits », qui montre toutes les commandes. À ceci près que, dans ce dernier
tableau, les commandes se décomposent en lignes éparses (une commande, numérotée
comme telle, comporte plusieurs lignes de commandes) ; de plus, pour chacune des lignes
éditées, il n’est indiqué que le prix unitaire et la quantité de produits commandés, non le
montant de la ligne (sa multiplication d’une quantité par un prix). Cette décomposition
provient du caractère relationnel de la base de données sur lequel nous reviendrons
longuement.

Manipulation d’un état


Dans le volet de navigation, plus bas, il existe un état nommé « Les dix commandes les
plus importantes », correspondant très exactement à la requête évoquée au paragraphe
précédent. Le résultat renvoyé est naturellement le même au plan des données mais très
différent quant à la présentation, beaucoup plus soignée.
1. Cliquez sur le bouton « Office ».

16 Access® 2007 et VBA


Access Livre Page 17 Mercredi, 27. f vrier 2008 7:28 07

2. Cliquez sur « Imprimer ».


3. Choisissez « Aperçu avant impression 1 ».
1
Chapitre

Le rendu visuel de l’état permet une impression soignée.

Manipulation directe d’une table


L’ouverture des objets cités plus haut, requêtes, formulaires et états, a été prévue et para-
métrée par le programmeur ; elle ne risque donc en aucune manière d’endommager la
base de données. De la même manière, il existe des options écrites par le développeur, que
nous verrons plus loin, permettant de créer de nouveaux clients, de nouvelles commandes
et de nouvelles factures ; en revanche, il ne doit pas être possible, dans une application
bien écrite, de revenir sur des données déjà entrées. Si le programme Northwind était par-
faitement « bouclé », il serait impossible à l’utilisateur de faire les manipulations que nous
allons maintenant mettre en œuvre pour découvrir l’univers des bases de données.
1. Dans le volet de navigation, ouvrez les « Catégories » et choisissez « Types d’objet » : la
liste fait apparaître les classes d’objets.
2. Développez, le cas échéant, la classe « Tables » (doubles chevrons vers le bas).
3. Double-cliquez sur « Clients ».
La table des clients apparaît telle qu’à la figure 1.6 ; on peut l’élargir en masquant le volet
de navigation (doubles chevrons vers la gauche).

Figure 1.6
Table des clients.

La table des clients s’affiche comme une feuille de données, identique à celle d’Excel.
• Les noms de champ se présentent en en-têtes.
• Les clients apparaissent en liste ; il existe apparemment un ordre par numéro d’ID, mais
il ne s’agit que d’un artifice dû au fait que les clients ont été entrés dans la base dans
l’ordre présenté ici : l’ordre de saisie des clients n’influe pas sur la présentation à l’écran.
Il est possible que les numéros se retrouvent ultérieurement en désordre et il reviendra
à l’utilisateur de présenter ses éditions avec des critères de tri.

1. Le même résultat peut être obtenu par un clic droit sur l’état et en sélectionnant « Aperçu avant impression ».

Les objets d’Access 17


Access Livre Page 18 Mercredi, 27. f vrier 2008 7:28 07

• À l’ouverture, le curseur se positionne sur la cellule la plus en haut à droite : les flèches
directionnelles ou le taquet de tabulation du clavier permettent de naviguer dans les
champs ou les enregistrements, à l’horizontale ou à la verticale.
• Un carré contenant le signe + débute chaque ligne ; cette présentation dépend des rela-
tions établies entre les tables. Dans le cas présent, il existe un lien permanent entre la
table des clients et celles des commandes : à un client donné correspond 0 ou plusieurs
commandes. Si l’on clique sur le signe plus, en décalé et en dessous de la ligne du client,
les lignes de commandes que celui-ci a déjà émises apparaissent. Un clic sur le signe
moins rétablit l’affichage d’origine.
Presque toutes les zones de cette table sont modifiables directement, avec tous les dangers
que de telles manipulations entraînent. Seule la première colonne de la table, contenant le
numéro identifiant de chaque client, n’est pas modifiable. Le nom de la première société,
par exemple, se modifie sans difficulté ; pire, on peut le remplacer par le nom d’une autre
société existant déjà dans le fichier. Il est donc possible de créer des doublons apparents,
mais l’on ne peut pas en faire reproche au programmeur : il est tout à fait envisageable que
deux clients portent le même nom (DUPONT par exemple) tout en étant domiciliés à
deux adresses différentes !
En modifiant une quelconque donnée dans cette source d’informations qu’est la table,
l’impact du changement se répercutera sur tous les objets de la base en aval : les requêtes,
les formulaires et les états.
La saisie des données prend donc une importance toute particulière :
• Toutes les modifications opérées sur une ligne d’enregistrement ne sont définitivement
prises en compte que lorsque l’utilisateur passe sur un autre enregistrement ou ferme la
table ; la touche « Echap » rétablit toutes les données (même sur plusieurs champs)
dans l’état où elles se trouvaient initialement tant qu’un autre enregistrement n’est pas
atteint. Inversement, il n’existe aucun bouton de validation : dès qu’un nouvel enregis-
trement est atteint les changements deviennent définitifs dans le précédent.
• Il n’existe pas nécessairement de masque de saisie dans la table : par exemple, tous les
numéros de téléphone affichés ont le format international standard, mais il est possible
de saisir un numéro non conforme (1234 par exemple). Le masque de saisie existe pro-
bablement dans le formulaire de saisie ou de modification d’un client, non dans la table
source.
• Contrairement à Excel, ou d’autres programmes bureautiques, les modifications
apportées dans les données sont définitivement enregistrées sur le disque dur : il n’est
pas nécessaire de manipuler le bouton « Office » et l’option « Enregistrer ».
En faisant défiler la fenêtre de la table vers la droite, on notera une colonne particulière
dotée de « trombones » et d’un type tout nouveau dans Access 2007. Un double clic sur
l’un de ces trombones permet de joindre une pièce externe à un enregistrement précis.
Dans le cas présent, on pourrait joindre à l’enregistrement du client n˚ 1 des pièces comme
sa photo ou le document Word contenant le contrat signé.

Manipulation directe d’une requête


Comme on l’a vu, les requêtes mémorisent des interrogations faites aux tables ; plus préci-
sément, elles permettent non seulement de faire appel aux données contenues dans les
tables, mais aussi de modifier les données source à travers le masque de saisie qu’elles
constituent dans le même temps.

18 Access® 2007 et VBA


Access Livre Page 19 Mercredi, 27. f vrier 2008 7:28 07

1. Dans le volet de navigation, développez la classe « Requêtes ».


2. Double-cliquez sur la première requête nommée « Achats de produits ».
1
Chapitre

La liste des données qui s’affiche reprend, de manière non exhaustive, des informations
issues de trois tables (que l’on pourra consulter si nécessaire) :
• une table des fournisseurs ;
• une table des bons de commande ;
• une table de détail des bons de commande.
Parmi les champs affichés, la date de création du bon de commande, par exemple, est tout
à fait modifiable : tout changement affectera l’affichage en cours, mais aussi, et surtout,
la donnée de base contenue dans la table des bons de commande. Dans ce cas de figure, la
requête sert de masque de saisie pour intervenir sur la table d’origine.
Il est clair que le programmeur doit interdire aux utilisateurs de telles interventions en
mettant en place des méthodes contrôlées d’accès aux données.

Manipulation directe d’un formulaire


Dans la base Northwind et dans le cadre de son exploitation par des utilisateurs, les
formulaires s’ouvrent normalement à l’occasion d’un clic sur un bouton créé par le pro-
grammeur. Souvent, cette ouverture correspond à une démarche bien précise : l’utilisa-
teur, par exemple, consulte d’abord la liste générale des clients puis clique sur un bouton
pour consulter le détail des commandes en cours émises par celui-ci.
On peut également ouvrir un formulaire en dehors de ce contexte, pour sa mise au point
par le développeur, par exemple.
1. Dans le volet de navigation, développez la classe « Formulaires ».
2. Faites un double-clic sur le deuxième formulaire nommé « Boîte de dialogue États
ventes ».
Comme son nom l’indique, ce formulaire n’est pas destiné à afficher des données stockées
dans la base, mais à servir de boîte de dialogue pour que l’utilisateur choisisse des options
d’édition (voir figure 1.7).

Figure 1.7
Formulaire
de dialogue.

Les objets d’Access 19


Access Livre Page 20 Mercredi, 27. f vrier 2008 7:28 07

Un clic sur le bouton « Imprimer » ou « Aperçu » permet le lancement de procédures


d’impression commandées via une macro ou du code Visual Basic. L’utilisateur doit préa-
lablement choisir un type d’état et sa périodicité, qui deviendront autant de paramètres à
l’édition.
Il est également possible d’ouvrir directement des formulaires qui ciblent des tables ou des
requêtes de la base. Dans le cas présent, nous ouvrons le formulaire destiné à modifier
les clients ou à en créer de nouveaux.
1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ».
2. Double-cliquez sur le formulaire « Détail du client ».
La fenêtre qui apparaît affiche les coordonnées du premier client de la base (voir figure 1.8).

Figure 1.8
Formulaire d’accès
aux données.

Ici, Access ne liste pas l’ensemble des clients (formulaire dit continu), mais présente les
clients les uns après les autres (formulaire dit unique). Les boutons de déplacement, en
bas, permettent non seulement de faire défiler les clients, mais aussi, à droite, d’accéder
directement à la création d’un nouveau client. Le programmeur a également prévu des
boutons « Enregistrer » et « Nouveau », en haut, pour faire la même opération ; on verra,
en effet, qu’il existe souvent de nombreuses manières de faire la même opération dans la
même grille-écran.
La saisie des données est régie par des règles identiques à celles qui sont applicables dans
les tables : appuyer sur la touche « Echap » annule toute l’opération. En revanche, le for-
mulaire peut être assorti de masques de saisie ou de conditions de validation qui auront
été posées par le programmeur. On peut, par exemple, imaginer qu’un contrôle de valida-
tion prohibe une adresse e-mail si la chaîne de caractères entrée ne comporte pas de signe
arobase (@).

20 Access® 2007 et VBA


Access Livre Page 21 Mercredi, 27. f vrier 2008 7:28 07

1.4 LA BARRE DE MENUS ET LES RUBANS


1
Chapitre

Dans la base Northwind, le programmeur a laissé à l’utilisateur le loisir d’accéder à la


barre de menu, laquelle peut avoir été masquée par l’option de la barre d’outils d’accès
rapide « Réduire le ruban ». Le cas échéant donc, rétablissez-la en cliquant sur le petit
triangle à droite des raccourcis de la barre supérieure et en décochant « Réduire le
ruban ».
La barre de menu d’Access 2007 ne comporte qu’un petit nombre d’options (quatre
en standard) qui font apparaître chacune un ruban différent, particulièrement riche en
icônes.
• Le menu « Accueil » regroupe les fonctions principales d’édition (polices de carac-
tères par exemple), de traitement des listes (tris et filtres) et de recherche. On
notera, à gauche, un bouton destiné au mode d’affichage qui sera traité dans le
paragraphe suivant.
• Le menu « Créer » comprend les icônes de création de tous les objets de la base.
• Le menu « Données externes » inclut la mise en place de toutes les formes de liaisons
avec toutes les sources de données qu’Access peut établir.
• Le menu « Outils de base de données », enfin, permet l’ouverture de Visual Basic et gère
les « utilitaires » comme la documentation de la base ou l’établissement des relations
entre les tables, par exemple.
D’une manière générale, la manipulation du clic droit sur les objets ou éléments à modi-
fier permet, tout comme les icônes, d’accéder à la majeure partie des actions possibles.
On choisira donc très souvent le clic droit au détriment des options du menu.

1.5 LES MODES D’AFFICHAGE DES OBJETS D’ACCESS

Jusqu’à présent, nous avons ouvert les objets contenus dans la base et créés par le pro-
grammeur en mode formulaire. Ce mode, le plus naturel, est celui de l’utilisateur. En
double-cliquant sur un objet, quel qu’il soit, on accède aux objets dans ce mode. Pour le
programmeur qui dessine les objets (tables, requêtes et autres formulaires), l’affichage
propre à la mise en œuvre doit se faire en mode création. Au cours des manipulations qui
suivent, nous passerons alternativement du mode formulaire au mode création, pour en
découvrir les différences fondamentales :
1. Dans le volet de navigation, si nécessaire, développez la classe « Formulaires ».
2. Cliquez du bouton droit sur le formulaire « Boîte de dialogue États ventes » (notez
que dans le ruban du menu « Accueil », l’icône Affichage de droite est grisée et ne peut
pas être sélectionnée).
3. Dans la fenêtre contextuelle qui s’ouvre, cliquez sur « Mode création ».

Les objets d’Access 21


Access Livre Page 22 Mercredi, 27. f vrier 2008 7:28 07

Le formulaire, que nous avions précédemment ouvert en mode normal par un double-
clic, s’affiche maintenant sous une tout autre présentation, propre au concepteur du
formulaire (voir figure 1.9).

Figure 1.9
Exemple de
formulaire ouvert
en mode création.

Chaque carré, chaque bouton présent dans l’objet formule se nomme contrôle. Ils sont
modifiables en toute liberté, ce qu’on se gardera bien de faire pour le moment !
Vous aurez peut-être remarqué que l’icône du ruban d’Accueil est devenue active lors de
l’ouverture en mode création :
1. Cliquez sur le bouton « Affichage » du menu « Accueil ».
2. Repositionnez l’affichage en mode formulaire : vous constatez que la « Boîte de dialogue
États des ventes » a repris l’apparence que nous lui connaissions auparavant.
3. Fermez la fenêtre avec la croix du coin supérieur droit.
4. Si Access demande l’accord pour enregistrer les modifications dans la structure du for-
mulaire, répondez bien évidemment : « Non » ; le formulaire conçu par le programmeur
ne doit pas être modifié.
5. Fermez toutes les fenêtres de la partie droite de l’écran.
De la même manière, vous pouvez ouvrir tous les autres objets de la base :
• soit en mode création pour le concepteur de la base ;
• soit en mode utilisateur, celui-ci étant variable suivant la nature de l’objet ; il existe dif-
férents modes que nous étudierons plus tard : le mode feuille de données, le mode
formulaire, le mode tableau croisé dynamique, et d’autres encore.
Vous pouvez constater encore cette distinction fondamentale entre les deux modes
d’ouverture avec une table :
1. Dans le volet de navigation, si nécessaire, développez la classe « Tables ».
2. Cliquez du bouton droit sur la table « Clients ».
3. Ouvrez cette table en mode création.

22 Access® 2007 et VBA


Access Livre Page 23 Mercredi, 27. f vrier 2008 7:28 07

Figure 1.10
La table « Clients » s’ouvre avec l’apparence de la figure 1.10.
1
Chapitre

Exemple de table
ouverte en mode
création.

1.6 CONVERSION DES FICHIERS ACCESS DES VERSIONS ANTÉRIEURES

Comme on l’a vu, la base Northwind est tout entière contenue dans le seul fichier « Nor-
thwind.accdb ». L’extension de ce fichier correspond au nouveau format des bases de
données Access 2007. Les anciens fichiers des versions antérieures étaient, eux, suffixés
« .mdb ». Une base de données sous l’ancien format peut s’ouvrir avec Access 2007 en
mode compatibilité ; en revanche, une base de données accdb ne peut pas s’ouvrir avec
Access 2003. Il sera préférable, dès que possible, de transformer les anciennes bases au
nouveau format ; la procédure en est un peu spécifique :
1. Créez une nouvelle base de données vide.
2. Cliquez dans le menu « Données Externes » sur le bouton « Access ».
3. À l’aide du bouton « Parcourir », pointez la base de données au format mdb.
4. Dans la fenêtre « Importer », cliquez sur le bouton « Sélectionner tout » (si vous souhaitez
récupérer la totalité des objets de l’ancienne base).
5. Cliquez sur « OK » 1.
Lorsqu’une base de données « .accdb » est ouverte, le système d’exploitation Windows
crée provisoirement un autre fichier, suffixé « .laccdb », destiné à contrôler le partage de la
base. Au moment où tous les utilisateurs simultanés d’une base ferment l’application, le
système supprime automatiquement ce fichier « laccdb ».

1. Si des barres de menus avaient été programmées dans l’ancienne base, elles seront déplacées dans une nouvelle option du menu général
« Compléments ».

Les objets d’Access 23


Access Livre Page 24 Mercredi, 27. f vrier 2008 7:28 07

Résumé
Le programme Access génère une base de données, mais aussi un ensemble d’outils
permettant de créer des applications entières. Ces éléments sont :
• des tables, contenant les données ;
• des requêtes, permettant d’interroger les structures de tables mises en place ;
• des formulaires présentant les données dans une interface homme/machine adaptée ;
• des états destinés à imprimer des résultats ;
• un langage de programmation, VBA.
Le volet de navigation peut servir de générateur de menus afin d’aider l’utilisateur à
atteindre les objets de la base en mode formulaire ou feuille de données, c’est-à-dire en
tant que gestionnaire quotidien de la base et non pas de concepteur.
À tout moment, et pourvu que le concepteur n’ait pas fermé l’accès au mode création,
tous les objets s’affichent soit en mode création pour le concepteur, soit en mode normal
pour les utilisateurs.

24 Access® 2007 et VBA


Access Livre Page 25 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
1
Chapitre

Ces premiers exercices ont pour objectif de familiariser le lecteur avec l’environnement
d’Access en mode utilisateur final. On insistera sur l’effet des choix du programmeur sur
le déroulement des actes de l’utilisateur : cette démarche ouvrira la voie aux développements
des chapitres suivants.
Les exercices choisis permettront de montrer que la maîtrise d’Access ne passe pas seule-
ment par une bonne connaissance des options du logiciel et de ses fonctionnalités. Il est
nécessaire aussi (voire d’abord) de dominer le sujet par une vue d’ensemble de l’appli-
cation qui sera conçue. Pour plus de clarté, on dissociera toujours les données stables de
l’application (tables), d’une part, et les processus modifiant ou augmentant les données
stockées, d’autre part. Cette division, toute théorique, est à la base d’une analyse solide de
l’objet global à concevoir et à mettre en œuvre.

EXERCICE 1 CRÉER UN CLIENT ET UNE COMMANDE

• Énoncé Dans cet exercice, vous devez vous placer en tant qu’utilisateur de la base Northwind,
c’est-à-dire un professionnel de la vente.
1. À l’aide des outils déjà existants dans cette base, créez un nouveau client (libellé au
choix).
2. Puis, créez une commande sur la base de produits déjà existants et en stock. Vérifiez
votre travail et allez jusqu’à la facturation des produits commandés.

• * Solution 1. Création d’un nouveau client


1. Fermez la base Northwind et ouvrez-la à nouveau pour vous assurer de votre qualité
d’utilisateur (et non de concepteur). Dans le volet de navigation, retournez à la
catégorie « Les Comptoirs » afin de visionner les formulaires et états créés par le
concepteur.
Logiquement, la création d’un nouveau client passe par l’option « Liste des clients » du
volet de navigation : l’utilisateur doit d’abord consulter cette liste afin de vérifier que le
client n’existe pas.
2. Double cliquez sur « Liste des clients » dans le volet de navigation et déroulez la liste
des clients déjà existants. Au besoin, vous pourrez cliquer en bas d’écran sur la zone
« Rechercher » pour retrouver toute occurrence similaire 1.
3. Dans la barre grise supérieure du formulaire, cliquez sur le bouton « Nouveau client ».
Exercices

1. Il n’existe pas, d’emblée, de formulaire de création d’un nouveau client : c’est un choix délibéré du concepteur qui, d’une certaine manière,
se justifie.

Les objets d’Access 25


Access Livre Page 26 Mercredi, 27. f vrier 2008 7:28 07

4. Remplissez correctement les zones (ou contrôles) du formulaire pour obtenir un


résultat satisfaisant, à l’image de la figure 1.11.

Figure 1.11
Remplissage du
formulaire de
création d’un
nouveau client.

Le bouton « Enregistrer et nouveau », en haut à droite, permet d’enchaîner la création de


nouveaux clients. Le bouton « Fermer », tout à fait à droite, suffit pour :
• valider la saisie (donc valider le nouvel enregistrement dans la table « Clients ») ;
• fermer le formulaire.
Immédiatement, le nouveau client apparaît dans la liste des clients. On remarquera que les
numéros de téléphone saisis à l’image de ceux de la figure 1.11 ne sont pas listés comme les
autres, dotés des préfixes internationaux. On peut en conclure que le concepteur n’a pas
mis en place de masque de saisie en vue de formater correctement ces numéros : ici
commence l’audit de la conception du programme.
Un clic sur le numéro identificateur du client, en bleu à gauche, permet de réviser la fiche
du client et, le cas échéant, de la mettre à jour.

2. Création d’une commande et facturation


De la même manière que l’insertion d’un nouveau client passait par la liste des clients, une
nouvelle commande passe par la liste des commandes.
1. Dans le volet de navigation, double-cliquez sur « Liste des commandes » (il est possible
mais non indispensable de fermer la liste des clients).
2. Cliquez dans la barre supérieure grise sur « Ajouter une nouvelle commande » :
l’encart supérieur affiche le libellé « Commande n˚ (Nouveau) », sans indiquer encore
de numéro précis. L’incrémentation du nouveau numéro se réalisera lorsque ladite
commande sera validée et seulement à ce moment.

26 Access® 2007 et VBA


Access Livre Page 27 Mercredi, 27. f vrier 2008 7:28 07

3. Ouvrez la liste déroulante des clients en haut à gauche et choisissez le nouveau client
créé. Les onglets qui apparaissent à ce moment permettent de commencer la saisie de
la commande.
1
Chapitre

4. Dans l’onglet « Détail commande » et la zone de liste déroulante « Produit », choisis-


sez le produit « Olive Oil » ; l’huile d’olive a été choisie dans ce premier exemple car il
en existe en stock. Le prix unitaire, enregistré dans la base, s’affiche automatiquement ;
saisissez la quantité 2.
5. Cliquez sur le bouton « Ordre d’expédition ». Il semble naturel, puisque le produit est
en stock, d’expédier maintenant la marchandise. Or, une boîte de message apparaît,
qui prévient l’utilisateur que le produit ne peut pas être envoyé sans avoir été facturé
au préalable. On voit, par cet exemple, que le programmeur a conçu le logiciel dans le
respect des choix de procédures jugés indispensables par les commanditaires.
6. Cliquez sur le bouton « Créer une facture » : une deuxième boîte de message refuse de
valider la facture sans avoir saisi tous les renseignements nécessaires.
7. En parcourant les trois onglets du bon de commande, saisissez un transporteur, une
date de livraison, un type et une date de paiement. Vérifiez que tous les champs sont
remplis (l’adresse de livraison en particulier) pour ne plus générer de message
d’erreur. Dans le cas présent, on peut estimer que les contrôles de saisie sont un peu
excessifs (la zone du département, par exemple, est obligatoire alors qu’il en existe une
autre pour le code postal).
8. Lorsque la saisie est valide, le programme affiche la facture sous forme d’aperçu avant
impression. Un clic droit dans la fenêtre permet d’accéder à une option d’impression.
Ce clic permet également de passer en mode création : il s’agit là d’une faiblesse du
programme dans son état actuel. Fermez la fenêtre.
9. Cliquez de nouveau sur le bouton « Créer une facture » : bien évidemment, cette opé-
ration n’est pas autorisée car la facture a déjà été générée. Une boîte de dialogue
propose de l’imprimer et renvoie à l’étape précédente.
10. Cliquez sur « Ordre d’expédition » ; si nécessaire, remplissez les zones obligatoires
jusqu’à ce que l’opération soit valide. Enfin, cliquez sur le bouton « Terminer la com-
mande » pour générer le message « La commande est désormais marquée comme
fermée ».
La pratique de ce petit logiciel de gestion commerciale nous a permis de constater que la
mise en œuvre du processus de facturation est beaucoup plus complexe qu’il n’y paraît.
En premier lieu, les différents acteurs doivent être en place et, au moins :
• un client ;
• un fournisseur ;
• un produit ;
• un représentant ;
• un transporteur.
En second lieu, l’événement de la commande (imaginons par exemple l’appel téléphonique
Exercices

du client) déclenche une cascade d’actions obligatoirement successives. La commande,


prise dans le sens d’un document, va passer par des états successifs, et dans le cas présent,
par les états :
• nouveau ;

Les objets d’Access 27


Access Livre Page 28 Mercredi, 27. f vrier 2008 7:28 07

• facturé ;
• expédié ;
• fermé.
Au plan de la base de données Access, tous ses objets vont être mis à contribution :
• Les données relatives aux clients, fournisseurs, produits, représentants et transporteurs
sont stockés dans des tables différentes.
• Les commandes sont stockées dans d’autres tables qui, nécessairement, seront en relation
avec les tables précédentes. On y adjoindra des notions d’état.
• Des requêtes permettent d’afficher, au moment voulu, les données nécessaires, reconsti-
tuées en croisant les informations des deux types de tables évoqués précédemment.
• Des formulaires présentent, de manière cohérente et compréhensible, des données
issues des requêtes.
• Des états, éventuellement à caractère légal comme la facture, matérialisent l’acte
commercial en utilisant d’autres requêtes.
• Un programme présente, logiquement et au moment voulu, les formulaires, et contrôle
en permanence le respect des procédures.

EXERCICE 2 PRATIQUER UN RÉASSORT

• Énoncé 1. En utilisant la base Northwind, effectuez une commande client en choisissant un


article dont le stock est épuisé (prenez l’article Beer). Observez l’effet de cette
commande et tentez de reconstituer le chemin des processus mis en œuvre.
2. Lorsque cette commande est valide, indiquez les actions à effectuer lors de sa
réception.

* Solution 1. Réalisation d’une commande client avec un article épuisé


1. Cliquez dans le volet de navigation sur « Liste commande ».
2. Cliquez sur « Ajouter une nouvelle commande ».
3. Choisissez le client créé dans l’exercice 1.
4. Parmi les produits de la zone de liste déroulante, sélectionnez l’article Beer dont la
quantité disponible est égale à 0.
5. La saisie d’une quantité commandée de 20 articles provoque l’ouverture d’une fenêtre
de message particulière. Le programme a consulté l’inventaire du stock et constaté
qu’il était insuffisant pour satisfaire la commande. Malgré tout, il est possible de valider la
commande en l’état (quitte, plus tard à pratiquer un réassort de ce produit).
6. Justement, le logiciel gère ce qu’on appelle le système de contremarque : une com-
mande client, quand elle ne peut être satisfaite, génère automatiquement une
commande fournisseur à hauteur des mêmes quantités. C’est la raison pour laquelle le
logiciel ouvre automatiquement une fenêtre « Inventaire insuffisant. Voulez-vous
créer un bon de commande ? ». Il s’agit là d’un bon de commande fournisseur ; les

28 Access® 2007 et VBA


Access Livre Page 29 Mercredi, 27. f vrier 2008 7:28 07

puristes pourront reprocher au concepteur de n’avoir pas précisé cela dans la fenêtre
en question ni dans les encarts supérieurs de chacun des formulaires.
1
Chapitre

7. Le bon de commande fournisseur qui s’ouvre est déjà numéroté (à la différence du


précédent). Son état initial est « soumise » (en haut à gauche). Le fournisseur est déjà
renseigné. La quantité commandée est identique à celle de la commande client.
L’approbation de cette commande n’est ni signée ni datée. Il n’y a pas de date prévue
de livraison. Vous pouvez fermer les deux fenêtres des bons de commande Client et
Fournisseur.
8. Dans le volet de navigation, cliquez sur « Liste bon de commande » dans la catégorie
« Inventaire et achats » pour obtenir la liste des commandes fournisseur telle qu’à la
figure 1.12.

Figure 1.12
Liste des
commandes
fournisseur
en cours.

Dans cette liste, les commandes fournisseurs ont, suivant les cas, deux états possibles :
Soumise ou Approuvé. Celles qui ne sont pas approuvées ne comportent ni nom d’appro-
bateur, ni date (ni, a fortiori, de date de paiement) 1.
1. Double-cliquez sur la commande la plus récente, en haut, celle que vous venez de
générer.
2. Cliquez sur le bouton « Approuver l’achat » : automatiquement, Access appose la date
du jour dans la zone de date d’approbation et « colle » le nom de l’utilisateur en cours
dans la zone « Approuvé par ».
3. Fermez la fenêtre et constatez que la liste n’est pas mise à jour immédiatement : il faut
appuyer sur la touche F5 (ou fermer et rouvrir le formulaire) pour rafraîchir la liste.
Exercices

1. Il n’existe pas de commande fournisseur déclarée « fermée ». En fait, le programme est inachevé et il n’existe pas de moyen de fermer une
commande fournisseur, même lorsque tous les champs sont correctement remplis.

Les objets d’Access 29


Access Livre Page 30 Mercredi, 27. f vrier 2008 7:28 07

Note
Ces dernières manipulations nous conduisent à déceler trois imperfections dans le programme :
Imperfection sur le fond, tout d’abord : il n’est pas logique que la même personne ait à la fois le
droit de soumettre une commande fournisseur et simultanément le droit de l’approuver. La sépa-
ration des fonctions, liée au contrôle interne dans l’entreprise, n’est pas opérationnelle. Au pire,
et en admettant qu’il ne soit pas utile d’approuver une commande, le passage par une étape
d’approbation ne sert dès lors informatiquement à rien*.
Dans la mesure où le bouton « Approuver l’achat » vient coller automatiquement le nom de l’uti-
lisateur dans la zone, il n’y a nul besoin de créer à cet endroit une zone de liste déroulante qui
affiche tous les utilisateurs ; une simple zone de texte eût suffi.
Il manque une ligne de programme pour provoquer un rafraîchissement de la liste au moment de
la fermeture du bon de commande.

* En fait, le programmeur a bien prévu une notion de privilège d’approbateur dans la base mais ne l’a pas mise
en œuvre. Le représentant Cencini, premier de la liste, et sous le nom duquel on se connecte par commodité a
tous les droits.

2. Réception d’une commande fournisseur


Lorsque la commande de 20 bouteilles de bière parvient à l’entreprise, le réceptionniste
doit procéder de la manière suivante :
1. Double-cliquez sur la ligne de commande fournisseur correspondante.
2. Cliquez dans l’onglet « Réception » dans l’inventaire.
3. Cochez la case « Ajouter à l’inventaire » : une fenêtre vous informe que « Le produit a
été correctement entré dans l’inventaire » 1.
4. Immédiatement après, une deuxième fenêtre s’ouvre : « Voici les commandes conte-
nant ce produit en livraison différée. Voulez-vous les remplir maintenant ? » En
d’autres termes, voulez-vous traiter les commandes clients en attente ? Répondez
« Non ». Dans le cas contraire, vous accéderiez à la saisie des livraisons telle que nous
l’avons pratiquée à l’exercice précédent.
Le fait qu’il n’existe pas d’état Réceptionné à un bon de commande fournisseur n’est pas
choquant : un bon de commande peut comprendre plusieurs articles dont certains ont été
réceptionnés et d’autres non. À la rigueur on pourrait imaginer un état Réceptionné
lorsque tous les articles d’un bon sont reçus.
La synthèse des opérations réalisées peut se lire dans l’inventaire, lequel nous conduit aux
produits.
1. Dans le volet de navigation, cliquez sur « Inventaire » dans la catégorie « Inventaire et
achats ».
2. La liste de tous les produits et différentes quantités d’inventaire apparaît : il ne s’agit
que d’une synthèse, et il n’est pas possible, à ce niveau, de vérifier les mouvements de
stock.

1. La case à cocher a ici une double vocation un peu particulière : d’une part, elle est une case à cocher simple qui indique un état (on
constatera à tout moment que le produit est entré en inventaire), d’autre part, le simple fait de cocher lance une action précise, celle d’ajouter
l’article à l’inventaire. Cette double utilisation simultanée du même objet est relativement peu orthodoxe.

30 Access® 2007 et VBA


Access Livre Page 31 Mercredi, 27. f vrier 2008 7:28 07

3. Double-cliquez sur le produit Beer : vous ouvrez la table des produits et ciblez plus
précisément cet article (voir figure 1.13).
1
Chapitre

Figure 1.13
Fiche produit.

Comme on l’a vu plus haut, l’affichage en mode formulaire unique des articles de la table
s’adjoint, en bas d’écran, de boutons de déplacement, d’un filtre et d’un mode Recherche.
En haut, le formulaire comprend deux onglets « Détail du produit » et « Historique des
achats/commandes ». En cliquant sur ce deuxième onglet, on lit tous les mouvements du
produit en entrée et en sortie. On comprend donc que le même formulaire, au travers de
deux onglets, vise deux domaines bien distincts pour nous maintenant : d’une part, le
produit lui-même, d’autre part, la synthèse des commandes clients/fournisseurs du même
produit.

EXERCICE 3 ANALYSER LES PROCESSUS ET LES ÉTATS

• Énoncé En reprenant les deux exercices précédents, représentez graphiquement les processus et
les états mis en place depuis la commande à un fournisseur jusqu’à la facture à un client
Exercices

* Solution Il existe de nombreuses manières de représenter graphiquement des processus et des états.
Dans la mesure où le lecteur n’est pas spécialiste de ce type de représentation, on prendra
des schémas de type UML (Unified Modeling Language), tout en gardant une certaine
liberté dans le formalisme.

Les objets d’Access 31


Access Livre Page 32 Mercredi, 27. f vrier 2008 7:28 07

Un diagramme d’activité représente les actions successives, de haut en bas, de gestion des
bons de commande fournisseur et client (voir figure 1.14). L’important, ici, consiste à
montrer l’ordonnancement des actions et les deux cas de figure, si l’article commandé par
le client est disponible ou non.

Figure 1.14
Représentation
de la gestion
des commandes
sous forme
de diagramme
d’activité.

Dans la figure 1.14, la possibilité de passer du circuit client au circuit fournisseur a bien été
représentée, bien qu’un peu abusivement : l’utilisateur a le droit d’arrêter la commande au
moment où il est informé qu’un article est non disponible et n’est pas obligé de passer aux
actions de la partie gauche du schéma. Au contraire, la possibilité de passer au traitement
des commandes clients, lorsqu’un article est réceptionné, n’est pas dessinée.
Le trait noir épais de la partie gauche, appelé barre de synchronisation par les professionnels,
exprime la nécessité de présence des deux actions, commande fournisseur et approbation,
pour pouvoir continuer le fil des actions.
Les cercles noirs, en haut de figure, représentent le point d’entrée dans le processus, les
doubles cercles, en bas, les points finaux.
Un autre type de représentation appelé « diagramme d’état », plus statique, synthétise les
différents états par lesquels passe le bon de commande client.
Il n’est pas indispensable de procéder à des représentations graphiques très poussées lors-
que l’application à développer avec Access conserve des objectifs modestes et une portée
limitée. Toutefois, ces illustrations permettent de faciliter le débat nécessaire entre le(s)
développeur(s) et les utilisateurs, qui doit avoir lieu lors de la conception du produit
logiciel. Elles peuvent servir de base, en partie, à l’amorce d’un cahier des charges et per-
mettent au développeur, surtout, d’avoir une idée bien claire de la problématique et des
objectifs à poursuivre.

32 Access® 2007 et VBA


Access Livre Page 33 Mercredi, 27. f vrier 2008 7:28 07

Figure 1.15
Représentation de
1
Chapitre

la gestion des
commandes client
sous forme de
diagramme d’état.

EXERCICE 4 ANALYSER LES DONNÉES

• Énoncé En reprenant les deux premiers exercices, énumérez graphiquement les données, regroupées
par grands ensembles, entrant dans le cadre de l’application.

* Solution Les données se regroupent dans des tables, comme nous l’avons vu dans la partie théorique de
ce chapitre. Ici, nous n’abordons volontairement pas les liens entre les tables, mais uniquement
leur contenu. Il s’agit de dissocier les domaines de chaque table et de ne pas les mélanger.

Figure 1.16
CLIENT FOURNISSEUR TRANSPORTEUR EMPLOYE
Représentation des N° de client N° de fournisseur N° de transporteur N° d’employé
données essentielles Raison sociale Raison sociale Raison sociale Nom
de la base Adresse Adresse Adresse Prénom
Fonction
Northwind. Rôle

COMMANDE PRODUIT COMMANDE


CLIENT N° de produit FOURNISSEUR
N° de commande Désignation N° de commande
client Prix unitaire fournisseur
N° de client N° de fournisseur
N° de produit N° de produit
Quantité Quantité
Etat C.Client Etat
C.Fournisseur

Dans la réalité, la base de données est plus complexe : ne sont représentées ici que les don-
nées essentielles qui seront décomposées par la suite. En revanche, le dessin général est
incontournable.
Exercices

• Clients, fournisseurs, transporteurs et employés regroupent des entités bien distinctes qui
ne peuvent en aucun cas constituer un seul fichier des « partenaires » de l’entreprise.
• Chacun des ensembles mis en place dispose d’une numérotation qui lui est propre : à
l’intérieur d’un même ensemble, chaque client, par exemple, a un numéro propre qui
lui sert d’identifiant. Par commodité, on parlera d’ID (pour l’IDentity américain).

Les objets d’Access 33


Access Livre Page 34 Mercredi, 27. f vrier 2008 7:28 07

• Certains libellés, et en particulier les identifiants, se retrouvent dans d’autres tables que
dans leur propre univers : le numéro de client dans la commande client, le numéro de
fournisseur dans la table des commandes fournisseur.
• Il n’existe qu’une seule table « Produit » dont les numéros se retrouvent dans les tables
des commandes, aux fournisseurs comme aux clients : s’agissant de négoce, les produits
à l’achat sont bien les mêmes que ceux qui seront revendus (sans transformation).
• Les deux tables des commandes fournisseurs et clients ont chacune une notion d’état
(soumis, fermé, facturé, expédié) qui reprend les aspects abordés lors de l’analyse des
processus.
• Les deux tables des commandes ne comportent pas le prix de la commande ou tout
autre information inutile : la quantité commandée suffit puisque l’information du prix
unitaire est stockée dans la table des produits.
On notera que le pluriel n’est jamais utilisé dans la figure 1.16 : on parle de la notion de
client et non pas du fichier des clients (au pluriel). Une démarche correcte consiste à
manipuler le concept et non la réalité finale : il est évident qu’il existera des centaines de
clients, fournisseurs et autres éléments dans la base. Une propriété affirmée pour vraie
concernant un élément doit nécessairement rester vraie pour tous les éléments de la même
classe ; voilà pourquoi le concept n’a pas à s’appliquer au pluriel.
Le concepteur de la base Northwind, en fait, a démultiplié certains ensembles, qui ont été
synthétisés ci-dessus, pour en arriver au modèle de la figure 1.17. Pour visualiser ce
modèle 1 :
1. Cliquez dans la barre de menu sur « Outils de base de données ».
2. Cliquez sur l’icône Relations.

Figure 1.17
Modèle relationnel
de la base
Northwind.

1. Pour notre part, nous n’approuvons pas, dans la conception de la base, de nombreux points visibles sur ce modèle. Les tables sont notées au
pluriel, ce qui est contraire aux standards en la matière. Les identifiants sont notés par le seul libellé « ID » sans préciser de quel ID il s’agit. De
nombreux champs sont notés avec des espaces, ce qui complique passablement le travail des programmeurs dans les requêtes SQL. Le mot
« Commandes » de la table du même nom sous-entend « Commande_Client » alors que le mot « Bons de commandes » sous-entend
« Commande_Fournisseur », d’où des confusions syntaxiques très risquées. Et il ne s’agit là que des éléments les plus frappants !

34 Access® 2007 et VBA


Access Livre Page 35 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 5 RETOUCHER UN FORMULAIRE EN MODE CRÉATION


1
Chapitre

• Énoncé Comme vu précédemment, le formulaire de saisie et de modification d’un nouveau


client dans la base Northwind ne comporte pas de masque de saisie des numéros de télé-
phone pour contrôler la validité de leur format. Modifiez cette zone pour la rendre plus
conviviale et adaptée. Cet exercice est destiné à familiariser le lecteur avec les basculements
successifs du mode utilisateur au mode création.

* Solution Il s’agit de modifier les contrôles de ce formulaire : il est donc impératif de passer en mode
création pour en modifier les propriétés :
1. Dans le volet de navigation, cliquez du bouton droit sur le formulaire « Détails du
client ».
2. Dans la fenêtre contextuelle, cliquez sur « Mode création » ; vous visualisez le formu-
laire tel qu’il apparaît à la figure 1.18.

Figure 1.18
Formulaire de saisie
des clients en mode
création.

3. Cliquez au-dessus de la zone blanche « Téléphone professionnel » : le contrôle est mis


en surbrillance.
4. Cliquez du bouton droit au même endroit, puis cliquez sur « Propriétés » (on peut
également cliquer sur « Feuille des propriétés » dans le ruban du menu Création qui est
apparu lors du passage en mode création) : la feuille des propriétés apparaît.
Exercices

5. Seul l’onglet « Données » est accessible, mais il est préférable d’afficher toutes les
propriétés en utilisant l’onglet « Toutes ».
6. Descendez jusqu’à l’item « Masque de saisie ».
7. Sur la même ligne, à droite, cliquer sur le carré muni de trois points.

Les objets d’Access 35


Access Livre Page 36 Mercredi, 27. f vrier 2008 7:28 07

8. Access démarre un Assistant Masque de saisie comme le présente la figure 1.19.

Figure 1.19
Assistant Masque
de saisie d’Access.

9. Choisissez dans la liste le format « Numéro de téléphone », ou bien « Numéro de télé-


phone international » si la base commerciale est destinée à l’international.
10. Passez à l’étape suivante, qui permet de modifier partiellement ou totalement le masque
choisi.
11. Passez à l’étape suivante, qui conditionne le stockage de la donnée entrée avec ou sans
son masque.
12. Terminez l’assistant.
13. Testez la modification en repassant en mode formulaire (dans le ruban du menu Création,
cliquez sur l’icône Affichage à gauche).
14. Quand les tests sont positifs, appliquez les mêmes modifications aux contrôles « Télé-
phone mobile » et « N˚ de télécopie ».
15. Passez alternativement du mode utilisateur au mode création jusqu’à ce que tous les
contrôles soient opérationnels. Cette modification de la base Northwind n’a pas
d’incidence sur les fonctionnalités du logiciel.

36 Access® 2007 et VBA


Access Livre Page 37 Mercredi, 27. f vrier 2008 7:28 07

Le modèle relationnel,
2
Chapitre

concevoir une base


de données
1. Merise, un outil
Les exercices du chapitre précédent ont laissé en-
méthodologique ...................... 38 trevoir que l’assemblage des données stockées
Problèmes et exercices
dans une base nécessitait une organisation parti-
1. Créer la base de données
d’une bibliothèque de prêt ....... 53 culière ; dans la même optique, le montage des
2. Gérer un organisme
de formation ........................... 57 objets qui contiennent ces données nécessite
3. Créer la base de données une méthode. Nous étudierons donc maintenant
du système télépéage............... 60
la création des tables et la mise en place
des relations entre elles. L’aspect théorique, ici,
aura au moins autant d’importance que la mani-
pulation du logiciel Access.

37
Access Livre Page 38 Mercredi, 27. f vrier 2008 7:28 07

(1) Merise, un outil méthodologique


Merise (Méthode d’Étude et de Réalisation Informatique pour les Systèmes d’Entreprise), est
une méthode, à présent ancienne, qui donne un cadre formel au développeur pour mettre
en œuvre sa base de données. Merise, au départ, distingue plusieurs niveaux d’abstraction des
modèles et plusieurs types de base de données. Pour l’exposé qui suit, nous ne retiendrons
que les deux aspects suivants :
• le modèle physique des données et plus précisément l’organisation des données dans des
tables ;
• la base de données relationnelle.
Dans la mesure où nous n’aborderons pas la plus grande partie de la méthode Merise, très
théorique, nous simplifierons l’approche en conservant les grands principes de base.

1.1 PRINCIPE D’UNICITÉ DE L’INFORMATION

Le premier enseignement fondamental de la méthode touche l’unicité de l’information :


toute information ne doit être stockée qu’une et une seule fois dans une base 1. Un exem-
ple illustrera ce premier point, en réutilisant la base de données Northwind. Celle-ci
comprend :
• une table « Client » contenant toutes les coordonnées propres au client (nom, adresse,
etc.) ;
• une table « Commande client » comportant tous les bons de commande.
La table « Commande » ne contient ni le nom, ni l’adresse du client, contrairement à toute
attente. Pour imprimer le bon de commande, par exemple, il sera nécessaire de chercher
les informations nécessaires dans la table « Client » par un lien à définir. La table com-
mande client contient le numéro du client, qui, donc, servira de lien. On dit qu’il existe
une relation entre la table client et la table commande ; le numéro de client, présent dans
les deux tables, matérialise cette relation. Une telle organisation est d’abord économe en
termes d’espace disque, mais, surtout, le système de gestion de base de données la gère
complètement en interne. Nul besoin de contrôler le rapprochement des occurrences de
part et d’autre des deux tables à l’aide de programmes lourds et complexes, le système
contrôle en permanence l’intégrité de la base.
Un second exemple, plus matériel encore, illustrera l’utilité d’une organisation en tables.
Imaginons que vous ayez à créer un fichier complet de vos relations personnelles. Pour
chaque enregistrement, c’est-à-dire chaque parent ou ami, vous voudrez évidemment
commencer la saisie par la civilité Monsieur, Madame ou Mademoiselle. Si vous vous
contraignez à opérer cette saisie, vous penserez probablement, après une dizaine de lignes,
que cette frappe est fastidieuse et répétitive. Dans un premier temps, vous utiliserez un
raccourci du type M., Mme, Mlle et plus loin encore vous finirez par écrire 1 (qui signi-
fiera Monsieur), 2 (Madame) ou 3 (Mademoiselle), la forme la plus rapide de raccourci.
C’est très exactement ce que fait une base de données, au travers de ce qu’un utilisateur

1. Ce principe peut être outrepassé si des obligations d’ordre légal, par exemple, contraignent au stockage de données validées et archivées
(paie, facturation, etc.). Ceci ne remet pas en cause la théorie.

38 Access® 2007 et VBA


Access Livre Page 39 Mercredi, 27. f vrier 2008 7:28 07

verra comme une zone de liste déroulante. Le dessin des deux tables mises en œuvre sera
celui de la figure 2.1.
2
Chapitre

Figure 2.1
Modèle relationnel
simplifié Civilité-
Contact.

La notation utilisée dans la figure 2.1 est particulière, nous y reviendrons plus loin.
Attachons-nous d’abord à comprendre le schéma général.
Les deux carrés représentent des « containers » des données qui y seront stockées, non les
données elles-mêmes. La table « CIVILITE » de gauche ne contiendra, en définitive, que
trois enregistrements que l’on pourra décrire très exactement comme à la figure 2.2.

Figure 2.2
Contenu de la table
CIVILITE.

Dans la table « CIVILITE », il n’existe aucune allusion aux contacts du carnet d’adresses.
En revanche, la table « CONTACT » comporte un champ nommé « ID_CIVILITE » ; ce
dernier ne contiendra pas de données telles que M. ou Madame, mais uniquement les
chiffres correspondants de la table « CIVILITE », et dans la pratique les chiffres 1 ou 2 ou
3. Le même champ « ID_CIVILITE » se retrouve dans les deux tables « CIVILITE » et
« CONTACT ».
On notera tout de suite qu’il n’existe pas dans la figure 2.1, pour le moment, de trait (de
lien) entre les deux « ID_CIVILITE », celui de la table « CIVILITE » et celui de la table
« CONTACT » ; cette présentation est volontaire. Il peut exister un lien réel, entré dans
la base de données et que l’on traitera plus loin ; mais il peut aussi ne pas en exister.
L’important, fondamentalement, réside dans la présence effective d’un champ ID dans
la table « CONTACT » qui corresponde à une valeur contenue dans la table « CIVI-
LITE ».
Enfin, la figure 2.1 montre un libellé parfaitement identique du terme « ID_CIVI-
LITE » dans les deux containers de droite et de gauche. Cette volonté sémantique n’est
pas obligatoire, mais optionnelle : Access saurait rapprocher deux colonnes ne portant
pas le même nom. En revanche, et pour des raisons évidentes de clarté dans la démar-
che, nous déconseillons fortement de nommer différemment les deux colonnes dans
chacune des tables.

Le modèle relationnel, concevoir une base de données 39


Access Livre Page 40 Mercredi, 27. f vrier 2008 7:28 07

1.2 PRINCIPE D’IDENTIFIANT

À l’intérieur d’une même table, chaque item de l’ensemble (en d’autres termes chaque
enregistrement), doit pouvoir être identifié de manière unique et obligatoire. La réunion
de ces deux conditions permet de considérer l’information d’identification comme une clé
primaire de la table. En reprenant l’exemple de la table « CIVILITE », la colonne « ID_civi-
lite » doit :
• être obligatoire, le champ ne peut pas être vide (null) ;
• contenir des valeurs parmi lesquelles ne se trouve aucun doublon.
Dès lors que ces deux conditions sont respectées, on peut considérer que la colonne
« ID_civilite » est l’identifiant des enregistrements qu’on ajoutera à la table.
Un bon principe de base consiste à créer systématiquement un champ de clé primaire
dans toutes les nouvelles tables, même lorsque le besoin immédiat n’en est pas évident.
Inversement, il est possible qu’une table contienne une clé primaire constituée de plusieurs
champs ; nous étudierons ce cas plus loin.
La nature de cette clé primaire peut être variée et il n’existe pas d’obligation particulière
sur ce point. La plupart du temps, on utilisera un code numérique, le plus simple, et pour
lequel Access propose une solution d’incrémentation automatique. Mais une clé primaire
peut aussi être constituée de lettres (pensons à la codification à trois lettres de tous les
aéroports du monde : JFK pour l’un des aéroports de New York et CDG pour celui de
Roissy) ou bien toute autre organisation. On évitera des clés primaires trop compliquées
ou générant des problèmes légaux (le numéro de Sécurité sociale par exemple).
Le choix d’une clé primaire étant primordial, on portera une attention particulière à sa
validité dans tous les cas de figure à traiter ultérieurement. Par exemple, il est maladroit
d’identifier les villes de France au moyen de leur code postal : un bureau de Poste peut
couvrir plusieurs communes. S’il n’existe pas de besoin particulier d’identifier toutes les
communes de France, ce choix portera la table à environ 8 000 enregistrements ; dans
le cas contraire (et le plus général), il sera plus judicieux d’utiliser les codes Insee des
communes (environ 36 000).
On réfléchira également à l’étendue de la codification : pour reprendre l’exemple des aéro-
ports, la codification choisie à trois lettres permet d’enregistrer 263 aéroports soit 19 604
au maximum.

1.3 ASPECT DE LA PRÉSENTATION UNIFORME DES DONNÉES.

Dès qu’une donnée peut se répéter plusieurs fois sous diverses formes, il devient nécessaire
de mettre en place un système permettant d’adopter un référentiel. Imaginons une table
« ETUDIANT » contenant les coordonnées de ceux-ci. Si un champ de cette table doit
contenir le dernier diplôme obtenu par les étudiants, il est maladroit de créer une simple
zone de texte dans laquelle l’utilisateur aura toute liberté de saisir les valeurs qui lui sem-
blent les plus adéquates. Dans ce cas précis, il y a fort à craindre qu’une personne saisira
« Baccalauréat scientifique mention Bien », pendant qu’une deuxième mettra « Bac S
Mention B », et une dernière « Bac S ». Nul doute qu’il ne sera pas possible de faire des

40 Access® 2007 et VBA


Access Livre Page 41 Mercredi, 27. f vrier 2008 7:28 07

requêtes structurées sur de pareils libellés. Il devient donc indispensable d’établir un sys-
tème relationnel entre les étudiants et leurs diplômes, à l’image de la figure 2.3.
2
Chapitre

Figure 2.3
Modèle relationnel
simplifié Etudiant-
Diplôme.

1.4 PRINCIPE DE LA RÉDUCTION ÉLÉMENTAIRE

Imaginons maintenant que la volonté du développeur consiste à enregistrer tous les diplô-
mes obtenus par les étudiants. Il ne peut pas exister, parmi les champs de la table, un
champ DIPLOMES au pluriel, destiné à recevoir la liste des diplômes déjà obtenus par
l’étudiant. En admettant que le programmeur ait prévu 255 caractères de long pour rem-
plir le champ de données, la saisie « au kilomètre » de diplômes variés ne constituera
qu’un ensemble totalement inexploitable par la suite. Chaque champ ne doit donc com-
porter qu’une et une seule information : cette information doit être réduite à son expres-
sion élémentaire. Certes, une solution bâtarde consisterait à multiplier les champs
DIPLOME1, DIPLOME2, etc., mais on imagine aisément que le procédé est excessivement
limité : un étudiant brillant dépassera nécessairement, tôt ou tard, le nombre de diplômes
prévus. De plus, les requêtes qui seront faites pour compter les diplômes par étudiant, par
exemple, s’avéreront très compliquées à mettre en place.
Le système relationnel de la figure 2.3 ne suffit dès lors plus et il est nécessaire de passer à
une forme plus élaborée telle que celle de la figure 2.4.

Figure 2.4
Modèle relationnel
Etudiant_Diplôme.

Dans le modèle détaillé de la figure 2.4, il est possible d’insérer un infinité de diplômes à
une infinité d’étudiants, grâce à l’insertion d’une table intermédiaire dont nous verrons le
fonctionnement dans le point suivant. Notons tout de suite que cette présentation permet
aussi d’insérer des informations nouvelles telles que la mention au diplôme ou la date
d’obtention.

Le modèle relationnel, concevoir une base de données 41


Access Livre Page 42 Mercredi, 27. f vrier 2008 7:28 07

1.5 PRINCIPES RELATIONNELS

Les relations entre les tables doivent être conjuguées logiquement avant d’être mises en
place. On focalisera l’attention sur le rapport quantifiable entre les deux tables à relier.
La conjugaison s’exprime, pour reprendre les exemples précédents, de la manière
suivante :
Un contact porte une et une seule civilité (on ne peut être simultanément Monsieur et
Madame) ; une civilité s’applique à plusieurs contacts (le carnet d’adresses peut comporter
plusieurs Monsieur et plusieurs Madame).
Un bon de commande client correspond à la commande d’un et un seul client (si un autre
client fait une autre commande, y compris portant sur les mêmes articles, un autre bon de
commande sera rédigé) ; un client peut faire zéro, une, ou une infinité de commandes.
Un bon de commande fournisseur est soumis par un et un seul représentant (celui qui
s’est connecté initialement à la base) ; un représentant peut rédiger zéro, un ou plusieurs
bons de commande fournisseur.
Dans ces trois énoncés, la conjugaison semble naturelle et logique ; elle intègre d’emblée
une relation de un à plusieurs. En revanche, il arrivera fréquemment que la mise face-à-
face de deux tables induise des conjugaisons diverses. Étudions donc les cas de figure
possibles, qui se limitent logiquement à trois :
les relations de 1 à plusieurs, déjà vues ;
les relations de 1 à 1 ;
les relations de plusieurs à plusieurs.

Les relations de 1 à 1
Nous supposons la présence de deux tables contenant des données relatives, par exemple,
à vos contacts professionnels, d’une part, et à vos contacts personnels, d’autre part. La conju-
gaison de ces deux tables peut se décliner ainsi :
• un contact professionnel correspond soit à zéro, soit à un et au plus un contact personnel
(un partenaire commercial peut aussi être un ami !) ;
• un contact personnel correspond soit à zéro, soit à un et au plus un contact personnel
(même raison).
Nous sommes ici devant une relation de un à un. A priori, et pourvu que les uns et les
autres n’aient pas de rôle particulier à jouer dans le système d’information à mettre en
place, il n’y a aucune raison pour ne pas fusionner purement et simplement les deux
fichiers. La seule opération à mettre en place avant ladite fusion consiste à créer une pro-
priété particulière à la table qui fusionne les deux fichiers pour distinguer les « commerciaux »
des « amis personnels ». Cet exemple peut être généralisé : les relations de un à un dans
une base bien conçue n’existent pas 1.

1. Seul cas de figure possible : si la table doit compter plus de 255 colonnes, il sera nécessaire de créer une table « fille ».

42 Access® 2007 et VBA


Access Livre Page 43 Mercredi, 27. f vrier 2008 7:28 07

Les relations de plusieurs à plusieurs


Le cas inverse est beaucoup plus fréquent. Imaginons que la base de données à créer
2
Chapitre

concerne des élèves qui apprennent des langues vivantes au lycée. La conjugaison des relations
serait, en première analyse, la suivante :
• un lycéen apprend plusieurs langues ;
• une langue est apprise par plusieurs lycéens.
La relation semble plurielle dans les deux sens. En l’état, elle ne sera pas gérable par une
base de données, et il s’avère obligatoire de développer cette relation plurielle dans les
deux sens en deux relations de un à plusieurs. Dans le cas des lycéens, cela nous conduira
à la proposition suivante :
• un lycéen fait un choix pour une langue ;
• un choix de langue s’applique à plusieurs lycéens ;
et
• un choix de lycéen porte sur une langue ;
• une langue donne lieu à plusieurs choix.
En d’autres termes, on intercale une table intermédiaire entre les deux tables des lycéens et
des langues (voir figure 2.5).

Figure 2.5
Modèle relationnel
Lycéen-Langue.

Ici, la table « OPTION_LINGUISTIQUE » comporte non seulement sa propre clé pri-


maire mais les identifiants des deux tables « LYCEEN » et « LANGUE » : on parle de clés
étrangères.
Le contenu effectif des tables sera semblable à celui de la figure 2.6.

Figure 2.6
Contenu des tables
du modèle
relationnel Lycéen-
Langue.

Le modèle relationnel, concevoir une base de données 43


Access Livre Page 44 Mercredi, 27. f vrier 2008 7:28 07

On lit dans la table « OPTION_LINGUISTIQUE » les inscriptions suivantes aux langues :


• Bertrand DUPOND, lycéen n˚ 2 est inscrit en Anglais, langue n˚ 1 ;
• Claude MARTIN, lycéen n˚ 3 est inscrit en Anglais, langue n˚ 1 ;
• Bertrand DUPOND, lycéen n˚ 2 est inscrit en Allemand, langue n˚ 2.
En résumé, toute relation de plusieurs à plusieurs doit être décomposée pour ne gérer avec
Access que des relations de un à plusieurs.
C’est d’ailleurs exactement la reprise du cas de figure des clients et des produits. Au départ,
il peut être affirmé :
• un client commande un ou plusieurs produits ;
• un produit est commandé par un ou plusieurs clients.
Présentée ainsi, cette relation apparaît comme une relation de plusieurs à plusieurs. En
fait, et dans le modèle Northwind, elle a été décomposée ainsi :
• un client fait une ou plusieurs commandes ;
• une commande relève d’un et un seul client ;
et
• un produit rentre dans une ou plusieurs commandes ;
• une commande (pris dans le sens d’une ligne de commande) concerne un et un seul
produit.

La problématique du temps
Il est toujours nécessaire de réfléchir sur la notion de temps. La conjugaison de la relation
doit être vraie à un instant t et à tous les instants t’, t’’, etc. Si l’évolution dans le temps doit
changer la nature de la relation, alors le modèle relationnel doit en tenir compte.
Imaginons un salarié nouvellement embauché ; aux premiers jours de son emploi, il sera
placé à un certain niveau de la Convention Collective Nationale (CCN) de laquelle il relève.
Or, il est probable que le même salarié, avec l’ancienneté et de nouvelles qualifications, pro-
gressera dans l’échelle de la Convention collective. Si l’échelon est simplement porté comme
un champ parmi d’autres dans la table « SALARIE », la valeur contenue dans ce champ devra
être modifiée dans la table « SALARIE » au moment de sa promotion. Malheureusement, la
valeur précédente disparaîtra définitivement et il ne sera plus possible de faire une reconsti-
tution de carrière et connaître la vitesse de promotion du salarié dans l’entreprise.
Aussi, la panoplie complète des outils relationnels doit être mise en œuvre pour arriver au
modèle présenté à la figure 2.7.

Figure 2.7
Modèle relationnel
Salarié-Convention
Collective
Nationale.

44 Access® 2007 et VBA


Access Livre Page 45 Mercredi, 27. f vrier 2008 7:28 07

Dans ce modèle, la notion de date d’affectation à un niveau de Convention collective


s’insère dans la table intermédiaire « AFFECTATION_CCN ». C’est précisément cette
table qui permettra de faire l’historique de carrière du salarié.
2
Chapitre

La proposition littérale de relation est la suivante :


• un salarié a une ou plusieurs affectations dans sa carrière ;
• une affectation correspond à un et un seul salarié ;
et
• une affectation vise un et un seul niveau de CCN ;
• les échelons de la CCN peuvent porter sur zéro, une ou plusieurs affectations.

Le cas particulier des relations réflexives


Une table peut comporter des relations avec elle-même. C’est le cas, par exemple, d’une
table des salariés dans laquelle on veut faire intervenir une notion de parenté. Initialement, la
proposition de relation peut s’exprimer ainsi :
• un salarié est le parent (frère ou sœur ou autre) de plusieurs salariés ;
• un salarié a pour parents plusieurs salariés ;
Le modèle à générer sera celui de la figure 2.8.

Figure 2.8
Modèle relationnel
Salarié-Lien de
parenté.

Ici, Access créé fictivement une table « SALARIE_1 », qui représente la même table que
« SALARIE » et permet de représenter la relation d’un salarié à un autre. Dans la table
« PARENTE », on mettra le libellé des parentés possibles (frère, sœur, cousin, père, etc.).
Dans la table « LIEN_DE_PARENTE », on insérera le lien entre un salarié et un autre.
Pour parfaitement exprimer le lien de parenté frère/sœur entre Anatole et Zoé, deux enre-
gistrements seront nécessaires dans la table « LIEN_DE_PARENTE » :
• le premier avec un « ID_SALARIE1 » sur Anatole et un « ID_SALARIE2 » sur Zoé
(l’« ID_PARENTE » étant positionné à Frère) ;
• le second avec un « ID_SALARIE1 » sur Zoé et un « ID_SALARIE2 » sur Anatole
(l’« ID_PARENTE » étant positionné à Sœur) 1.

1. Les deux relations entre le lien de parenté et la table salarié devront impérativement comporter l’option de suppression en cascade des
enregistrements correspondants car, sans cette option, toute suppression de salarié ayant un rapport de parenté avec un autre deviendrait
impossible (voir dans la section de ce même chapitre la notion de suppression en cascade).

Le modèle relationnel, concevoir une base de données 45


Access Livre Page 46 Mercredi, 27. f vrier 2008 7:28 07

1.6 LA CRÉATION DES TABLES

Cette première approche théorique étant bien assimilée, des cas pratiques peuvent être
abordés.
Nous allons créer une base « de travail » et y créer des tables et autres objets Access. Vous
aurez donc à conserver en permanence ce fichier.
1. Fermez toutes les applications éventuellement ouvertes.
2. Démarrez Access.
3. Cliquez sur l’icône Base de données vide.
4. En bas à droite, indiquez le nom de base « BASE_DE_TRAVAIL.ACCDB » en lieu et
place du libellé « Base de Données1.accdb » donné par défaut.
5. Le répertoire de classement est par défaut le répertoire « Mes Documents » ; changez-
le si nécessaire (retenez alors le nouveau chemin !).
6. Cliquez sur le bouton « Créer ».
7. Immédiatement, la table « Table1 » de la nouvelle base est créée, qui contient déjà une
nouvelle table, nommée Table1, laquelle est déjà ouverte en mode saisie.
8. Cliquez sur la croix en haut à droite pour fermer ce premier objet (et apprendre ainsi,
dès le démarrage, à créer une table).
9. Dans la barre de menus, cliquez sur « Créer », puis sur l’icône Table.
Immédiatement une nouvelle table est créée, ouverte en mode saisie.
Il est déconseillé d’utiliser ce mode pour créer la nouvelle table (ses propriétés ne seront
pas accessibles et les champs seront nommés Champ1, Champ2, etc.).
10. Cliquez sur l’icône Affichage en haut à gauche.
11. Access propose d’enregistrer la table sous un nouveau nom : saisissez « SALARIE » 1.
La fenêtre de création de table apparaît sous l’apparence de la figure 2.9.

Figure 2.9
Fenêtre de création
de table.

1. Dans la totalité de l’ouvrage, nous utilisons des conventions de noms que nous recommandons : les noms de tables et noms de champs sont
entrés en majuscules (non accentués), sans aucun espace. L’absence d’accentuation limite les possibilités d’erreurs, l’absence d’espace évite au
programmeur de cerner les noms de champ par des crochets ([ ]) dans la saisie des requêtes SQL. On verra plus loin que l’aspect « esthétique »
de la présentation des tables peut être retrouvé grâce à la notion de « Légende ».

46 Access® 2007 et VBA


Access Livre Page 47 Mercredi, 27. f vrier 2008 7:28 07

La partie supérieure comporte tous les champs de la table pendant que la partie inférieure
affiche les propriétés de chacune des lignes, ligne par ligne, au fur et à mesure et suivant le
positionnement du pointeur du pavé supérieur.
2
Chapitre

Access propose d’emblée de commencer la table par un champ de clé primaire symbolisé
dans la colonne de gauche par une petite clé jaune. Ce premier point étant conforme aux
recommandations énoncées dans la partie théorique, nous le maintiendrons. Le premier
champ s’appelle par défaut « N˚ » : ce début de libellé peut être conservé et continué par
une précision sur le type de numéro ; le champ pourra être nommé « N˚SALARIE », par
exemple. Malheureusement, le signe « ˚ » du « N˚ » peut poser des problèmes par la suite :
c’est la raison pour laquelle de nombreux programmeurs utilisent plutôt « ID_SALARIE »
(sans espace), mais avec un soulignement (underscore) entre « ID » et « SALARIE ». La
faute à ne pas commettre, à l’inverse, consiste à nommer le champ « ID » ou « N˚ » sans
autre précision. Access accepte ce type de confusion alors que d’autres bases ne l’acceptent
pas ; dans tous les cas de figure, cette démarche maladroite exposera ultérieurement à de
forts risques de confusion entre les tables.
Le type de données de la future colonne de la table, indiqué à droite, est « NuméroAuto » :
en clair, cela signifie qu’Access incrémentera d’une unité chaque nouvel enregistrement.
Cette présentation, bien que peu pratique dans certains cas, est conservée ici.
Dans le pavé inférieur, les zones à vérifier sont les suivantes :
• Le type de données « NuméroAuto » est de la forme d’un entier long (à retenir pour la
création des clés étrangères ultérieurement).
• Les nouvelles valeurs seront sous la forme d’incrément et non pas des valeurs aléatoires
(sans doublon).
• Le format, ici, n’a pas à être précisé.
• La légende peut être renseignée en respectant parfaitement l’orthographe ; nous suggé-
rons donc par exemple « Numéro de salarié » (avec les espaces et l’accentuation). La
légende apparaîtra automatiquement en lieu et place du code « ID_SALARIE » dans
tous les formulaires et états.
• L’index est positionné à « Oui Sans doublon » : cette disposition est obligatoire pour un
champ de clé primaire.
• Balises actives et Aligner le texte seront abordés plus loin.
Sur la deuxième ligne de la colonne Nom de champ, saisissez le libellé « NOM_SALA-
RIE » : encore une fois, cette convention de nom peut paraître lourde, mais elle entre dans
une démarche logique. Il peut exister un grand nombre de tables dans lesquelles le vocable
NOM sera employé ; dans une petite base, on peut déjà imaginer NOM_CLIENT, NOM_
FOURNISSEUR, NOM_SALARIE, par exemple. C’est la raison pour laquelle il est utile de
préciser de quel nom il s’agit afin que le Dictionnaire des données, c’est-à-dire l’ensemble
des noms de champs, ne comporte pas de doublons.
Access propose par défaut (à droite du nom de champ) que le format des données soit
de type Texte, ce qui, pour le cas présent, est valide. La longueur par défaut, indiquée en
bas, est de 255 caractères, mais peut être réduite (un nom de salarié excédera rarement

Le modèle relationnel, concevoir une base de données 47


Access Livre Page 48 Mercredi, 27. f vrier 2008 7:28 07

50 caractères). Nous préciserons, à ce stade, quelques autres propriétés du champ


NOM_SALARIE :
• La légende sera « Nom du salarié », correctement orthographié pour une bonne lisi-
bilité ultérieure dans les formulaires.
• La zone Null interdit sera positionnée à « Oui » (quand l’utilisateur crée un nouveau
salarié, la zone du nom doit être impérativement remplie, sinon l’enregistrement ne
sera pas validé).
• La Chaîne vide autorisée sera positionnée à « Non » (l’utilisateur ne peut pas tricher en
remplaçant l’absence de nom par une simple chaîne vide).
• La zone Indexé peut éventuellement être positionnée à « Oui avec doublon » (il peut y
avoir plusieurs Dupont ou plusieurs Martin, donc les doublons doivent être autorisés).
La mise en place d’un index accélérera les recherches sur le nom, si elles sont fréquen-
tes ; en revanche, la création d’un index multipliera par deux l’espace disque nécessaire
pour stocker les données et la saisie de nouveaux enregistrements sera ralentie. En
conséquence, les index ne doivent être mis en place que sur les colonnes sur lesquelles
sont effectuées de nombreuses recherches et uniquement pour les tables dont le nombre de
créations ou mises à jour est faible.
Le troisième champ, nommé PRENOM_SALARIE sera traité de la même manière que le
précédent, de même que le quatrième champ ADRESSE1_SALARIE (longueur de texte
poussée à 100 toutefois). Le cinquième champ ADRESSE2_SALARIE, destiné à indiquer
un nom de bâtiment ou une précision sur un lieudit ne sera pas obligatoire (zone Null
interdit positionnée à « Non »).
Le sixième champ, indiquant le code postal et nommé CP_SALARIE, mérite quelques
développements :
• Contrairement aux apparences, il ne s’agit pas d’une zone numérique : le code postal de
Bourg-en-Bresse est le 01000, avec un zéro en première position, et non pas 1000. Si le
champ de code postal est formaté en numérique, tous les zéros à gauche ne seront pas
pris en compte. Il s’agit donc bien d’une zone Texte, qu’on positionnera à 5 caractères
de long (si la base de données n’a pas pour vocation de gérer des codes postaux inter-
nationaux).
• Le masque de saisie peut être précisé : cliquez sur les trois petits points à droite de la
zone Masque de saisie ; le cas échéant, enregistrez provisoirement la table, et visualisez
l’assistant à la création de masque de saisie. Parmi les différentes présentations propo-
sées, celle des codes postaux français est énumérée : validez-la.
• Le champ Null interdit peut être positionné à « Non ».
Terminez la saisie des champs de la table de la manière suivante :
• Le champ VILLE_SALARIE est une zone de texte (50 caractères), obligatoire.
• Le champ SALAIRE_BRUT_SALARIE est une zone numérique (réel double), non obli-
gatoire.

48 Access® 2007 et VBA


Access Livre Page 49 Mercredi, 27. f vrier 2008 7:28 07

La description des champs, à droite, peut être remplie, aux seules fins de documenter
l’application ; la table doit avoir les caractéristiques précisées à la figure 2.10
2
Chapitre

Figure 2.10
Table SALARIE en fin
de création.

Dans la mesure où la table a déjà été nommée « SALARIE » antérieurement, il n’est plus
utile de repréciser ce paramètre. Il suffit de fermer l’onglet en cours et d’accepter l’enregis-
trement des modifications.
En procédant de la même manière, créez une nouvelle table nommée « CCN » (pour
Convention Collective Nationale) et dotée des champs suivants :
• « ID_CCN », clé primaire, à incrémentation automatique ;
• « LIBELLE_CCN », zone de texte de 100 caractères, obligatoire.
Toujours de la même manière, créez une troisième et dernière table nommée
« AFFECTATION_CCN » et dotée des champs suivants :
• « ID_AFFECTATION_CCN », clé primaire, à incrémentation automatique ;
• « ID_SALARIE », zone numérique au format nombre entier, obligatoire ;
• « ID_CCN », zone numérique au format nombre entier, obligatoire ;
• « DATE_AFFECTATION_CCN », zone au format date obligatoire à laquelle on ajou-
tera la valeur par défaut Date() (qui mettra automatiquement la date du jour à chaque
nouvel enregistrement).

Le modèle relationnel, concevoir une base de données 49


Access Livre Page 50 Mercredi, 27. f vrier 2008 7:28 07

Les deux nouvelles tables auront les caractéristiques de la figure 2.11.

Figure 2.11
Tables CCN et
AFFECTATION_CCN
en fin de création.

Il est souhaitable d’effectuer la saisie de ces renseignements avec un soin extrême pour
épargner au développeur de fastidieux retours en arrière. Il faut prévoir tous les cas de
figure avant d’avancer dans les opérations ; il est toujours possible d’ajouter des champs,
d’en supprimer ou de les renommer, mais ces démarches sont hasardeuses.

1.7 L’INTÉGRITÉ RÉFÉRENTIELLE

Jusqu’à maintenant, toutes les relations explicitées entre des tables n’ont eu qu’un fonde-
ment sémantique. C’est parce que nous avons utilisé le vocable « ID_SALARIE », par
exemple, à la fois dans la table « SALARIE » et dans la table « AFFECTATION_CCN » que
le lecteur a fait le rapprochement, se doutant que les valeurs contenues dans ces champs de
la table devaient pouvoir être appariées. Au-delà de cette démarche intellectuelle, il n’y a
rien dans la base de données, à ce stade, pour contrôler si les appariements des valeurs
vont effectivement se réaliser.
En d’autres termes, et au stade où se trouve la création de la base, il est possible d’attribuer
le coefficient 250 de la Convention Collective au premier salarié venu alors même que ce
coefficient n’existe pas dans la table « CCN » ; de la même manière, il est possible de créer
une ligne d’affectation dans la table « AFFECTATION_CCN » alors que le salarié n’existe pas !
Une base de données peut très bien fonctionner ainsi 1 : le contrôle de la saisie des valeurs
est alors reporté sur le programme informatique d’interface homme/machine qui, en
conséquence, s’alourdit considérablement.
Il est infiniment plus efficace d’utiliser les contraintes d’intégrité référentielle que comporte
toute base de données relationnelle afin de garantir la cohérence des valeurs contenues
dans chacune des tables. En reprenant le premier exemple des deux tables « CONTACT »
et « CIVILITE », il est possible de poser une contrainte d’intégrité référentielle via le
champ « ID_CIVILITE » qui se trouve simultanément dans les deux tables :

1. C’est malheureusement trop souvent le cas, même sur des bases de données plus puissantes qu’Access. Seules des problématiques de
répartition des tables dans les environnements client/serveur, ou bien des impératifs de migrations de données peuvent légitimer l’absence
d’intégrité référentielle dans la base.

50 Access® 2007 et VBA


Access Livre Page 51 Mercredi, 27. f vrier 2008 7:28 07

• En qualité de clé primaire pour la table « CIVILITE » ;


• En qualité de clé étrangère dans la table « CONTACT ».
2
Chapitre

Dès lors, il sera impossible d’insérer une valeur différente de 1, ou 2, ou 3 (équivalentes de


Monsieur, Madame, Mademoiselle) dans la table « CONTACT », ces trois seules valeurs
ayant été saisies dans la table « CIVILITE ».
La mise en place des contraintes référentielles s’opère avec une option des outils de base de
données :
• Dans le menu « Outils de base de données », cliquez sur « Relations ».
• Dans le ruban, cliquez sur le bouton « Relations ».
• Double-cliquez sur les tables « SALARIE », « CCN » et « AFFECTATION_CCN » (ou
cliquez sur « Ajouter »).
• Cliquez sur l’« ID_SALARIE » de la table « SALARIE » et gardez le clic enfoncé.
• Placez la souris au-dessus de l’« ID_SALARIE » de la table « AFFECTATION_CCN » (la
souris affiche un signe +) et relâchez.
La fenêtre de la figure 2.12 apparaît, permettant de créer les paramètres de la relation.

Figure 2.12
Paramétrage
d’une relation.

La contrainte entre les deux tables peut comporter plusieurs niveaux :


• Le seul fait de cliquer immédiatement sur « Créer » (sans avoir coché la case « Appli-
quer l’intégrité référentielle ») crée un simple lien entre les deux tables : lorsqu’une
requête appelant ces deux tables sera faite, Access proposera ce lien qui aura été mémo-
risé. Mais il n’existe pas d’intégrité référentielle.
• À l’inverse, en cochant l’option « Appliquer l’intégrité référentielle », on établit une
relation forte entre les deux tables : il sera impossible d’ajouter une affectation dans la
table « AFFECTATION_CCN » si l’« ID_SALARIE » invoqué n’existe pas dans la table
« SALARIE ». Ce contrôle sera permanent.
Une intégrité référentielle étant posée, les deux options en dessous deviennent manipulables.
La première permet de « Mettre à jour en cascade les champs correspondants ». Dans la
pratique cela signifie que si la valeur 1 dans le champ ID_SALARIE de la table « SALARIE »
est changée par la valeur 10, par exemple, toutes les anciennes valeurs 1 de la table des
affectations seront changées en 10 1.

1. Dans le cas présent, cette modification est impossible dans la mesure où le champ « ID_SALARIE » de la table « SALARIE » est un
« NuméroAuto ». La validation de l’option de mise à jour en cascade n’a donc aucun intérêt dans cette configuration.

Le modèle relationnel, concevoir une base de données 51


Access Livre Page 52 Mercredi, 27. f vrier 2008 7:28 07

La dernière option ouvre la voie à la « Suppression en cascade ». Dans la pratique, cela


signifie que si un salarié est supprimé de la table « SALARIE », tous les enregistrements le
concernant seront supprimés de la table « AFFECTATION_CCN ». Naturellement cette
option est à utiliser avec circonspection.
1. Cochez la case « Appliquer l’intégrité référentielle » et cliquez sur « Créer ».
La fenêtre des relations contient désormais un « fil de liaison » entre les deux « ID_SALARIE ».
Le fait d’avoir coché l’intégrité référentielle montre le symbole 1 du côté Un de la relation
de Un-à-plusieurs et le symbole ∞ du côté Plusieurs de la relation de Un-à-plusieurs.
2. Procédez de la même manière avec la table « CCN » pour obtenir le résultat de la
figure 2.13 qui présente la contrainte d’intégrité référentielle entre « ID_CCN » de la table
« CCN » (clé primaire) et « ID_CCN » de la table « AFFECTATION_CCN » (clé
étrangère).
3. Fermer ensuite la fenêtre de mise en relation en appuyant sur le bouton « Fermer » et
en validant les modifications.

Figure 2.13
Modèle relationnel
Salarié-CCN.

On ne saurait que trop recommander la mise en place des contraintes d’intégrité référen-
tielle dès les premiers instants de la création de la base de données ; il sera toujours très
ardu d’ajouter ces contraintes lorsque des données auront déjà été enregistrées. En effet,
Access refusera cette mise en place si tous les enregistrements ne respectent pas la nouvelle
règle.

Résumé
La création des objets fondamentaux que sont les tables dans une base Access doit procé-
der d’une réflexion méthodique préalable sur la conception et l’organisation des informa-
tions à gérer. Cette réflexion s’appuiera sur Merise comme base méthodologique. Toutes
les tables créées comporteront systématiquement un identifiant, tous les champs créés ne
contiendront que des données élémentaires, non décomposables. Des relations seront
impérativement mises en place entre toutes les tables, en reportant la clé primaire des
tables principales sur un champ de clé étrangère dans la table à mettre en relation. Toutes
les relations seront unifiées dans un rapport d’Un-à-plusieurs, sauf exceptions.
Les relations ne doivent pas seulement être possibles, mais formalisées par l’établissement
de contraintes d’intégrité référentielle.

52 Access® 2007 et VBA


Access Livre Page 53 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
2
Chapitre

Les exercices ci-après permettent de mettre en place les fondements d’une base de données
dans divers systèmes d’information. Chaque fois, les modèles demandés se limitent à
l’essentiel de la base, sans entrer dans le détail qu’exigerait un véritable développement
logiciel. Dans tous les cas, il s’agit :
• de réfléchir sur l’architecture du système d’information ;
• de créer les tables nécessaires ;
• d’établir les relations.

EXERCICE 1 CRÉER LA BASE DE DONNÉES D’UNE BIBLIOTHÈQUE DE PRÊT

• Énoncé Vous devez concevoir le système d’information d’une petite bibliothèque municipale qui
prête des livres.
1. Commencez par porter sur le papier vos premières approches. Pensez à dissocier la
gestion des adhérents et celle des livres, et définissez les relations entre ces deux entités.
2. Créez les tables nécessaires.
3. Mettez en place les contraintes d’intégrité référentielle.

* Solution 1. Conception du modèle


Les premières tables qui peuvent être mises sur papier sont :
• une table qu’on appellera « ADHERENT », pour désigner l’emprunteur du livre ;
• une table « LIVRE ».
La conjugaison de la relation, en première analyse, donnerait :
• un adhérent emprunte un ou plusieurs livres (surtout dans le temps) ;
• un livre est emprunté par un ou plusieurs adhérents (successivement, par nécessité).
Cette première énonciation fait apparaître une relation de plusieurs-à-plusieurs qui doit
être développée en plusieurs relations de un-à-plusieurs. La solution serait :
• un adhérent effectue un ou plusieurs emprunts ;
• un emprunt est fait par un et un seul adhérent ;
et
• un livre donne lieu à plusieurs emprunts ;
• un emprunt concerne un et un seul livre ;
Exercices

L’insertion de la table intermédiaire « EMPRUNT » solutionnera donc ce premier aspect


de la problématique. En première analyse, le schéma relationnel ne devrait donc comporter
que les trois tables suivantes :
• une table « ADHERENT » qui contient la clé primaire « ID_ADHERENT » et tous les
champs nécessaires à la fiche de celui-ci (nom, prénom, adresse, etc.) ;

Le modèle relationnel, concevoir une base de données 53


Access Livre Page 54 Mercredi, 27. f vrier 2008 7:28 07

• une table « LIVRE » qui contient la clé primaire « ID_LIVRE » et tous les champs relatifs
à la fiche du livre ;
• une table « EMPRUNT » qui contient une clé primaire, la clé étrangère « ID_LIVRE »
et la clé étrangère « ID_ADHERENT ». Un champ supplémentaire « DATE_
EMPRUNT » permet de connaître la date de l’emprunt.
Réfléchissons à présent sur le choix des clés primaires :
• Dans la table « ADHERENT », l’ID pourra être constitué d’un simple numéro incré-
mentiel : le premier aura le numéro 1, le suivant 2, etc. Il suffira de prévoir, dans le
programme, un contrôle pour éviter qu’un adhérent déjà inscrit ne soit pas recréé
une deuxième fois.
• Dans la table « EMPRUNT », pour les mêmes raisons, une numérotation incrémen-
tielle suffira.
• En revanche, la clé primaire de la table « LIVRE » pose un nouveau problème ;
admettons qu’une numérotation incrémentielle soit choisie, l’achat de deux exem-
plaires d’un même livre va aller à l’encontre du principe merisien de l’unicité de
l’information : la fiche d’un livre sera remplie deux fois sous deux numéros. Or, une
telle possibilité est quasi certaine : une bibliothèque de prêt, même modeste, risque fort
d’acheter au moins trois ou quatre exemplaires des Quatre Mousquetaires d’Alexandre
Dumas pour répondre à la demande des collégiens. Une autre idée pourrait consister à
prendre pour identifiant du livre son ISBN (International Standard Book Number), mais
dans ce cas, si deux livres identiques sont achetés, le deuxième ISBN sera vu comme
un doublon et rejeté.
Le modèle initial est donc faux et nécessite de nouveaux développements.
L’insertion d’une nouvelle table « EXEMPLAIRE » s’avère indispensable, pour désigner
non pas la notion de livre, mais celle du volume qui sera rangé sur une étagère. L’étude de
la relation entre un livre et un exemplaire s’exprime par les postulats suivants :
• Un livre est acheté en un ou plusieurs exemplaires ;
• Un exemplaire correspond à un et un seul livre.
Ici, la relation s’exprime immédiatement comme étant de un-à-plusieurs.
La table « EXEMPLAIRE » contient une clé primaire « ID_EXEMPLAIRE » à incrémenta-
tion automatique, à laquelle on pourra ajouter une notion de date d’achat et d’état du
volume (neuf, bon état, médiocre, à mettre au pilon). Il faut ajouter à ces champs la clé
étrangère « ID_LIVRE » correspondant au livre concerné.
La table « LIVRE » contient une clé primaire « ISBN » et tous les champs utiles à un fichier
bibliographique (titre, auteur, éditeur, etc.).
Naturellement, il serait possible maintenant d’étendre la base de données à un classe-
ment bibliographique plus large en créant des tables des auteurs, des éditeurs, etc.
Toutefois, et s’agissant d’une petite bibliothèque, on considérera ces extensions non
indispensables.

54 Access® 2007 et VBA


Access Livre Page 55 Mercredi, 27. f vrier 2008 7:28 07

2. Création des tables


La réflexion sur la structure de la base étant achevée, il est possible de passer à la création
2
Chapitre

physique.
Créez la base de données « Bibliothèque ». Créez ensuite la table « ADHERENT » à
l’image de la table « SALARIE » du cours et avec les champs suivants :
• ID_ADHERENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• NOM_ADHERENT, Texte, 50 caractères, Null interdit, Indexé avec doublons.
• PRENOM_ADHERENT, Texte, 50 caractères, Null interdit, non indexé.
• ADRESSE1_ADHERENT, Texte, 100 caractères, Null interdit, non indexé.
• ADRESSE2_ADHERENT, Texte, 100 caractères, Null autorisé, non indexé.
• CP_ADHERENT, Texte, 5 caractères, Null interdit, non indexé.
• VILLE_ADHERENT, Texte, 50 caractères, Null interdit, non indexé.
Pour chaque champ, n’omettez pas de compléter la zone « Légende » afin de rendre compré-
hensibles les intitulés techniques des noms de champ.
Créez la table « LIVRE » avec les items suivants :
• ISBN_LIVRE, clé primaire, Texte, 18 caractères, Indexé sans doublons. La création de la
clé donnera lieu à l’insertion d’un masque de saisie déjà existant (masque ISBN).
• TITRE_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon.
• AUTEUR_LIVRE, Texte, 100 caractères, Null interdit, Indexé sans doublon.
• EDITEUR_LIVRE, Texte, 50 caractères, Null autorisé, non indexé.
• DATE_LIVRE, Numérique, Entier, Null autorisé, non indexé (on indiquera seulement
l’année de parution).
• NB_PAGES_LIVRE, Numérique, Entier, Null autorisé, non indexé.
• PRIX_LIVRE, Numérique, Réel double, Null autorisé.
Créez la table « EMPRUNT » avec les caractéristiques suivantes :
• ID_EMPRUNT, clé primaire, NuméroAuto, Entier long, Indexé sans doublon.
• ID_ADHERENT, Numérique, Entier Long, Null interdit, non indexé.
• ID_EXEMPLAIRE, Numérique, Entier Long, Null interdit, non indexé.
• DATE_EMPRUNT, Date, Format « Date, Général » (date et heure complets).
• RETOUR_EMPRUNT, Date, Format « Date, Général ».
La création de la table « EXEMPLAIRE » va nous permettre de découvrir une nouvelle
fonction.
• Créez la table et son identifiant « ID_EXEMPLAIRE », clé primaire, NuméroAuto,
Entier long, Indexé sans doublon.
• Créez le champ « ISBN_LIVRE », texte, 18 caractères, non indexé (clé étrangère).
Exercices

• Créez un champ « ETAT_LIVRE », Numérique, Entier, Null interdit, non indexé.


• Le champ « ETAT_LIVRE » étant actif, cliquez dans le pavé inférieur sur l’onglet Liste
de choix.

Le modèle relationnel, concevoir une base de données 55


Access Livre Page 56 Mercredi, 27. f vrier 2008 7:28 07

• Dans « Afficher le contrôle », choisissez « Zone de liste déroulante ».


• Dans « Origine source », choisissez « Liste Valeurs ».
• Dans « Contenu », insérez les valeurs suivantes, séparées par des points-virgules
1;"Neuf ";2;"Bon état";3;"Médiocre";4;"A pilonner".
• La colonne liée est la 1 (par défaut).
• Le nombre de colonnes est de 2.
• Dans « En-tête colonne », choisissez « Non ».
• Dans « Largeurs colonnes », insérez les valeurs suivantes, séparées par des points-virgules
0;3 (présentation des largeurs en centimètres : la première colonne sera cachée).
• Dans « Lignes affichées », indiquez « 4 ».
• Dans « Limiter à liste », choisissez « Oui ».
• Laissez les autres paramètres à leur valeur par défaut.
Pour éviter de créer une table supplémentaire désignant l’état des livres, le champ
« ETAT_LIVRE » a été paramétré pour montrer les quatre valeurs possibles et n’autoriser
que l’une des quatre (la zone étant obligatoire). Il est important de comprendre que la
table va effectivement stocker les valeurs numériques 1, 2, 3 ou 4 et non les textes
« Neuf », « Médiocre » et autres. Il reviendra au développeur d’interpréter cette colonne
numérique au moment de faire des requêtes pour synthétiser, par exemple, l’état général
de la bibliothèque. N’hésitez pas à tester, par la suite, les effets visuels de la saisie d’une
valeur dans ce champ.
On pourrait, de la même manière, faire appel à des zones de liste déroulante pour afficher
le contenu d’une table au moment de la saisie d’une autre. Par exemple, la zone « ID_
ADHERENT » de la table « EMPRUNT » peut comporter une zone de liste déroulante
appelant la table « ADHERENT » : nous verrons plus loin dans la création des formulaires
cette faculté de liaison.

3. Mise en place de l’intégrité référentielle


• Ouvrez la fenêtre des relations.
• Ajoutez les tables « ADHERENT », « LIVRE », « EXEMPLAIRE ».
• Par un glisser-déplacer, liez les deux champs « ID_ADHERENT » présents.
• De la même manière, liez les deux champs « ID_LIVRE ».
• Liez enfin les deux champs « ID_EXEMPLAIRE » afin d’obtenir le modèle de la figure 2.14.

Figure 2.14
Modèle relationnel
d’une bibliothèque
de prêt.

56 Access® 2007 et VBA


Access Livre Page 57 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 2 GÉRER UN ORGANISME DE FORMATION


2
Chapitre

• Énoncé Vous devez concevoir le système d’information d’un organisme de formation. Les clients
de cette société, spécialisée dans la formation informatique, sont tous eux-mêmes des
sociétés commerciales qui envoient leurs salariés à des formations. L’organisme salarie
(en CDD) des formateurs en free-lance pour assurer des sessions de formation portant
sur divers sujets.
Vous devez donc mettre en relation les notions de société cliente, salarié, formateur,
cours, session de formation et salle de formation, puis créer les tables nécessaires.
1. Première approche conceptuelle. Pour vous aider, nous vous indiquons le processus
opérationnel :
• Relation client, salarié, embauche.
• Relation salarié, session, inscription.
• Relation session et formateur.
• Relation cours et session.
• Relation session et salle de formation.
2. Création des tables de la base.

* Solution 1. Conception du système


Les données sur le client et ses salariés conduisent à la relation :
• Un client a un ou plusieurs salariés ;
• Un salarié a un ou plusieurs employeurs (simultanément ou successivement).
On peut en effet imaginer que le salarié est à temps partiel chez plusieurs employeurs ou
change d’emploi 1. Cette affirmation sera développée en :
• un client procède à une ou plusieurs embauches ;
• une embauche est faite par un et un seul employeur ;
et
• une embauche concerne un et un seul salarié ;
• un salarié peut avoir plusieurs embauches (dans le temps ou simultanément).
Le salarié et la session de formation sont liés par la relation :
• un salarié participe à une ou plusieurs sessions ;
• une session réunit plusieurs salariés.
Qu’on développera en :
• un salarié est inscrit à plusieurs sessions ;
• une inscription concerne un et un seul salarié ;
et
• une inscription concerne une et une seule session ;
Exercices

• une session donne lieu à plusieurs inscriptions.

1. La relation établie ici recouvre une approche « puriste » du modèle relationnel. Dans bien des systèmes d’information, on considèrera que
les cas de multi-employeurs ou de salariés qu’on retrouve dans plusieurs entreprises clientes est trop marginal pour mériter une table
intermédiaire « EMBAUCHE ». En effet, l’introduction de cette table alourdit singulièrement les procédures d’inscription d’un nouveau salarié
à une nouvelle session de formation. Dans bien des cas, les concepteurs préféreront les solutions dans lesquelles un même salarié est entré
plusieurs fois dans la base de données au titre de plusieurs employeurs.

Le modèle relationnel, concevoir une base de données 57


Access Livre Page 58 Mercredi, 27. f vrier 2008 7:28 07

La table intermédiaire « INSCRIPTION » servira, par exemple, à établir la base des listes
d’émargement de la formation.
La session se conjugue avec le formateur de la manière suivante :
• une session est assurée par un et un seul formateur ;
• un formateur assure une ou plusieurs formations.
Il n’y a donc pas lieu de développer cet aspect. On notera toutefois que, dans cette organi-
sation, la session ne peut être assurée que par un seul formateur : on exclut par là une
session où plusieurs intervenants sont nécessaires.
Le cours (la matière enseignée) s’associe à la session par la relation :
• une session concerne un et un seul cours ;
• un cours donne lieu à plusieurs sessions.
La salle de formation se lie avec la session ainsi :
• une session a lieu dans une et une seule salle ;
• une salle reçoit plusieurs sessions (dans le temps).
Ici encore, nous excluons le cas où une session de plusieurs jours pourrait avoir lieu dans
plusieurs salles.
Le dessin global (et réduit à ses seules clés du modèle relationnel) sera celui de la figure 2.15.

Figure 2.15
Première approche
du modèle
relationnel
d’un organisme
de formation.

2. Création des tables


Créez la table « CLIENT » avec les champs suivants :
• ID_CLIENT, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null interdit, Indexé avec doublons.
• ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé.
• ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé.

58 Access® 2007 et VBA


Access Livre Page 59 Mercredi, 27. f vrier 2008 7:28 07

• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé.


• VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé.
2
Chapitre

Créez la table « SALARIE » avec les champs suivants :


• ID_SALARIE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• NOM_SALARIE, Texte, 50 caractères, Null interdit, Indexé avec doublons.
• PRENOM_SALARIE, Texte, 50 caractères, Null interdit, Non indexé.
Notez qu’il n’est pas utile, à moins d’une demande formelle du commanditaire de l’appli-
cation, d’insérer les coordonnées du salarié : l’organisme de formation n’a pas à écrire, par
exemple, au salarié. Tous les rapports avec les stagiaires s’effectuent via le client.
Créez la table « EMBAUCHE » avec les champs suivants :
• ID_EMBAUCHE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit,
Non indexé.
• ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit,
Non indexé.
• DATEDEBUT_EMBAUCHE, Date, Format Abrégé, Null interdit, Non indexé.
• DATEFIN_EMBAUCHE, Date, Format Abrégé, Null autorisé, Non indexé.
Créez la table « INSCRIPTION » avec les champs suivants :
• ID_INSCRIPTION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• ID_SESSION, (clé étrangère de la table SESSION), Numérique, Entier long, Null interdit,
Non indexé.
• ID_SALARIE, (clé étrangère de la table SALARIE), Numérique, Entier long, Null interdit,
Non indexé.
Créez la table « FORMATEUR » avec les champs suivants :
• ID_FORMATEUR, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• NOM_FORMATEUR, Texte, 50 caractères, Null interdit, Indexé avec doublons.
• ADRESSE1_FORMATEUR, Texte, 100 caractères, Null interdit, non indexé.
• ADRESSE2_FORMATEUR, Texte, 100 caractères, Null autorisé, non indexé.
• CP_FORMATEUR, Texte, 5 caractères, Null interdit, non indexé.
• VILLE_FORMATEUR, Texte, 50 caractères, Null interdit, non indexé.
Créez la table « SALLE » avec les champs suivants :
• ID_SALLE, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
• ETAGE_SALLE, Numérique, Entier, Null interdit, non indexé.
• NUMERO_SALLE, Numérique, Entier, Null interdit, non indexé.
Créez la table « COURS » avec les champs suivants :
• ID_COURS, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.
Exercices

• NOM_COURS, Texte, 50 caractères, Null interdit, non indexé.


• DUREE_COURS, Numérique, Entier, Null interdit, non indexé.
Créez la table « SESSION » avec les champs suivants :
• ID_SESSION, clé primaire, NuméroAuto, Entier long, Indexé sans doublons.

Le modèle relationnel, concevoir une base de données 59


Access Livre Page 60 Mercredi, 27. f vrier 2008 7:28 07

• ID_COURS, (clé étrangère de la table COURS), Numérique, Entier long, Null interdit,
Non indexé.
• ID_SALLE, (clé étrangère de la table SALLE), Numérique, Entier long, Null interdit,
Non indexé.
• ID_FORMATEUR, (clé étrangère de la table FORMATEUR), Numérique, Entier long,
Null interdit, Non indexé.

EXERCICE 3 CRÉER LA BASE DE DONNÉES DU SYSTÈME TÉLÉPÉAGE

• Énoncé Imaginez que vous êtes le responsable informatique du système télépéage. Les grands
principes : un groupement d’intérêt économique nommé Télépéage réunit toutes les
sociétés d’autoroute françaises (Sanef, APRR, Escota, etc.). Chaque société d’autoroute
possède des péages. Les particuliers ou les entreprises peuvent louer un ou plusieurs bad-
ges à coller sur le pare-brise du véhicule (mais le badge n’est pas nécessairement associé à
un véhicule précis). Le passage à un péage est automatiquement détecté, à l’entrée
comme à la sortie, de sorte que les voyages sont facturés en fin de mois et en bloc pour
tous les passages d’un badge. Vous devez concevoir le système d’information de Télé-
péage, en vous limitant aux tables essentielles du modèle.
1. Commencez par mettre sur papier vos premières approches conceptuelles.
2. Créez les tables nécessaires et les contraintes d’intégrité référentielle.

* Solution Bien que relativement simple, le modèle relationnel du système télépéage demande un
niveau d’abstraction assez élevé et recèle quelques pièges si ses éléments fondamentaux ne
sont pas bien dissociés.

1. Conception du système
En premier lieu, la notion de péage doit être précise : par péage, on entend, non pas un
groupement de passages, tous abrités par une grande arche, mais un couloir de péage par
lequel ne peut passer qu’un seul véhicule en même temps. Cette distinction revêt la plus
haute importance pour arriver à bien conjuguer les relations à mettre en place, en particulier
considérant le facteur temps. La notion de péage comporte donc les caractéristiques sui-
vantes :
• un numéro d’ordre ;
• un nom générique (Chartres nord, Chartres centre, Chartres sud par exemple) ;
• un n˚ de couloir dans la station de péage.
Cette seule énumération nous conduit à penser qu’il serait judicieux de créer deux tables,
l’une pour les stations, l’autre pour les couloirs en les liant ainsi :
• une station comporte un ou plusieurs couloirs ;
• un couloir est situé dans une et une seule station.
Il s’agit là d’une relation de un-à-plusieurs ne nécessitant pas de développements supplé-
mentaires.

60 Access® 2007 et VBA


Access Livre Page 61 Mercredi, 27. f vrier 2008 7:28 07

La présence de deux types de clients, les particuliers et les entreprises, pourrait induire en
erreur et pousser le concepteur à créer deux tables distinctes. Cette dissociation n’est pas
nécessaire et compliquerait beaucoup le modèle pour un faible avantage. La seule problé-
2
Chapitre

matique de la fusion des deux types de clientèle concernera les zones obligatoires de la
fiche client, différentes pour les uns et les autres. Dans les deux cas, particulier ou entre-
prise, un client peut louer un ou plusieurs badges (un particulier peut très bien louer 3
badges, pour lui-même et ses deux enfants). Le badge apparaît donc comme un élément
indispensable du modèle : ce n’est pas le client qui passe le péage, mais son badge, ce qui
est très différent (le locataire peut très bien prêter son badge à un ami).
La relation à mettre en place pourrait donc se conjuguer ainsi :
• un client possède un ou plusieurs badges ;
• un badge appartient à un et un seul client.
Mais cette dernière affirmation est-elle exacte à tous les instants ? Certainement non. Il est
envisageable qu’un client rende son badge au système télépéage, pour beaucoup de motifs
valables, et que ce dernier soit mis en location auprès d’un autre et nouveau client. En
d’autres termes, si le badge est considéré comme une non-valeur et qu’il est jeté après
usage, alors l’affirmation précédente est juste ; dans le cas contraire (qui est le cas actuel),
la relation doit s’exprimer ainsi :
• un client possède un ou plusieurs badges ;
• un badge est loué par plusieurs clients (dans le temps).
Étant plurielle dans les deux sens, la relation doit se développer selon le modèle suivant :
• un client contracte une ou plusieurs locations ;
• une location concerne un et un seul client ;
et
• une location concerne un et un seul badge ;
• un badge peut donner lieu à plusieurs locations.
La notion de passage au péage, elle, traduit la relation qui existe entre un badge et un couloir
de péage ; elle donne lieu à l’affirmation suivante :
• un badge passe par plusieurs couloirs de péage (évidemment pas au même moment !) ;
• un couloir de péage voit passer plusieurs badges (évidemment pas ensemble, le couloir
étant trop étroit !) ;
Laquelle doit être développée ainsi :
• un badge effectue plusieurs passages dans un couloir (dans le temps) ;
• un passage correspond à un badge et un seul ;
et
• un passage correspond à un couloir et un seul ;
• un couloir enregistre plusieurs passages.
Exercices

Le prix qui sera facturé au client doit être incorporé dans le modèle. Assurément, il ne
peut pas être intégré directement dans la table des stations de péage puisqu’il est fonction
non pas d’une seule station mais du degré de proximité avec une autre station. Il s’agit
donc bien d’une relation réflexive de la table « STATION » avec elle-même.

Le modèle relationnel, concevoir une base de données 61


Access Livre Page 62 Mercredi, 27. f vrier 2008 7:28 07

• une station de départ correspond à un prix pour joindre une autre station d’arrivée (il
n’est pas possible de faire demi-tour sur une autoroute !) ;
• une station d’arrivée correspond à un prix pour être jointe à une station de départ.
Cette affirmation laisse entendre que le modèle permet d’intégrer des prix différents pour
l’aller et le retour depuis une station vers une autre. On peut également ajouter une date
de tarif qui permettra de gérer dans le temps les augmentations inéluctables.
Pour terminer, les sociétés d’autoroute doivent être liées aux stations de péage :
• une société d’autoroute possède une ou plusieurs stations ;
• une station est possédée par un et un seul concessionnaire.
Cette première étape de réflexion bénéficiera d’un premier brouillon sur le papier, où l’on
se contentera de jeter les petits carrés des tables, les identifiants et les clés étrangères, et les
relations. Le brouillon devrait donner un résultat voisin de la figure 2.16.

Figure 2.16
Première approche
du modèle
relationnel du
système télépéage.

C’est volontairement que ce modèle ne représente pas les tables contenant, par exemple,
les éléments de la réalisation de la facturation. En revanche, toutes les informations sont
en place pour réaliser ladite facturation tant au profit des sociétés d’autoroutes (qui per-
çoivent, au final, les droits de péage) et les clients (qui paient leurs passages). La table
« PASSAGE », la plus sollicitée de toutes, sera automatiquement incrémentée par les systèmes
de barrières. Sa lecture mensuelle sera à la base de la facturation.

2. Création des tables


Voici la liste des tables avec leurs différents champs.
Table « CLIENT » : • ID_CLIENT, Clé primaire, NuméroAuto, Entier long.
• TYPE_CLIENT, Numérique, Entier, Obligatoire, non indexé, pourvu d’une liste de
choix en forme de zone de liste déroulante et dont la liste des valeurs est 1 pour Entre-
prise et 2 pour Particulier (la liste doit être limitée à ces deux seules valeurs, le format
est 1;"Entreprise";2;"Particulier").
• RAISON_SOCIALE_CLIENT, Texte, 50 caractères, Null autorisé, non indexé. La zone
ne peut pas être obligatoire puisque certains clients sont des particuliers. Il faudra donc
prévoir des contrôles particuliers dans les formulaires de saisie pour vérifier que l’un

62 Access® 2007 et VBA


Access Livre Page 63 Mercredi, 27. f vrier 2008 7:28 07

des deux champs « NOM_CLIENT » ou « RAISON_SOCIALE_CLIENT » est effec-


tivement rempli.
2
Chapitre

• NOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé 1.


• PRENOM_CLIENT, Texte, 50 caractères, Null autorisé, non indexé.
• SIRET_CLIENT (SIRET signifiant Service d’Inscription au Registre des Établissements
et constituant l’identifiant de toute société commerciale). Le champ est de type
« Texte » avec 15 caractères, le « Null » est autorisé, mais la colonne est « indexée sans
doublon » afin de garantir l’absence de double inscription d’une entreprise. Le champ
est doté d’un masque de saisie déjà existant, nommé « N˚Siret ».
• NO_INTRACOM_CLIENT : il s’agit du n˚ intracommunautaire, obligatoire pour la
facturation des clients européens non français. Comme le SIRET, la colonne est en
« Null autorisé » mais « indexée sans doublon ». Le masque de saisie n’existant pas, il
faut le créer, il est de la forme « CC 99 000 000 000 » où CC désigne le pays (FR, BE, IT,
etc.), 99 est une clé et les 9 chiffres suivants les 9 premiers chiffres du numéro de Siret (il
faudra prévoir dans le formulaire de saisie un contrôle pour vérifier que les deux
numéros concordent, ce type de contrôle n’étant pas possible au niveau de la table
elle-même).
Pour créer un nouveau masque de saisie :
1. Le curseur supérieur visant le champ « NO_INTRACOM_CLIENT », cliquez sur la
zone « Masque de saisie » et sur le bouton aux trois petits points de la marge de droite.
2. Cliquez sur Modifier la liste.
3. Créez un nouvel enregistrement en cliquant sur le point jaune voisinant les boutons
de déplacement.
4. Dans « Description », indiquez « N˚Intracommunautaire ».
5. Dans « Masque de saisie », saisissez la chaîne de caractères > CC 00 000 000 000 (le
signe supérieur > oblige à une saisie en majuscules, le CC indique qu’il s’agit de carac-
tères, les zéros suivants obligent à la saisie de chiffres, les espaces décomposent
logiquement la codification).
6. Dans l’exemple, recopiez la chaîne de caractères « CC 99 000 000 000 ».
7. Fermez la fenêtre et choisissez le nouveau masque (testez-le en saisie pour vérifier sa
conformité).
• ADRESSE1_CLIENT, Texte, 100 caractères, Null interdit, non indexé.
• ADRESSE2_CLIENT, Texte, 100 caractères, Null autorisé, non indexé.
• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé.
• VILLE_CLIENT, Texte, 50 caractères, Null interdit, non indexé.
Table « STATION » : • ID_STATION, Clé primaire, NuméroAuto, Entier Long, Obligatoire, Indexé sans
doublon.
• ID_STE_AUT, (clé étrangère de la table « STE_AUT »), Numérique, Entier long, Null
interdit, non indexé.
Exercices

• NOM_STATION, Texte, 50 caractères, Null interdit, non indexé.

1. Un index avec doublon pourrait être posé sur les deux champs « RAISON_SOCIALE_CLIENT » et « NOM_CLIENT » pour améliorer les
recherches, mais cet index aurait a gérer de nombreuses valeurs « Null », ce qui le rendrait peu performant.

Le modèle relationnel, concevoir une base de données 63


Access Livre Page 64 Mercredi, 27. f vrier 2008 7:28 07

Il ne faut évidemment pas créer de table « STATION_1 » comme l’indique le modèle rela-
tionnel de la figure 2.15 : cette présentation est fictive et Access gérera automatiquement la
relation réflexive de la table « STATION » sur elle-même.
Table « PEAGE » : • ID_PEAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_STATION, (clé étrangère de la table « STATION »), Numérique, Entier long, Null
interdit, non indexé.
• NO_PEAGE, Numérique, Entier, Null interdit, non indexé (pour indiquer le numéro
du couloir dans la station de péages).
Table « PASSAGE » : • ID_PASSAGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_PEAGE, (clé étrangère de la table PEAGE), Numérique, Entier long, Null interdit,
non indexé.
• ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit,
non indexé.
• DATE_PASSAGE, Date, Null interdit, non indexé. Il est très important, ici que le format de
la date soit de type Général, indiquant aussi l’heure exacte de passage.
Table « TARIF » : • ID_TARIF, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublon.
• ID_STATION1, (première clé étrangère de la table « STATION »), Numérique, Entier
long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage de
départ.
• ID_STATION2, (deuxième clé étrangère de la table « STATION »), Numérique, Entier
long, Null interdit, non indexé. Par convention, on considérera qu’il s’agit du péage
d’arrivée.
• PRIX_TARIF, Numérique, Réel Double, Null interdit, Non indexé.
• DATE_TARIF, Date au format Général, Null interdit, Non indexé.
Table « BADGE » : • ID_BADGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons.
• CODEBARRE_BADGE, Texte, 13 caractères, Null interdit, Indexé sans doublon.
Table « LOCATION » : • ID_LOCATION, Clé primaire, NuméroAuto, Null interdit, Indexé sans doublons.
• ID_BADGE, (clé étrangère de la table BADGE), Numérique, Entier long, Null interdit,
Non indexé.
• ID_CLIENT, (clé étrangère de la table CLIENT), Numérique, Entier long, Null interdit,
Non indexé.
• DATEDEBUT_LOCATION, Date au format abrégé, Null interdit, Non indexé.
• DATEFIN_LOCATION, Date au format abrégé, Null autorisé, Non indexé.
Table « STE_AUT » : La table « STE_AUT » sera en tous points identique à celle des clients. Il est néanmoins
dangereux de pratiquer la création de cette table en effectuant un copier/coller de la table
des clients. Les noms de champs, en particulier, doivent tous être suffixés « _STE_AUT » et
non plus « _CLIENT ».
Vous terminerez l’exercice en mettant en place toutes les relations grâce au bouton « Relations
des Outils de base de données ». N’oubliez pas de cocher l’option d’intégrité référentielle ;
la mise à jour ou la suppression en cascade ne sont pas indispensables.

64 Access® 2007 et VBA


Access Livre Page 65 Mercredi, 27. f vrier 2008 7:28 07

Les différentes formes


3
Chapitre

d’acquisition de données,
importer et attacher
1. Les importations de données..... 66
Il existe de multiples manières d’acquérir des don-
2. Les liaisons de données ............ 71 nées dans Access. On peut les importer complète-
Problèmes et exercices
ment dans une base déjà existante, mais, au-delà
1. Importer des données
au format Excel ....................... 75 de cette première approche, on peut attacher des
2. Importer des données
au format CSV ........................ 77
sources de données à une base sans avoir à les
3. Importer des données manipuler dans Access. Ces données acquises,
d’une autre base Access........... 79
4. Établir les contraintes
le logiciel offre un puissant assistant pour créer
référentielles............................ 80 des requêtes propres à interroger la masse d’infor-
mations et réaliser aisément de lourds traitements.
Le même outil peut servir à insérer de nouvelles
données, à les modifier ou à les supprimer.

65
Access Livre Page 66 Mercredi, 27. f vrier 2008 7:28 07

(1) Les importations de données


Par importation, on entend l’addition de nouvelles données dans une base existante, qui
deviennent dès lors totalement indépendantes de la source depuis laquelle elles ont été
puisées. Pour les exposés à venir, il est nécessaire de récupérer sur le site de l’éditeur, à
l’adresse www.pearsoneducation.fr, les fichiers « Codes_Postaux_France.xlsx » (Excel),
« Codes_Postaux_France.accdb » (Access), « Codes_Postaux_France_Séparateurs.txt »
(format texte délimité) et « Codes_Postaux_France_Fixe.txt » (format texte fixe).

1.1 LE SIMPLE COPIER-COLLER

Dans la mesure où les produits Microsoft sont intégrés les uns aux autres, la manière la
plus aisée de récupérer des données dans Access consiste simplement à les copier et les coller,
mais avec une option spécifique.
1. Créez une nouvelle base de données nommée « MesContacts » et rangée dans vos
documents favoris.
2. Créez une table nommée « CP », dotée de deux colonnes nommées « CODE » et
« VILLE », toutes deux de type texte de 255 caractères de long (valeur par défaut).
Supprimez toute clé primaire créée par défaut de sorte que la table ne comporte que
deux colonnes.
3. Ouvrez la table « CP » en mode Feuille de données en double-cliquant sur le nom de la
table.
4. Ouvrez le fichier « Codes_Postaux_France.xlsx ».
5. Mettez en surbrillance la totalité des deux colonnes A et B.
6. Appuyez sur Ctrl + C (copier).
7. Sans nécessairement fermer Excel, repassez sur la feuille Access vierge de la table
« CP ».
8. Dans la barre de menu « Accueil », cliquez sur le petit triangle en bas de l’icône Coller.
9. Cliquez sur « Coller par ajout ».
Access affiche un message d’insertion identique à celui de la figure 3.1.
Cette manipulation appelle quelques commentaires :
• L’emploi du simple « coller » (Ctrl+V) aurait généré un message d’erreur : si Access
cherche à coller l’ensemble des 8 004 enregistrements dans un seul champ, il n’y par-
viendra évidemment pas (« texte trop long pour être modifié » dit le message erreur).
C’est donc bien un « Coller par ajout » qu’il faut utiliser.

66 Access® 2007 et VBA


Access Livre Page 67 Mercredi, 27. f vrier 2008 7:28 07

Figure 3.1
Ajout des codes
3
Chapitre

postaux dans
la table CP.

• Access cherchera à coller les données dans la mesure du possible : les deux colonnes qui
réceptionnent les données sont au format texte et d’une très grande largeur, le collage
sera donc effectif. Mais en supposant que la colonne « Ville » soit initialement au for-
mat numérique, l’importation ne se fera pas, car les données ne sont pas conformes.
Access proposera de créer une table des erreurs d’importations qui contiendra tous les
enregistrements en erreur.
• Le collage étant réalisé, on remarque que la première ligne, qui contenait dans Excel les
libellés de colonne n’a pas été collée, alors qu’elle aurait pu être importée, puisque
les colonnes destinataires ont un format texte conforme.
Le copier/coller par ajout sera toujours possible, qu’il s’agisse d’une feuille Excel, d’un
tableau dans Word, d’un fichier texte ou de toute autre source, à condition que les formats
source et destination soient compatibles.

1.2 L’IMPORTATEUR EXCEL

Access dispose d’outils destinés à importer ou lier des données externes.


• Dans le menu « Données externes », cliquez sur l’icône Excel du ruban.

Les différentes formes d’acquisition de données, importer et attacher 67


Access Livre Page 68 Mercredi, 27. f vrier 2008 7:28 07

Le programme ouvre une fenêtre de dialogue présentée à la figure 3.2.

Figure 3.2
Ajout des codes
postaux dans la
table CP.

Cette grille-écran propose :


• Soit d’importer les données dans une nouvelle table.
• Soit d’importer les données dans une table existante (c’est l’équivalent exact du copier/
coller par ajout du paragraphe précédent).
• Soit d’établir un lien, comme on le verra plus loin.
Dans un premier temps, nous importerons les données dans une nouvelle table :
1. Cliquez sur le bouton « Parcourir », choisissez le chemin et le nom du fichier à importer
(Codes_Postaux_France.xlsx), puis cliquez sur « OK ».
2. L’assistant d’importation ouvre une fenêtre de première étape permettant de choisir la
feuille où se trouvent les données à importer. Le nom de l’onglet deviendra le nom
de la table (qu’il sera toujours possible de renommer ultérieurement). Cliquez sur
« Suivant ».
3. La deuxième étape demande à l’utilisateur si l’en-tête des colonnes est indiqué sur la
première ligne Excel : cochez la case puisque c’est effectivement le cas, puis cliquez sur
« Suivant ».
4. La troisième étape ouvre la fenêtre présentée à la figure 3.3.
• Les en-têtes de colonnes du fichier Excel ayant été reconnus, ils sont incorporés aux
noms de champ (s’ils n’existaient pas, il serait alors possible de les indiquer dans la zone
supérieure gauche).
• Le type de données est reconnu d’après les caractéristiques Excel, mais il peut être
modifié.

68 Access® 2007 et VBA


Access Livre Page 69 Mercredi, 27. f vrier 2008 7:28 07

• Access adapte le mieux possible le niveau d’index. Toutefois, il ne lit pas la totalité de la
colonne et propose un niveau moyen : ici, l’index sans doublon peut être choisi
puisqu’il n’y a pas de doublon.
3
Chapitre

• La case inférieure droite permet de ne pas importer des colonnes exclues.

Figure 3.3
Étape 3 d’une
importation Excel.

L’étape suivante concerne la clé primaire de la table ; par défaut, Access propose d’ajouter
une colonne qui servira de clé primaire à incrémentation automatique. Dans le cas pré-
sent, la colonne « CODE » n’ayant pas de doublon peut très bien constituer une clé
primaire.
Il est possible ensuite de renommer l’onglet Excel par un nom de table non existant dans
la base importatrice : nommez la table « CODE_POSTAL ».
À ce stade, tous les paramètres de l’importation sont en place et il serait possible de cliquer
sur « Terminer » ; toutefois Access permet d’enregistrer ces paramètres pour reproduire
la même opération ultérieurement. Il suffira alors de cliquer dans le ruban du menu
« Données externes » sur l’icône Importations enregistrées pour exécuter le même type
d’importation de nouvelles fois.

1.3 L’IMPORTATEUR DE FICHIER TEXTE

Comme Excel, Access peut importer tous types de fichier texte :


• fichier à structure délimitée, dans lequel chaque champ est séparé par un caractère
particulier, le point-virgule, la virgule ou tout autre ;
• fichier à structure de longueur fixe, dans lequel chaque champ a une position et une
longueur de caractères prédéfinies.

Les différentes formes d’acquisition de données, importer et attacher 69


Access Livre Page 70 Mercredi, 27. f vrier 2008 7:28 07

Les fichiers texte délimité


Dans le ruban du menu « Données externes », cliquez sur l’icône Fichier texte ; le choix du
fichier « Codes_postaux_France_Séparateurs.txt », téléchargé depuis le site de l’éditeur, à
l’adresse www.pearsoneducation.fr, provoque l’ouverture de la fenêtre présentée à la
figure 3.4.

Figure 3.4
Étape 1 d’une
importation de
fichier texte
délimité.

Dans le pavé inférieur, la lecture du texte permet de bien identifier la nature du fichier et la
définition du séparateur, ici le point-virgule. L’étape qui suit validera le choix du séparateur et
la présence des en-têtes de colonnes.
Toutes les étapes suivantes sont identiques à celles qui ont été décrites dans la section 1.2
des importations depuis Excel.

Les fichiers texte de longueur fixe


Les procédures d’importation d’un fichier texte de longueur fixe ne varient pas des autres
à ceci près que le positionnement des champs sera déterminé par un tracé d’enregistrement
fourni par le concepteur du fichier source. La détermination des largeurs de champ est
réalisée grâce à l’utilisation d’une réglette visible lors de la deuxième étape.
Il est vivement recommandé d’utiliser le bouton « Avancé » de cette étape et de mémoriser
les paramètres d’importation. Cette phase étant délicate et longue à mettre en œuvre, il est

70 Access® 2007 et VBA


Access Livre Page 71 Mercredi, 27. f vrier 2008 7:28 07

plus prudent de l’intégrer à l’importation elle-même suivant la démarche montrée à la


figure 3.5.
3
Chapitre

Figure 3.5
Étape 2 d’une
importation de
fichier texte de
longueur fixe et
mémorisation des
paramètres.

(2) Les liaisons de données


Contrairement aux importations, qui intègrent définitivement les données dans la base
active et doivent être reproduites à chaque mise à jour du fichier source, les liaisons de
données permettent une mise à jour permanente du résultat affiché dans Access. En
revanche, sauf en cas de connexion ODBC (Open DataBase Connectivity) ou de liaison
avec une autre base de données, toute modification dans la base active des données source
est impossible : les données attachées à Access sont en lecture seule.
Les liaisons avec Excel, une autre table Access ou un fichier texte se mettent en place de la
même manière que pour une importation, à la différence près que l’option « Importer les
données » est remplacée par l’option « Lier à la source de données » en créant une « table
attachée ». Pour ce nouveau cas de figure, procédez aux opérations suivantes :
1. Dans le ruban du menu « Données Externes », cliquez sur l’icône Access.
2. Pointez le fichier « Codes_Postaux_France.accdb » et cochez l’option « Lier la source
de données ».

Les différentes formes d’acquisition de données, importer et attacher 71


Access Livre Page 72 Mercredi, 27. f vrier 2008 7:28 07

3. Access propose la liste des tables contenues dans la base ciblée, comme à la figure 3.6.

Figure 3.6
Choix des tables à
lier à la base active.

4. Cliquez sur le bouton « Sélectionner tout » puis sur « OK » : toutes les tables sont
attachées.
Il est fréquent de lier une base Access à une base Microsoft SQL Server (ou une autre base :
Oracle, DB2, MySQL, etc.) ; cette liaison nécessite une procédure particulière :
1. Dans le ruban du menu « Données externes », cliquez sur l’icône Plus dans le pavé
« Importer ».
2. Cliquez sur « Bases de données ODBC ».
3. Cliquez sur « Lier à la source de données » en créant une « table attachée » puis sur
« OK ».
4. Vous devez créer un fichier « .dsn » qui contiendra vos paramètres de connexion :
cliquez sur « nouveau ».
5. Sélectionnez le pilote correspondant à la base à laquelle vous voulez vous connecter
(Oracle, SQL Server).
6. Cliquez sur « Parcourir » pour préciser le chemin et le nom du fichier « .dsn » à créer.
7. Donnez un nom à votre fichier puis cliquez sur « Suivant » pour voir la grille-écran
que montre la figure 3.7.

Figure 3.7
Paramétrage de la
connexion ODBC.

72 Access® 2007 et VBA


Access Livre Page 73 Mercredi, 27. f vrier 2008 7:28 07

Contrairement aux liens avec Access, l’accès à la base de données via ODBC est condi-
tionné par la mise au point des moyens d’accès à cette base : le paramétrage représenté à la
figure 3.8 est donc primordial.
3
Chapitre

Figure 3.8
Paramétrage du
login à la base
de données.

Deux cas de figure peuvent se présenter :


• Soit des procédures de single sign-on ont été mises en place dans l’entreprise : celles-ci
permettent de coupler l’identification et l’authentification à la base de données avec
l’identification au niveau du login réseau Windows ; la connexion est immédiate si
l’utilisateur est déjà reconnu sur le réseau.
• Soit les paramètres de login/mot de passe sont spécifiques à la base ciblée. Dans ce cas,
l’administrateur de la base de données doit impérativement vous communiquer ces
coordonnées.
Suivant le type de base sur laquelle se fait la liaison, deux grilles-écran proposent éventuel-
lement de peaufiner la connexion ; il s’agit surtout des connexions avec SQL Server.
À l’issue de ces opérations, le serveur SQL (ou toute autre base) liste toutes les tables acces-
sibles, à l’image de celles présentées à la figure 3.9.

Figure 3.9
Tables, vues et
autres objets
disponibles sous
SQL Server.

Les différentes formes d’acquisition de données, importer et attacher 73


Access Livre Page 74 Mercredi, 27. f vrier 2008 7:28 07

La mise en place de ce type de liaison ouvre la porte à des développements conséquents


dans lesquels les tables, vues et autres objets sont stockés dans une grosse base de données
centrale gérant avec précision et sécurité les accès aux informations (contrairement à
Access).
Au total, les différents types de liens sont représentés à la figure 3.10, chacun avec son logo
particulier. Pendant que la simple table affiche le logo classique déjà étudié, chaque liaison
se signale par la présence d’une petite flèche et un dessin particulier.

Figure 3.10
Logos des liaisons.

Pour retrouver l’emplacement des fichiers source (sauf connexion ODBC), cliquez du
bouton droit sur la « table attachée » puis sélectionnez le « Gestionnaire de tables liées ».
Cette option permet également de mettre à jour les liaisons.

Résumé
Access dispose de tous les outils nécessaires pour importer des données de toute prove-
nance, fichiers Excel, tables d’un autre fichier Access, fichiers texte délimités ou fichiers
texte de largeur fixe. Les paramètres d’importation peuvent être mémorisés et permettre
ainsi la reproduction de ces importations.
Toutes les caractéristiques de l’importation sont applicables de la même manière pour
créer des attaches avec les mêmes objets sources. Contrairement aux importations, les
attaches offrent une mise à jour constante des données de destination dans Access.
Les bases Access se connectent via ODBC (Open Date Base Connectivity) à des bases de
données d’entreprise telles qu’Oracle, MS-SQL Server, MySQL ou autres.

74 Access® 2007 et VBA


Access Livre Page 75 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
3
Chapitre

Les exercices de ce chapitre visent à importer de diverses manières des données externes
pour mettre en place une base de données qui servira pour tous les travaux ultérieurs.
Après les importations effectuées dans les exercices ci-après, ceux des chapitres suivants
exploiteront les données chargées via de nombreuses requêtes.

EXERCICE 1 IMPORTER DES DONNÉES AU FORMAT EXCEL

• Énoncé 1. Téléchargez le fichier « ELEVE.xlsx » sur le site de l’éditeur, à l’adresse www.pearso-


neducation.fr, puis importez-le dans une nouvelle base nommée « ECOLE_INTER-
NATIONALE.accdb ».
2. Après importation, mettez au point tous les champs pour une utilisation optimale
des données.

* Solution 1. Importation du fichier


Le fichier « ELEVE.xlsx » est un fichier au format Excel 2007. Son importation nécessite la
création préalable de la future base de données.
1. Démarrez Access.
2. Cliquez sur le bouton « Base de données vide ».
3. En bas à droite, précisez le chemin de création de cette base en cliquant sur l’icône de
dossier Windows.
4. En bas à droite, nommez la nouvelle base « ECOLE_INTERNATIONALE.accdb ».
5. Cliquez sur le bouton « Créer ».
6. Pour plus de clarté, fermez la table qui a été créée automatiquement.
7. Dans le ruban du menu « Données externes », cliquez sur Excel.
8. Dans la fenêtre qui s’est ouverte, pointez le fichier « ELEVE.xlsx ».
9. Vérifiez que le bouton, en dessous, concerne bien une importation et non une attache
puis validez par « OK ».
10. Cliquez sur « Suivant » à la première étape d’importation (il n’y a qu’une seule feuille
dans le fichier Excel, nommée elle aussi « ELEVE »).
11. À la deuxième étape, cochez la case « Première ligne contient les en-têtes de colonne »,
puis « Suivant ».
12. Lorsque tous les paramètres de la troisième étape sont corrects (vérifiez-les colonne
par colonne !), cliquez sur « Suivant ».
Exercices

13. À la quatrième étape, cochez l’option « Choisir ma propre clé primaire » et laissez la
colonne « ID_ELEVE » proposée ; cliquez sur « Suivant ».
14. À la cinquième étape, laissez le nom « ELEVE » pour la future table, ne cochez pas
l’option « Je souhaite que l’assistant… » (nous ferons nous-mêmes l’analyse pro-
posée).

Les différentes formes d’acquisition de données, importer et attacher 75


Access Livre Page 76 Mercredi, 27. f vrier 2008 7:28 07

15. Ne cochez pas l’option de mémorisation de cette importation (elle ne se reproduira


pas).

2. Paramétrage de la table
La table est importée. Analysons ses caractéristiques :
1. Cliquez du bouton droit sur la table « ELEVE » et sélectionnez « Mode création ».
2. Le champ « ID_ELEVE » a été créé de type Numérique avec une taille Réel Double :
cette présentation peut être gênante par la suite pour les relations entre les tables. Posi-
tionnez la taille de ce champ à « Entier Long » (on remarquera qu’il n’est plus possible
de modifier le type et de le faire passer en « NuméroAuto »).
3. Mettez une légende correcte et compréhensible au champ « ID_ELEVE » comme « N˚
de l’élève » par exemple.
4. La propriété « Null Interdit » du champ « ID_ELEVE » est positionnée à « Non », ce
qui paraît étonnant puisque la colonne est une colonne primaire. Vous pouvez modifier
cette propriété en « Oui », mais il n’y aura pas d’incidence sur la table.
5. Cliquez immédiatement sur la petite disquette d’enregistrement dans la barre supé-
rieure de l’écran, Access avertit que certaines données peuvent être perdues. Cela pro-
vient du fait que la colonne « ID_ELEVE » est passée de Réel Double à Entier Long ;
aucune donnée ne sera altérée puisque le plus grand ID porte le n˚ 26 : cliquez sur
« Oui ».
6. Le champ « NOM_ELEVE » est positionné à 255 caractères (valeur par défaut),
réduisez-le à 50.
7. Le champ « NOM_ELEVE » n’a pas de légende : indiquez simplement « Nom ».
8. Le champ « NOM_ELEVE » n’est pas obligatoire : modifiez cette option en mettant la
propriété « Null interdit » à « Oui » et la propriété « Chaîne vide autorisée » à « Non ».
9. Les champs « PRENOM_ELEVE » et « ADRESSE1_ELEVE » seront modifiés de la
même manière que le nom.
10. Le champ « ADRESSE2 » peut être vide (« Null interdit » à « Oui »).
11. Le code postal est réduit à 5 caractères, obligatoire.
12. La ville est réduite à 50 caractères, obligatoire.
13. Le pays est réduit à 5 caractères, obligatoire.
14. Le numéro de téléphone est réduit à 10 caractères (effectivement en type Texte), obli-
gatoire.
15. Le format Date/heure du champ « DATENAISSANCE_ELEVE » est correct, mais doit
devenir obligatoire.
16. Le champ « SEXE_ELEVE » peut être réduit à un caractère et doté d’une liste de
choix : cliquez sur l’onglet correspondant. Choisissez « Zone de liste déroulante »
pour la zone « Afficher le contrôle », « Liste valeurs » pour la zone « Origine source »,
« M;Masculin;F;Féminin » pour la zone « Contenu », la valeur « 2 » pour la zone
« Nombre de colonnes », « 1;3 » pour la zone « Largeur des colonnes ».
17. Fermez et validez les messages d’avertissement.

76 Access® 2007 et VBA


Access Livre Page 77 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 2 IMPORTER DES DONNÉES AU FORMAT CSV


3
Chapitre

• Énoncé 1. Téléchargez le fichier « NOTE.csv » et importez-le dans la base « ECOLE_INTER-


NATIONALE.accdb ».
2. Après importation, mettez au point tous les champs pour une utilisation optimale
des données.

* Solution 1. Importation
Le fichier « NOTE.csv » est un fichier texte, et plus précisément un fichier délimité à
séparateur point-virgule (csv étant l’abréviation de Coma Separated Values). Il est pos-
sible d’ouvrir directement ce fichier avec Excel, mais pour bien en comprendre la
structure, il est préférable de l’ouvrir avec un simple éditeur de texte :
1. Cliquez sur le bouton « Office » en bas d’écran.
2. Cliquez sur « Tous les programmes > Accessoires > Bloc-Notes » : la fenêtre de l’éditeur
NotePad s’ouvre.
3. Cliquez sur « Fichier > Ouvrir ».
4. Dans la fenêtre d’ouverture de fichier, cliquez sur le type « Tous les fichiers » et pointez
le fichier « NOTE.csv » récupéré.
Ce fichier apparaît tel qu’à la figure 3.11.

Figure 3.11
Fichier CSV lu
sous NotePad.

Exercices

Les différentes formes d’acquisition de données, importer et attacher 77


Access Livre Page 78 Mercredi, 27. f vrier 2008 7:28 07

Chaque ligne comprend 4 champs séparés chacun par des points-virgules :


• Le premier champ est le numéro (l’ID) de l’élève.
• Le deuxième champ est le numéro de la matière enseignée.
• Le troisième champ est la note de l’élève.
• Le dernier champ est la date d’attribution de la note.
Fermez le fichier pour pouvoir l’importer :
1. Ouvrez à nouveau, si nécessaire, la base de données « ECOLE_INTERNATIO-
NALE.accdb ».
2. Dans le menu « Données externes », cliquez sur « Fichier texte ».
3. Dans la fenêtre d’importation, pointez le fichier « NOTE.csv » et cliquez sur
« Ouvrir ».
4. Optez pour une importation et non pas une attache ou l’ajout à une table existante.
5. La première étape de l’importation détecte à juste titre un fichier délimité, cliquez sur
« Suivant ».
6. La deuxième étape détecte à juste titre le point-virgule comme séparateur.
7. La troisième étape ne reconnaît pas de noms de champ puisque, par définition, il n’en
existe pas :
Le champ1 doit être renommé « ID_ELEVE », le type de données et l’index sont
corrects.
Cliquez dans le corps des données présentées et dans la deuxième colonne : le
champ2 doit être renommé « ID_MATIERE », le type de données et l’index sont
corrects.
Le champ3 doit être renommé « NOTATION », le type de données doit être modifié
en réel simple (les notes ne sont pas toujours des valeurs entières, même si, ici, il
n’existe que des notes arrondies à l’unité).
Le champ4 doit être renommé « DATE_NOTE », le type de données Date/heure est
correct.
8. Cliquez sur « Suivant ».
9. Dans l’étape suivante, laissez Access ajouter une clé primaire, puis cliquez sur
« Suivant ».
10. À la dernière étape, nommez la table « NOTE » (valeur reprise par défaut).
11. N’enregistrez pas les étapes d’importation.
La table importée doit avoir l’apparence de la figure 3.12.

78 Access® 2007 et VBA


Access Livre Page 79 Mercredi, 27. f vrier 2008 7:28 07

Figure 3.12
Table NOTE
3
Chapitre

immédiatement
après importation.

2. Révision des caractéristiques de la table


• La clé primaire insérée par Access porte le nom « ID » par défaut : renommez-la « ID_
NOTE ».
• Déclarez tous les champs en « Null interdit ».
• Insérez des légendes à tous les champs.
• Au moment de la fermeture de la table en mode modification, Access avertit que les
règles d’intégrité ont été modifiées (les champs ont été déclarés en Null interdit). Il pro-
pose de tester les données existantes avec les nouvelles règles : répondez par « Oui »,
puisque les nouvelles règles sont conformes.

EXERCICE 3 IMPORTER DES DONNÉES D’UNE AUTRE BASE ACCESS

• Énoncé Téléchargez le fichier « MATIERE.accdb » et importez la table de cette base nommée


« MATIERE » dans la base « ECOLE_INTERNATIONALE.accdb ».
Après importation, mettez au point tous les champs pour une utilisation optimale des
données.
Exercices

* Solution La base « ECOLE_INTERNATIONALE » étant ouverte, procédez de la manière suivante :


1. Dans le menu « Données externes », cliquez sur le bouton « Access » du ruban.
2. Dans la fenêtre d’importation, pointez le fichier « MATIERE.accdb » puis « Suivant ».

Les différentes formes d’acquisition de données, importer et attacher 79


Access Livre Page 80 Mercredi, 27. f vrier 2008 7:28 07

3. Sélectionnez la table « MATIERE » (la seule), de la base et cliquez « OK ».


4. Ne mémorisez pas les paramètres.
Vous devez vérifier tous les paramètres, mais les caractéristiques de la table sont conformes
aux normes qui ont été exposées auparavant.

EXERCICE 4 ÉTABLIR LES CONTRAINTES RÉFÉRENTIELLES

• Énoncé À partir des trois tables qui ont été intégrées à la base « ECOLE_INTERNATIONALE »,
mettez en place toutes les contraintes d’intégrité référentielles possibles. Sachant que
trois matières (ANGLAIS, ALLEMAND, ITALIEN) doivent être considérées comme un
ensemble nommé LANGUES VIVANTES, mettez en place la solution relationnelle.

* Solution La première partie du problème met en application les principes étudiés au chapitre 2.
1. Dans le ruban du menu « Outils de base de données », cliquez sur le bouton
« Relations ».
2. Ajoutez les trois tables en présence.
3. Liez, avec intégrité référentielle, les clés primaires avec leur clé étrangère de sorte
d’obtenir le modèle relationnel de la figure 3.13.

Figure 3.13
Premier modèle
relationnel de la
base ECOLE_
INTERNATIONALE.

Le regroupement des différentes langues en une seule matière « Langues Vivantes » oblige
à la création d’une table « GROUPE » destinée à lister tous les groupes de matières : d’une
part, les matières non regroupées et, d’autre part, les langues vivantes.
En généralisant, on peut imaginer que chaque matière peut être « dégroupée » en plu-
sieurs ; par exemple, l’histoire-géographie pourrait être scindée en histoire, d’une part, et
géographie, d’autre part. Il faut donc créer une table « GROUPE », mais aussi une table
« REGROUPEMENT » pour mettre en place une sorte de tableau d’équivalence.
1. Vous devez créer une nouvelle table nommée « GROUPE », pour cela :
2. Dans le ruban du menu « Créer », cliquez sur « Table ».

80 Access® 2007 et VBA


Access Livre Page 81 Mercredi, 27. f vrier 2008 7:28 07

3. Cliquez immédiatement sur le bouton du « Mode modification » : Access demande le


nom de la nouvelle table « GROUPE ».
3
Chapitre

4. La clé primaire sera nommée « ID_GROUPE ».


5. Créez un champ « NOM_GROUPE », type Texte, 50 caractères, obligatoire, non
indexé.
Opérez de même avec la table « REGROUPEMENT », dotée des champs suivants :
• ID_REGROUPEMENT, clé primaire, NuméroAuto, Indexé sans doublon.
• ID GROUPE (clé étrangère), Numérique, Entier long, obligatoire, non indexé.
• ID_MATIERE (clé étrangère), Numérique, Entier long, obligatoire, non indexé.
Établissez les relations avec ces nouvelles tables :
1. Ouvrez à nouveau, le cas échéant, la fenêtre des relations.
2. Cliquez sur le bouton du ruban « Afficher la table ».
3. Ajoutez les tables « GROUPE » et « REGROUPEMENT ».
4. Établissez les contraintes référentielles de sorte d’obtenir le modèle relationnel de la
figure 3.14.

Figure 3.14
Second modèle
relationnel de la
base ECOLE_
INTERNATIONALE.

Il reste à remplir les tables « GROUPE » et « REGROUPEMENT » pour obtenir les résultats
de la figure 3.15.
Conservez ces travaux, qui resserviront dans les chapitres suivants.
Exercices

Les différentes formes d’acquisition de données, importer et attacher 81


Access Livre Page 82 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 83 Mercredi, 27. f vrier 2008 7:28 07

Les requêtes
4
Chapitre

1. Les requêtes Sélection .............. 84


C’est par excès de langage qu’Access nomme
2. Les requêtes Insertion, « Requête » l’outil qui permet de rédiger et stocker
Suppression et Mise à jour ....... 95
3. Les requêtes création.............. 100
une requête SQL. Une requête est une interrogation
Problèmes et exercices d’une ou plusieurs tables ; l’interrogation utilise un
1. Affichage par ordre alphabétique .. 103 langage générique nommé SQL pour Structured
2. Affichage sur critère de prénom ..... 104
3. Affichage sur critère excluant un pays 104 Query Language (langage de requête structurée).
4. Affichage sur critères multiples ....... 105 Outre la lecture des données suivant une grande
5. Affichage sur critère de date .......... 105
6. Affichage sur critères de date variété de tris et de filtres (c’est la commande
et de pays ..........................................
7. Affichage avec valeurs distinctes .... 107
SELECT de SQL), les requêtes permettent l’écriture
8. Affichage des premiers éléments .... 107 de données par ajout, modification ou suppression
9. Affichage avec regroupement
par pays et comptage.................... 108 (ce sont les commandes INSERT, UPDATE ou DELETE
10. Affichage avec jointure.................. 108 de SQL).
11. Affichage avec jointure
et regroupement............................ 109 Les premiers exemples de ce chapitre concernent la
12. Appel de requêtes multiples ........... 110
table « CODE_POSTAL » contenue dans la base
13. Affichage de la moyenne générale . 111
14. Affichage de la moyenne « CODES_POSTAUX.accdb », téléchargeable sur le
par matière......................................... 112
15. Tableau croisé dynamique ............. 113
site de l’éditeur, à l’adresse www.pearsonedu-
16. Tableau croisé avec regroupement . 114 cation.fr. Par la suite, la table « ADRESSE », dans le
17. Regroupement et coefficient ........... 115
18. Requête Ajout ............................... 118
même fichier Access, sera utilisée.
19. Requête Suppression ..................... 120
20. Requête Mise à jour ...................... 121

83
Access Livre Page 84 Mercredi, 27. f vrier 2008 7:28 07

(1) Les requêtes Sélection


Cette section présente l’assistant de requêtes d’Access et les requêtes de sélection à partir
du fichier des codes postaux.
1. Ouvrez le fichier « CODES_POSTAUX.accdb ».
2. Dans la barre de menu « Créer », cliquez sur l’icône Création de requête, sur la droite
du ruban. Access ouvre une fenêtre dans laquelle apparaissent toutes les tables présentes ;
un autre onglet propose aussi d’afficher les requêtes (il est possible, voire indispen-
sable parfois, de faire une requête sur une requête).
3. Cliquez sur la table « CODE_POSTAL » puis sur « Ajouter » (un double-clic aboutit
au même résultat).
4. Fermez cette fenêtre d’appel des sources.
L’écran, présenté à la figure 4.1, se divise en deux parties :
1. Une partie supérieure qui montre la ou les tables et requêtes appelées
Une partie inférieure présentant un tableau, pour le moment vide, où l’on paramétrera :
• Les champs que l’on veut voir retournés dans la feuille des résultats ;
• Le ou les ordres de tris attendus ;
• Le ou les filtres sur les données.

Figure 4.1
Fenêtre de
l’assistant requêtes
d’Access.

1. Faites un double-clic sur l’étoile se trouvant au-dessus de la clé primaire « CODE ».


2. Dans le pavé inférieur, première colonne, la zone « Champ » contient le libellé
« CODE_POSTAL.* » signifiant « Tous les champs de la table CODE_POSTAL » ; la
zone « Table » contient elle aussi le même nom de table.
3. Dans le ruban, cliquez sur Affichage (l’icône apparaît sous forme d’une grille, ce qui
signifie affichage sous forme de feuille de données).
4. La nouvelle fenêtre fait apparaître les données dans un état exactement similaire à
celui de la table d’origine.
5. Dans le ruban, cliquez sur le petit triangle situé dans l’icône Affichage puis sur « Mode
SQL ».
6. Une feuille blanche présente la requête SQL, écrite dans le langage original SQL.

84 Access® 2007 et VBA


Access Livre Page 85 Mercredi, 27. f vrier 2008 7:28 07

La syntaxe complète est SELECT CODE_POSTAL.* FROM CODE_POSTAL; qui signifie littéra-
lement : sélectionnez tous les champs dans la table CODE_POSTAL. On notera que la
requête se termine obligatoirement par un point-virgule qui, dans le langage SQL, signale
4
Chapitre

la fin d’instruction.
L’assistant requêtes permet donc de présenter une requête sous au moins trois formes :
• un mode création destiné à rédiger la requête avec un outil graphique ;
• un mode feuille de données présentant les résultats ;
• un mode SQL permettant de rédiger directement ou de voir simplement la requête sous
la forme du langage SQL ; ce dernier mode nous servira ultérieurement pour copier/
coller du code SQL et l’introduire dans du code Visual Basic.
L’accès à ces trois modes est obtenu grâce à la flèche située au-dessous de l’icône Affichage
du ruban. On y accède également grâce aux petites icônes situées en bas à droite de la
fenêtre.
1. Revenez en mode création (flèche sous Affichage et « Mode création », ou bouton
« Mode création » en bas de la fenêtre).
2. Placez la souris au-dessus de la première colonne, de sorte que le pointeur apparaisse
comme une flèche noire vers le bas.
3. Appuyez sur la touche « Sup. » : la colonne est supprimée. L’assistant est prêt pour une
nouvelle requête.
4. Dans la partie supérieure présentant les tables, cliquez sur le mot « CODE » de la table
« CODE_POSTAL » et, sans relâcher la souris, faites glisser cette zone dans la ligne
Champ de la première colonne située dans la partie inférieure de la fenêtre. Le même
résultat est obtenu en double-cliquant sur le mot « CODE » de la table.
5. Faites de même avec le mot « VILLE » en le faisant glisser vers la zone Champ de la
deuxième colonne, ou bien en double-cliquant dessus.
6. Le code SQL associé (obtenu via la flèche sous l’icône Affichage du ruban, ou la petite
icône en bas droite) est SELECT CODE_POSTAL.CODE, CODE_POSTAL.VILLE FROM
CODE_POSTAL; qui pourrait être simplifié dans le cas présent en SELECT CODE, VILLE
FROM CODE_POSTAL;.
7. Le résultat est obtenu en passant en mode feuille de données (via la flèche sous Affichage
ou la première petite icône en bas de la fenêtre). Il est exactement similaire au précédent,
à la différence près que les champs ont été appelés séparément.
L’affichage en mode feuille de données permet, comme pour les tables, de présenter provi-
soirement les données de différentes manières. En cliquant sur la zone de liste déroulante,
accessible par le triangle pointé en bas, situé à droite du nom de colonne, il est possible
d’effectuer des tris et des filtres. Ces opérations sont totalement « accompagnées » par des
choix d’option adaptés au type de colonne (texte, numérique ou date). On peut, par
exemple, ne montrer que les villes commençant par PARIS, ou les codes postaux finissant
par 000 (préfectures). Ces assistants ne mémorisent pas la présentation obtenue. Il ne
s’agit ici que d’une modification temporaire de l’affichage, qui n’affecte en rien la requête
initiale. Les explications qui suivent montrent comment réaliser des tris et des filtres de
plus en plus élaborés, et comment enregistrer les requêtes ainsi obtenues.

Les requêtes 85
Access Livre Page 86 Mercredi, 27. f vrier 2008 7:28 07

1.1 LES TRIS

Le fichier livré est déjà trié par ordre de code postal, nous voulons à présent le trier par
ville.
1. Repassez en « Mode création » sur la requête précédente afin de pouvoir la modifier
(soit par la flèche sous Affichage du ruban, soit par les icônes en bas de la fenêtre).
Cliquez sur la ligne « Tri » de la colonne VILLE, puis ouvrez la zone de liste déroulante
qui apparaît sur la droite de cette zone.
2. Sélectionnez « Croissant ».
3. Repassez en « Mode feuille de données » pour visualiser le résultat (petite icône en bas
de la fenêtre).
La requête renvoie tous les enregistrements triés par ville. Si l’on consulte la liste à la lettre
P comme Paris, on constate que les codes postaux pour tous les items de la capitale sont à
présent désordonnés La deuxième requête visera donc à trier le fichier par VILLE puis par
CODE.
1. Repassez en « Mode création » pour effectuer une nouvelle modification de la requête.
Placez la souris au-dessus de la colonne VILLE pour faire apparaître la flèche noire
pointée vers le bas.
2. Cliquez sur la colonne « VILLE ».
3. En gardant le clic enfoncé, déplacez la colonne vers la gauche pour l’amener à gauche
de la colonne CODE puis relâchez
4. Sur la ligne Tri, dans la colonne CODE, sélectionnez aussi le « tri croissant ».
5. Affichez les données en sélectionnant le « Mode feuille de données ».
Le tri est désormais correct et s’applique aux villes puis, à l’intérieur d’une même ville, par
code postal. L’assistant requête se lit de gauche à droite et les tris s’effectuent successi-
vement de gauche à droite. En supposant que la liste attendue doive présenter malgré tout
les codes avant les villes, le procédé suivant devra être utilisé :
1. Repassez en « Mode création ». Cliquez sur le champ « VILLE » (pour placer le curseur à
cette colonne).
2. Dans le ruban, cliquez sur « Insérer des colonnes ». Une nouvelle colonne vient se
mettre à gauche.
3. Glissez de nouveau le champ « CODE » dans cette nouvelle colonne, n’y ajoutez pas de
notion de tri.
4. Décochez la zone « Afficher » de la colonne CODE de droite pour obtenir la structure
de la figure 4.2.

Figure 4.2
Requête de tris
successifs avec
réordonnancement
des colonnes.

86 Access® 2007 et VBA


Access Livre Page 87 Mercredi, 27. f vrier 2008 7:28 07

L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL ORDER BY
VILLE, CODE; où la clause ORDER BY de tri se réalise dans l’ordre précisé. CODE et
VILLE peuvent être éventuellement précédés par le nom de leur table d’appartenance
4
Chapitre

CODE_POSTAL avec un point séparateur (par exemple CODE_POSTAL.CODE) si la base de


données possède d’autres tables.

1.2 LES FILTRES

Cette section aborde les requêtes de filtrage. Il est préférable d’annuler les consignes de tri
précédentes, situées dans les colonnes VILLE et CODE en remplaçant « croissant » par
« non trié » grâce à la liste déroulante de la zone tri. Nous désirons maintenant ne consulter
que les items concernant Paris :
1.Dans la zone Critères de la colonne VILLE, saisissez le mot « PARIS » et validez.
2.Des guillemets se positionnent automatiquement pour cerner ce mot.
3.Affichez en « Mode feuille de données ».
4.La requête renvoie 29 enregistrements qui contiennent tous et exactement le seul mot
PARIS.
Cherchons à présent à afficher tous les enregistrements commençant par le mot Paris :
1. Repassez en « Mode création ». Dans la zone critère, remplacez le libellé actuel par
« Comme "PARIS*" ».
2. La requête renvoie cette fois 152 enregistrements dont le libellé de ville commence par
Paris.
L’équivalent SQL de cette requête est SELECT CODE, VILLE FROM CODE_POSTAL WHERE
VILLE LIKE "PARIS*"; 1.
L’astérisque qui suit le mot Paris fonctionne comme un « joker » qui sélectionne toutes les
occurrences possibles après le mot Paris. Le positionnement de l’astérisque en début de
chaîne de caractères renverrait toutes les villes dont le libellé se termine par Paris (30 enre-
gistrements et non 29 car il existe une ville nommée DAMPARIS). Un autre type de joker,
le point d’interrogation, désigne un et un seul caractère qui peut prendre toutes les valeurs
possibles ; ainsi la requête SELECT CODE, VILLE FROM CODE_POSTAL WHERE VILLE LIKE
"P???S*"; renvoie 30 enregistrements car, outre la ville de Paris, la ville de Poses com-
mence par un P et finit aussi par un S tout en comptant 5 caractères.
Nous cherchons maintenant à afficher les enregistrements relatifs à Paris OU à Bordeaux.
On portera une attention particulière à la terminologie : en utilisant le mot « OU », exact,
nous désirons voir tous les codes postaux parisiens et tous les codes postaux bordelais
(addition des deux natures d’items).
1. Repassez en « Mode création ». Dans la première ligne des critères, colonne VILLE,
insérez le mot « PARIS ».
2. Dans la deuxième ligne des critères, même colonne, insérez le mot « BORDEAUX ».
3. La requête renvoie 34 enregistrements.

1. L’approche volontaire et directe du code SQL réalisée ici ne doit pas être appliquée à la lettre à toutes les bases de données. Des différences
syntaxiques importantes sont à déplorer ; sous Oracle, la même requête se terminerait par WHERE VILLE LIKE ‘PARIS%’;

Les requêtes 87
Access Livre Page 88 Mercredi, 27. f vrier 2008 7:28 07

D’une manière différente, on peut également choisir la clause « ET » (AND en anglais).


Si l’on désire voir toutes les préfectures (les villes dont le code postal finit par 000) et
commençant par le mot « ST », on procédera de la manière suivante :
1. Repassez en « Mode création ». Dans la première ligne des critères, colonne CODE,
insérez « Comme "*000" ».
2. Dans la première ligne des critères, colonne VILLE, insérez « Comme "ST*" ».
3. La requête renvoie 4 enregistrements : St-Brieuc, St-Étienne, St-Lo, Strasbourg.
Dans ce nouveau cas de figure, et pour cumuler les conditions, les critères sont disposés
sur la même ligne.
On peut exclure des enregistrements par l’instruction « Pas » (NOT en anglais).
1. En « Mode création », tous les critères antérieurs étant effacés, insérez le libellé « Pas
PARIS » dans le premier critère de la colonne VILLE.
2. Le résultat renvoie tous les enregistrements sauf ceux dont la ville comporte le mot
PARIS (7 980 lignes).
La commande SQL originale utilise la clause NOT : SELECT CODE FROM CODE_POSTAL
WHERE ((Not (VILLE)="PARIS"));
Outre le simple rapprochement de caractères, l’assistant requête peut faire jouer de
nombreux autres opérateurs :
1. En « Mode création », effacez les critères de filtre précédents.
2. Dans la zone Critères de la colonne CODE, insérez le libellé « >=75000 ».
3. La requête renvoie 1 818 enregistrements et plus précisément tous les codes postaux
supérieurs ou égaux à 75000. On notera que l’opération fonctionne alors même que la
colonne est déclarée comme de type texte : Access effectue une conversion implicite
des données pour interpréter la requête.
La requête appelant tous les enregistrements relatifs à la ville de Paris sur la base du code
postal s’écrira comme l’indique la figure 4.3 (101 enregistrements renvoyés).

Figure 4.3
Requête cumulant
des critères à
opérateur
arithmétique.

L’équivalent SQL de cette requête s’écrit SELECT CODE, VILLE FROM CODE_POSTAL WHERE
CODE>="75000" AND CODE<"76000"; .

1.3 LES REQUÊTES À VALEURS DISTINCTES

Reprenons la requête ne renvoyant que les enregistrements dont la ville est PARIS (le
libellé "PARIS" dans la zone Critère de la colonne VILLE) : nous rappelons qu’elle renvoie
29 lignes.
Il est possible de ne vouloir afficher que les valeurs distinctes dans les critères demandés :
1. Supprimez la colonne relative au CODE pour ne plus avoir que la colonne VILLE.

88 Access® 2007 et VBA


Access Livre Page 89 Mercredi, 27. f vrier 2008 7:28 07

2. Posez le critère « PARIS » (la requête doit renvoyer à ce moment 29 lignes).


3. En « Mode création », dans le ruban, cliquez sur « Feuille des propriétés de la
4
Chapitre

requête » (ou bien cliquez du bouton droit et sélectionnez « Propriétés »).


4. À la ligne Valeurs distinctes, mettez la propriété « Oui ».
5. La requête ne renvoie plus qu’un seul enregistrement car toutes les valeurs de la
colonne VILLE sont identiques. Il s’agit du mot PARIS.
Cette requête s’écrit simplement SELECT DISTINCT VILLE FROM CODE_POSTAL WHERE
VILLE="PARIS";

Attention
La clause DISTINCT s’applique à toutes les colonnes de la requête ; si vous remettez la colonne
CODE dans la requête, celle-ci renverra alors et de nouveau 29 enregistrements.

1.4 LES REQUÊTES PARAMÉTRÉES

Une requête peut intégrer un ou plusieurs paramètres qui seront fournis par l’utilisateur
lors de son lancement.
1. Le cas échéant, supprimez tous les critères ou propriétés antérieurs (la propriété
« DISTINCT » en particulier) et ajoutez éventuellement une colonne CODE en double-
cliquant sur le champ « CODE » de la table.
2. Dans la zone Critère de la colonne VILLE, entrez le libellé suivant, cerné par des
crochets : « [Indiquez une ville pour en connaître le code postal] ».
3. Passez en « Mode feuille de données » : à ce moment, une boîte de dialogue s’ouvre
contenant la question que vous avez paramétrée.
4. Saisissez une ville de votre choix, la requête renverra le ou les enregistrements corres-
pondants à la ville saisie.

1.5 LES ALIAS ET LES FONCTIONS

Pour éviter de présenter le nom du champ d’où sont extraites les données, souvent peu
compréhensibles, une requête peut renvoyer un en-tête de colonne différent qu’on nom-
mera alias. Cet artifice n’est pas seulement utile au plan « esthétique », il pourra servir
dans la requête SQL ultérieurement ou dans une autre requête en cascade.
Dans la zone champ et la colonne où est indiquée la ville, saisissez le libellé suivant :
« Bureau distributeur : VILLE ».
La partie à gauche des deux points (:) constitue l’alias du champ VILLE présenté à droite
des deux-points ; on notera que l’alias peut comporter des espaces alors que si le nom de
champ avait des espaces, il serait nécessaire de cerner l’expression par des crochets.
La traduction SQL de cette requête s’écrira SELECT VILLE AS [Bureau distributeur],
CODE FROM CODE_POSTAL; où le mot AS désigne l’alias.

Les requêtes 89
Access Livre Page 90 Mercredi, 27. f vrier 2008 7:28 07

Les alias deviennent indispensables lorsque des fonctions sont utilisées. Nous allons
créer une requête dans laquelle apparaîtra une colonne supplémentaire indiquant le
département.
1. Au préalable, supprimez les différents critères précédents et remettez la propriété
Valeurs distinctes à « Non » dans la feuille de propriétés de la requête en mode
création.
2. Dans la première colonne, zone Champ, insérez la formule « Département : Gauche
(CODE ;2) ».
3. Dans les colonnes plus à droite, remettez en place les deux autres champs, CODE et
VILLE.
4. Visualisez la requête en mode feuille de données.
La fonction « GAUCHE() », ici, a été utilisée ; elle extrait les caractères de gauche d’une
chaîne de caractères ; le nombre de caractères à extraire doit être indiqué dans la fonction
après un séparateur point-virgule. L’équivalent SQL donne SELECT Left([CODE],2) AS
Département, CODE, VILLE FROM CODE_POSTAL; le mot-clé LEFT est le même en SQL et
en Visual Basic ; comme presque tous les autres mots-clés, il est francisé pour l’utilisation
d’Access en version française.
Access dispose d’un générateur d’expression qui aide à la mise au point de formules
élaborées :
1. Cliquez dans le Champ d’une colonne vide en mode création.
2. Saisissez « Formule : » (le mot formule suivi de deux points).
3. Cliquez dans le ruban sur l’icône Générateur.
4. Dans le pavé de gauche, développez l’item « Fonctions », puis « Fonctions intégrées ».
5. Vous lisez dans le pavé de droite toutes les fonctions disponibles dans Access comme le
montre la figure 4.4.

Figure 4.4
Générateur
d’expression
d’Access.

On prendra garde au fait que les mots-clés à utiliser sont parfois identiques à ceux d’Excel,
comme la fonction GAUCHE() par exemple. Ils sont quelquefois différents, comme dans
les deux exemples suivants :
• la fonction SI() sous Excel se nomme VRAIFAUX() sous Access ;

90 Access® 2007 et VBA


Access Livre Page 91 Mercredi, 27. f vrier 2008 7:28 07

• la fonction STXT() sous Excel (extraction de caractères dans une chaîne) se nomme
EXTRACCHAÎNE() sous Access.
4
Chapitre

Toutes les fonctions utilisables ici sont dites scalaires : elles s’appliquent sur tous les enre-
gistrements à afficher dans le résultat de la requête, contrairement aux fonctions agrégats
qui s’appliquent sur des ensembles d’enregistrements et qui sont étudiées ci-après.

1.6 LE REGROUPEMENT DE DONNÉES

Dès qu’il est nécessaire de regrouper des données, soit pour présenter des synthèses, soit
pour effectuer des calculs, l’affichage de la requête en mode création doit comporter des
critères de regroupement :
1. Dans le ruban, cliquez sur l’icône Totaux ∑.
2. Une ligne supplémentaire apparaît dans le pavé inférieur nommée Opération.
3. Toutes les opérations sont considérées par défaut comme Regroupement à l’image de la
figure 4.5.

Figure 4.5
Requête de
regroupement
de données.

Rédigée comme le présente la figure 4.5, la requête de regroupement renverra le même


nombre d’enregistrements qu’une requête simple : tous les enregistrements sont distincts
et ne peuvent pas être regroupés puisque les codes postaux sont tous différents.
1. Supprimez la colonne CODE et visualisez de nouveau le résultat. La requête ne ren-
voie plus que 7 766 enregistrements (au lieu de 8 004) : toutes les lignes contenant le
même mot PARIS, par exemple, ont été regroupées pour ne plus décompter les
doublons.
2. Supprimez la colonne VILLE, le résultat renvoie les 97 départements français (Outre-Mer
compris).
L’équivalent SQL de cette requête sera SELECT Left([CODE],2) AS Département FROM
CODE_POSTAL GROUP BY Left([CODE],2); où la clause GROUP BY commande le regrou-
pement.
Le nombre de bureaux distributeurs par département sera obtenu de la manière suivante :
1. Dans la première colonne, renseignez la zone Champ par « Département: Gauche
([CODE] ;2) ».
2. Choisissez l’opération « Regroupement ».
3. Dans la deuxième colonne, insérez le champ « CODE ».
4. Choisissez l’opération « Compte ».
Le résultat montre que le département de l’Ain compte 90 bureaux distributeurs, l’Aisne
78, etc.

Les requêtes 91
Access Livre Page 92 Mercredi, 27. f vrier 2008 7:28 07

Si seuls les bureaux distributeurs du département de l’Ain doivent être décomptés, il suf-
fira d’ajouter le critère "01" dans la colonne Département. La condition « = "01" » ne porte
pas sur chaque item mais sur le regroupement, comme le montre plus explicitement la
traduction SQL SELECT Left([CODE],2) AS Département, Count(CODE_POSTAL.CODE)
FROM CODE_POSTAL GROUP BY Left([CODE],2) HAVING (((Left([CODE],2))="01"));
où la clause HAVING est insérée après le GROUP BY.
Pour faire intervenir une condition sur chaque enregistrement, il faut utiliser l’opération
« Où » (équivalent à l’instruction WHERE dans la syntaxe SQL) dans une colonne nou-
velle, et non plus sur le regroupement. Supposons, par exemple, que le résultat attendu
compte tous les bureaux distributeurs de la ville de Paris, il faudra composer la requête à
l’image de la figure 4.6.

Figure 4.6
Requête de
regroupement de
données avec filtre
scalaire.

Cette fois, l’interprétation SQL de la requête devient SELECT Left([CODE],2) AS Dépar-


tement, Count(CODE) FROM CODE_POSTAL WHERE VILLE="PARIS" GROUP BY
Left([CODE],2); où la condition WHERE est appliquée avant d’opérer le regroupement
GROUP BY.

1.7 LES REQUÊTES SUCCESSIVES

Dans le paragraphe précédent, il a été possible de lister les 97 départements par une opé-
ration de regroupement ; en revanche, il n’est pas possible d’obtenir directement le
décompte 97 (en une seule ligne) car il est nécessaire de faire deux opérations successives :
• le regroupement (GROUP BY) ;
• puis le compte (COUNT).
La solution la plus aisée consiste à faire une première requête, puis à en créer une seconde
avec les résultats de la première 1. Procédez de la manière suivante :
1. En mode création, réduisez la première requête à la définition du Département (pas
d’autre colonne).
2. Sélectionnez l’opération de regroupement.
3. Vérifiez le résultat ( renvoi de 97 enregistrements en liste) et enregistrez la requête
sous le nom « Req_Regroupement » 2.
4. Créez une nouvelle requête qui appelle la requête Req_Regroupement. Pour cela,
sélectionnez « Créer » et « Création de requête » dans le ruban, puis dans la fenêtre
« Afficher la table », en sélectionnant l’onglet « Requêtes » et « Req_Regroupement ».

1. Il est aussi possible de créer des sous-requêtes, dans certains cas de figure, que nous n’étudierons pas ici, dans le cadre d’une approche
limitée du langage SQL.
2. Une convention de nom largement répandue veut que les noms des requêtes commencent par le préfixe Req_ ou Rqt_ ou Qry_ pour bien
indiquer qu’il s’agit de requêtes et non pas de tables. Si nous approuvons cette convention, nous nous refusons, en revanche à préfixer les tables
Tbl_ et recommandons de ne pas insérer d’espaces dans les noms d’objets. Ces recommandations cherchent à recouper clarté dans les concepts
et facilité dans la frappe du code.

92 Access® 2007 et VBA


Access Livre Page 93 Mercredi, 27. f vrier 2008 7:28 07

5. Insérez le champ « Département » en première colonne, en double-cliquant sur ce


champ dans la table.
4
Chapitre

6. En option d’opération, sélectionnez le « Compte ».


7. On obtient le seul enregistrement de décompte final avec la valeur 97.

1.8 LES JOINTURES

La table « ADRESSE » est contenue dans le fichier « Access CODES_POSTAUX.accdb »


disponible sur le site de l’éditeur, à l’adresse www.pearsoneducation.fr.
1. Fermez toutes les requêtes et tables en cours.
2. Consultez la table « ADRESSE » en double-cliquant dessus.
Cette table comporte simplement (il est important de le noter) six enregistrements.
Curieusement, les codes postaux des six contacts sont bien renseignés, en revanche, il
manque une colonne pour désigner la ville du domicile. En fait, cette situation est tout à
fait normale puisque les noms des villes peuvent être parfaitement connus grâce aux seuls
codes postaux et la table de tous les codes français.
Les actions suivantes mettent en place une jointure entre la table « ADRESSE » et la table
« CODE_POSTAL », ce qui permet d’afficher le nom de la ville associée au code postal
contenu dans la table « ADRESSE ».
1. Créez une nouvelle requête.
2. Sélectionnez les tables « CODE_POSTAL » et « ADRESSE » dans la fenêtre Afficher la
table : vous noterez qu’un « fil de liaison » apparaît automatiquement entre les deux
champs CODE des deux tables ; c’est uniquement en raison de l’identité des noms de
champ qu’Access établit cette liaison puisqu’aucune relation formelle n’a été posée
entre les deux tables.
3. Insérez, dans la zone Champ de chaque colonne, tous les champs des deux tables pour
obtenir le résultat visuel de la figure 4.7.

Figure 4.7
Requête
avec jointure.

Affichée en mode feuille de données, la requête montre six enregistrements, le code étant
présent deux fois (dans la table « ADRESSE » et dans la table « CODE_POSTAL »). La ville
de domicile est désormais correctement renseignée ; il a été établi une jointure entre les

Les requêtes 93
Access Livre Page 94 Mercredi, 27. f vrier 2008 7:28 07

deux tables et Access montre tous les enregistrements de la table « ADRESSE » et tous les
enregistrements correspondants de la table « CODE_POSTAL ».
1. En mode création, cliquez du bouton droit sur la jointure (le trait) qui avait été établie
automatiquement entre les deux tables et sélectionnez « Supprimer » : la requête ren-
voie maintenant 48 024 enregistrements. En procédant ainsi, on réalise un produit
cartésien des deux tables, c’est-à-dire la mise en place de toutes les combinaisons pos-
sibles entre tous les éléments de la première table avec tous les éléments de la seconde.
À moins de circonstances exceptionnelles, ce cas de figure ne se présente jamais. En
revanche, cette manipulation correspond à une erreur trop souvent commise et qu’on
évitera à tout prix. Il est donc très important d’établir des jointures correctes dès que
plusieurs sources de données sont appelées dans la requête. Il peut être créé autant de
jointures que nécessaire, en nombre illimité.
2. Rétablissez la jointure en faisant un glisser/déplacer de la clé primaire CODE vers sa
clé étrangère de la table « ADRESSE », puis cliquez à nouveau du bouton droit sur
cette jointure pour en afficher les propriétés, comme à la figure 4.8.

Figure 4.8
Propriété
d’une jointure.

Access offre la possibilité d’établir des jointures dites droite ou gauche :


• La jointure gauche (cas numéro 2 de la figure 4.8) montre tous les enregistrements de la
table des adresses et seulement ceux correspondants dans la table des codes (elle renvoie
six enregistrements puisque tous les codes postaux des adresses sont valides).
• La jointure droite (cas numéro 3 de la figure 4.8) montre tous les enregistrements de la
table des codes postaux et seulement ceux correspondants dans la table des adresses
(elle renvoie donc les 8 009 enregistrements de la table « CODE_POSTAL »).
La syntaxe SQL utilise alors les clauses LEFT JOIN ou RIGHT JOIN.

1.9 L’ASSISTANT À LA RÉDACTION DE REQUÊTES

En sus de l’outil « Requêtes », Access propose un « Assistant requête » qui décompose pas
à pas la mise en place des requêtes. Cet outil est utile mais non indispensable dès que les
notions abordées dans les paragraphes précédents sont bien assimilées ; de fait, il ralentit
singulièrement la mise en place d’une requête. En revanche, le même bouton du ruban
propose aussi de créer des requêtes assez complexes et pourtant fréquemment utilisées :
• les requêtes d’isolement des doublons ;

94 Access® 2007 et VBA


Access Livre Page 95 Mercredi, 27. f vrier 2008 7:28 07

• les requêtes de non-correspondance.


En voici un exemple :
4
Chapitre

1. Dans le ruban du menu « Créer », cliquez sur l’icône Assistant Requête.


2. Sélectionnez l’assistant Trouver les doublons.
3. Choisissez la table « CODE_POSTAL ».
4. Choisissez la « Ville » comme champ susceptible de contenir des doublons.
5. Dans l’étape suivante, demandez à afficher aussi les codes postaux.
6. Cliquez sur « Terminer ».
La requête renvoie effectivement tous les doublons (489).

(2) Les requêtes Insertion, Suppression


et Mise à jour
Toutes les requêtes Sélection ne font que lire la ou les tables et requêtes de la base, sans rien
changer de leur contenu. Les requêtes étudiées ici, au contraire, modifient les données par
ajout, mise à jour ou suppression. Elles sont indispensables pour manipuler le contenu
sans l’intervention d’une saisie manuelle et seront intégrées, ultérieurement, dans du code
Visual Basic pour automatiser des procédures.

2.1 LES REQUÊTES AJOUT

Pour qu’une requête ajout soit fonctionnelle, elle doit respecter en tous points les contraintes
d’intégrité qui ont été posées lors de la conception de la base. En particulier, l’ajout d’un
enregistrement ne se réalisera que si tous les champs dont la propriété Null interdit est
positionnée à Oui (champs Not Null) sont effectivement servis.
1. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.
2. Fermez immédiatement la fenêtre d’affichage des tables sans sélectionner aucun objet.
3. Dans le ruban, cliquez sur l’icône Ajout symbolisé par une croix verte avec un point
d’exclamation.
4. Dans la boîte de dialogue d’Ajout, citez la table « ADRESSE » comme destination des
ajouts et validez par « OK ».
5. Dans la première colonne, en bas, saisissez l’alias « MON_NOM » suivi de deux points
(:) et de votre nom entre guillemets, puis précisez dans la zone Ajouter à (située en
dessous) le champ NOM grâce à la liste déroulante.
6. Dans la deuxième colonne, saisissez « MON_PRENOM : » et votre prénom entre
guillemets, puis sélectionnez le champ PRENOM dans la zone Ajouter à.
7. Dans la troisième colonne, saisissez « MON_ADRESSE : » et votre adresse entre
guillemets, puis sélectionnez le champ ADRESSE1 dans la zone Ajouter à.
8. Dans la quatrième colonne, saisissez « MON_CP : » et votre code postal entre guillemets
puis sélectionnez le champ CODE dans la zone Ajouter à.

Les requêtes 95
Access Livre Page 96 Mercredi, 27. f vrier 2008 7:28 07

Passez en mode SQL et visualisez le code ; celui-ci devrait être similaire au suivant :
INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE)
SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des
Vinaigriers" AS MON_ADRESSE, "75010" AS MON_CP;
1. Cliquez sur l’icône de point d’exclamation Exécuter.
2. Un message vous avertit que vous allez ajouter une ligne à la table destination, validez
par « OK » 1.
3. Allez consulter la table « ADRESSE » : cette nouvelle ligne a été ajoutée.
On retiendra que les guillemets, s’agissant d’une zone texte, sont obligatoires. Ils sont
facultatifs, en revanche, lorsque l’insertion concerne une valeur numérique dans un
champ du même type. Les dates, enfin, sont automatiquement cernées par Access d’un
signe dièse (#).
Cette première requête ajout a réalisé une insertion à partir de données totalement exter-
nes à la base, mais il est également possible d’insérer des données à partir d’autres tables.
1. Reprenez en mode création la requête ajout qui a été mise en place.
2. Cliquez sur Afficher la table situé dans le ruban.
3. Sélectionnez la table « CODE_POSTAL ».
4. Supprimez la colonne actuelle d’insertion du code postal dans la partie inférieure de
l’écran.
5. Faites un glisser/déplacer du champ CODE vers une nouvelle colonne, puis précisez
dans la zone Ajouter à le champ CODE pour destination.
6. Faites un glisser/déplacer du champ VILLE vers une nouvelle colonne et ne précisez
aucun champ de destination.
7. Dans la zone Critère de la colonne VILLE, insérez le nom d’une ville qui ne compte pas
de doublon 2 : Gex, par exemple, code 01170.
La figure 4.9 présente ce que vous devez voir à l’écran.

Figure 4.9
Insertion d’un
enregistrement à
partir d’une autre
table.

1. Les messages de service tels que celui-ci peuvent être supprimés dans l’application en allant dans le sous-menu Avancé des Options d’Access
(bouton Office) et en décochant Confirmer > Requêtes actions. On peut aussi utiliser la commande Visual Basic DoCmd.SetWarnings False.
2. Si l’insertion concerne une ville représentée plusieurs fois dans la table source, il y aura autant de lignes ajoutées que de lignes sources.

96 Access® 2007 et VBA


Access Livre Page 97 Mercredi, 27. f vrier 2008 7:28 07

Dans cette requête, on ajoute une ligne d’adresse avec le code postal dont la ville est Gex,
code postal retrouvé grâce à la table des codes postaux. Sa présentation SQL est
4
Chapitre

INSERT INTO ADRESSE (NOM, PRENOM, ADRESSE1, CODE)


SELECT "MINOT" AS MON_NOM, "Bernard" AS MON_PRENOM, "47 bis, rue des
Vinaigriers" AS MON_ADRESSE, CODE_POSTAL.CODE
FROM CODE_POSTAL
WHERE (((CODE_POSTAL.VILLE)="Gex"));
8. Enregistrez cette requête sous le nom Req_Ajout_Perso car celle-ci nous resservira
ultérieurement.

2.2 LES REQUÊTES SUPPRESSION

La requête suppression qui correspond à l’instruction SQL DELETE, réalise la suppression


d’enregistrements. Avec Access, elle se met en œuvre de la manière suivante :
1. Le cas échéant, fermez les requêtes et tables actives.
2. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.
3. Sélectionnez la table « ADRESSE » puis fermez.
4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la
première colonne.
5. Cliquez sur l’icône Suppression du ruban, représenté par un X rouge avec un point
d’exclamation (la zone Supprimer s’incrémente automatiquement du mot-clé « Où »).
6. Dans la zone Critères, saisissez votre nom (celui que vous avez inséré dans l’exercice
précédent).
7. Dans le ruban, cliquez sur le bouton « Exécuter ».
8. Un message de service vous indique que vous allez supprimer un enregistrement ;
répondez « Oui ».
Si l’indication de votre nom avait comporté une faute d’orthographe, Access aurait sim-
plement dit que vous alliez supprimer 0 enregistrement.
L’équivalent SQL de cette manipulation donne DELETE NOM FROM ADRESSE WHERE
NOM="MINOT";. Tous les opérateurs de comparaison déjà vus (LIKE, par exemple) peuvent
être utilisés pour préciser l’étendue des suppressions désirées.
On prendra garde au fait qu’une requête suppression sans opérateur de comparaison
supprime tous les enregistrements de la table source (DELETE NOM FROM ADRESSE;) 1.
Rappelons enfin que si une contrainte d’intégrité référentielle avec suppression en cascade
a été mise en place au niveau relationnel, la suppression d’un enregistrement dans la table
mère provoque la suppression de tous les enregistrements correspondants dans les tables
filles.

1. Access ne prend pas en charge la commande TRUNCATE qui, dans beaucoup de bases de données, permet de vider très rapidement le
contenu entier d’une table.

Les requêtes 97
Access Livre Page 98 Mercredi, 27. f vrier 2008 7:28 07

2.3 LES REQUÊTES MISE À JOUR

Ces requêtes, qui correspondent à l’instruction SQL UPDATE, réalisent la mise à jour de
tout ou partie d’un ou plusieurs enregistrements. L’assistant requêtes d’Access la propose
sous la forme graphique suivante :
1. Dans le ruban du menu « Créer », cliquez sur l’icône Création requête.
2. Sélectionnez la table « ADRESSE » puis fermez.
3. Cliquez sur l’icône Mise à jour dans le ruban, symbolisé par un petit crayon sur une
grille, suivi par un point d’exclamation.
4. Faites un glisser/déplacer du champ NOM depuis la table « ADRESSE » vers la première
colonne.
5. Faites un glisser/déplacer du champ CODE depuis la table « ADRESSE » vers la
seconde colonne.
6. Dans la zone Critères du champ NOM, saisissez « DUPONT » (il s’agit d’un des contacts
de la table « ADRESSE » dont le code postal, avant mise à jour est 01000).
7. Dans la zone Mise à jour du champ CODE, saisissez un code postal quelconque (mais
existant !).
L’assistant requêtes sera donc disposé comme à la figure 4.10.

Figure 4.10
Paramétrage d’une
requête mise à jour.

L’équivalent SQL de cette requête est UPDATE ADRESSE SET CODE = "75010" WHERE
NOM="DUPONT";. S’il existe plusieurs contacts nommés Dupont dans la table ADRESSE,
tous seront dotés, après la mise à jour, du code postal saisi.
Comme pour toutes les requêtes actions, Access informe l’utilisateur du nombre de mises
à jour qu’il effectue lorsqu’il exécute cette requête.

2.4 LA NOTION DE TRANSACTION

Toute requête action (ajout, suppression, mise à jour) s’inclut dans une transaction. Cette
notion est particulièrement importante lorsque la base de données est partagée par plu-
sieurs utilisateurs. La démarche générale d’une transaction se traduit par les événements
successifs suivants :
• Un utilisateur (numéroté 1) démarre explicitement une transaction (par une commande
qu’on verra plus loin).

98 Access® 2007 et VBA


Access Livre Page 99 Mercredi, 27. f vrier 2008 7:28 07

• L’utilisateur 1 procède à une ou plusieurs requêtes action.


• Pendant ce temps, et jusqu’à ce que l’utilisateur 1 ait achevé sa transaction, les autres
4
Chapitre

utilisateurs ne voient pas les ajouts, mises à jour ou modifications apportés à la base.
• Dans ce même temps, les enregistrements impactés par les actions de l’utilisateur 1 sont
bloqués (LOCK), c’est-à-dire qu’un utilisateur 2 ne peut pas y porter une autre requête
action.
• L’utilisateur 1 clôt sa transaction.
• Les autres utilisateurs voient les nouvelles données et peuvent intervenir.
La notion de transaction est opérationnelle :
• avec les tables d’une base de données active ;
• avec les tables d’une base de données connectée sous ODBC 1.
Elle n’est pas opérationnelle avec les tables Access ou autres objets (feuille Excel, fichier
texte, etc.) attachés à la base active.

Attention
Pour que le mode transactionnel soit utilisable, il faut que la base de données utilise une syntaxe
compatible avec SQL Server : cliquez sur le bouton Office > Options Access > Concepteurs
d’objets et cochez la case Syntaxe compatible SQL Server pour cette base de données. Il faudra
s’assurer ensuite d’annuler ce paramétrage car il comporte de lourds effets sur toutes les syn-
taxes SQL employées dans cette base.

Procédons à la mise en œuvre de cette notion :


1. Dans le menu « Créer », cliquez sur Création de requête.
2. Fermez immédiatement la fenêtre affichant toutes les sources de données sans sélec-
tionner aucun objet.
3. Cliquez dans le ruban sur Définition des données (nous reviendrons plus loin sur ce
passage en mode SQL de définition de données).
4. Dans la fenêtre blanche SQL ouverte, saisissez les mots-clés « BEGIN TRANSACTION »
suivi par un point-virgule.
5. Cliquez dans le ruban sur le point d’exclamation Exécuter.
6. Il ne se passe apparemment rien : Access a seulement mémorisé que les requêtes
actions à venir donnaient lieu à transaction, avec la possibilité de valider ou annuler
toutes les commandes générées après le BEGIN TRANSACTION.
7. Rouvrez la requête « Req_Ajout_Perso » en mode SQL et copiez (Ctrl + C) la requête.
8. Retournez dans la requête en cours et collez la commande « INSERT » au complet
(Ctrl + V) à la place du BEGIN TRANSACTION.
9. Cliquez sur Exécuter (à partir de l’onglet « Créer « situé à droite) : SQL vous informe
qu’un enregistrement va être ajouté. Validez cet ajout.

1. À condition que la base de données connectée sous ODBC supporte elle-même la notion de transaction.

Les requêtes 99
Access Livre Page 100 Mercredi, 27. f vrier 2008 7:28 07

10. Ouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez
deux fois sur Affichage à gauche dans le ruban) : elle ne contient apparemment pas
votre enregistrement. Refermez-la.
11. Effacez le texte d’insertion dans la requête en cours et remplacez-le par les mots-clés
« COMMIT TRANSACTION » (avec le point-virgule de fin), et exécutez cette
requête. Si le symbole Exécution n’apparaît plus dans le ruban, cliquez sur le second
onglet « Créer » situé sur la droite.
12. Rouvrez la table « ADRESSE » et rafraîchissez l’affichage si cela est nécessaire (cliquez
deux fois sur Affichage dans le ruban) : le nouvel enregistrement est bien présent.
Si la commande « ROLLBACK TRANSACTION » avait été utilisée en lieu et place du
« COMMIT TRANSACTION », l’insertion aurait été purement et simplement annulée.
Quelques derniers points essentiels sont à retenir sur cet aspect :
• Access oblige à un BEGIN TRANSACTION explicite, contrairement à d’autres bases.
• La notion de transaction s’applique exclusivement aux commandes DML (Data Mana-
gement Language) comme INSERT, DELETE ou UPDATE, non sur les commandes
DDL (Data Definition Language) qui permettent de créer des objets.
• L’utilisation du mode transactionnel ralentit les procédures.
• La fermeture d’Access effectue un COMMIT implicite.

Attention
N’oubliez pas de remettre les options qui étaient actives avant cette manipulation. Pour cela sup-
primez la requête transactionnelle en cours, si cela n’est pas déjà fait, puis cliquez sur le bouton
Office > Options Access > Concepteurs d’objets et décochez la case Syntaxe compatible SQL
Server pour cette base de données.

(3) Les requêtes création


Les tables et autres objets créés jusqu’à maintenant ont donné lieu à des interventions
« manuelles ». Ces dernières peuvent être automatisées, soit par une option spécifique de
création de table, soit directement avec la palette complète du langage SQL.

3.1 LES REQUÊTES CRÉATION DE TABLE

Il est toujours aisé de copier un objet comme une table vers le même objet en le renom-
mant : le nouvel objet hérite alors de presque toutes les propriétés de l’original. Cette
manipulation s’opère de la manière suivante :
1. Cliquez du bouton droit sur la table « ADRESSE » dans le volet de navigation.
2. Sélectionnez « Copier ».
3. Cliquez à nouveau du bouton droit et sélectionnez « Coller ».

100 Access® 2007 et VBA


Access Livre Page 101 Mercredi, 27. f vrier 2008 7:28 07

4. Access propose de créer un objet « Copie de ADRESSE » (qu’on peut nommer diffé-
remment) et suggère, soit la copie de la structure seule, soit celle de la structure et des
données.
4
Chapitre

5. Optez pour une copie complète : deux tables sont désormais disponibles 1.
Cependant, le copier/coller n’a pas réalisé de choix sélectif des données à transmettre :
c’est l’avantage des requêtes création de tables que d’y parvenir :
1. Dans le ruban du menu « Créer », cliquez sur Création de requête.
2. Sélectionnez la table « ADRESSE » dans la fenêtre d’affichage des tables puis refermez-
la.
3. Cliquez dans le ruban sur le bouton « Création de table ».
4. Dans la fenêtre qui s’ouvre, nommez la nouvelle table « NEW_ADRESSE » et validez
par « OK ».
5. Insérez tous les champs de la table « ADRESSE » dans les colonnes du pavé inférieur.
6. Dans la zone Critères de la première colonne, saisissez « <4 » pour obtenir le dessin de
la figure 4.11.

Figure 4.11
Paramétrage d’une
requête création de
table.

7. Cliquez sur « Exécuter » : Access vous avertit que trois enregistrements seront collés
dans une nouvelle table.
8. La nouvelle table, nommée « NEW_ADRESSE », ne contient que les trois enregistrements
correspondant aux ID 1, 2 et 3.

3.2 LES REQUÊTES DÉFINITION DE DONNÉES

Le mode d’affichage SQL habituel, celui des requêtes Sélection ou Action vues auparavant,
ne supporte pas certaines commandes, et en particulier toutes celles qui relèvent du DDL
(Data Definition Language) telles que CREATE ou ALTER. Les requêtes Définition de don-
nées autorisent, elles, ces commandes.
Il n’est pas possible ici, de détailler la syntaxe de toutes les commandes SQL tant elles sont
nombreuses. Les lecteurs qui auront besoin d’utiliser en direct ces commandes pourront
se reporter à l’aide en ligne et aux ouvrages consacrés au langage SQL (pour Access et
MS-SQL Server en l’occurrence).

1. Si la table source était dotée de contraintes d’intégrité référentielle, ces dernières ne sont pas attribuées au nouvel objet.

Les requêtes 101


Access Livre Page 102 Mercredi, 27. f vrier 2008 7:28 07

Un seul exemple sera utilisé pour montrer quelles sont les possibilités de cet outil. On se
propose de modifier la largeur de la colonne NOM de la table « ADRESSE » en la faisant
passer de 50 à 100 caractères de long :
1. Fermez toutes les éventuelles requêtes et/ou tables ouvertes.
2. Dans le ruban du menu « Créer », cliquez sur le bouton « Création de requête ».
3. Fermez la fenêtre d’affichage des tables sans sélectionner aucune table.
4. Dans le ruban, cliquez sur « Définition de données ».
5. Dans la fenêtre SQL blanche, saisissez la commande SQL suivante : « ALTER TABLE
ADRESSE ALTER COLUMN NOM TEXT(100) NOT NULL » terminée par un point-
virgule, puis exécutez cette requête.
6. Ouvrez la table « ADRESSE » en mode création : le champ NOM est effectivement
élargi, tout en maintenant le type de la colonne en Texte et la propriété Null interdit à
Oui.

Résumé
L’outil Requêtes sert à exploiter les données stockées dans les tables. Les requêtes Sélection
lisent et ordonnent les données suivant de multiples critères de tri et de filtrage. Avec la
notion de jointure, les requêtes Sélection permettent de recroiser les données en prove-
nance de multiples tables ou autres requêtes suivant le modèle relationnel.
Les requêtes Action ajoutent, suppriment ou modifient les données ; elles s’inscrivent dans
le cadre de transactions dans la base.
Access supporte, en direct ou en mode assisté, un grand nombre des commandes du langage
SQL, langage commun des bases de données.

102 Access® 2007 et VBA


Access Livre Page 103 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
4
Chapitre

Les exercices suivants sont constitués de questions rapides sur la mise en place de requêtes.
On commencera par des requêtes Sélection destinées à afficher des données ou des synthè-
ses (exercices 1 à 17) puis on fera quelques requêtes Action d’insertion, de mise à jour et de
suppression de données (exercices 18 à 20). Tous concernent la base « ECOLE_INTERNA-
TIONALE » créée dans les exercices du chapitre 3. On s’appliquera à enregistrer chaque
requête sous la forme « Req_4xx » pour pouvoir la réutiliser ultérieurement.

EXERCICE 1 AFFICHAGE PAR ORDRE ALPHABÉTIQUE

• Énoncé Affichez les noms, prénoms, adresse, code postal, ville et pays des élèves français présentés
par ordre alphabétique.

* Solution Un ordre de tri croissant doit être mis sur la colonne NOM_ELEVE de la table « ELEVE »
et un critère de filtre doit être posé sur la colonne PAYS_ELEVE pour obtenir le résultat de
la figure 4.12.
Pour cela effectuez les actions suivantes :
1. Dans le ruban du menu « Créer », cliquez sur « Création de requête ».
2. Sélectionnez la table « ELEVE » dans la fenêtre d’affichage des tables puis refermez-la.
3. Placez dans chacune des colonnes du tableau les champs « NOM_ELEVE »,
« PRENOM_ELEVE », « ADRESSE1_ELEVE », « CODEPOSTAL_ELEVE », « VILLE_
ELEVE », « PAYS_ELEVE ».
4. Dans la zone Tri de la colonne NOM_ELEVE, choisissez « croissant » dans la liste
déroulante.
5. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez le texte « "FR" ».
6. Enregistrez la requête sous le nom « Req_411 ».

Figure 4.12
Paramétrage
de l’exercice 1.
Exercices

Les requêtes 103


Access Livre Page 104 Mercredi, 27. f vrier 2008 7:28 07

La requête SQL est la suivante :


SELECT NOM_ELEVE, PRENOM_ELEVE, ADRESSE1_ELEVE, CODEPOSTAL_
ELEVE, VILLE_ELEVE, PAYS_ELEVE
FROM ELEVE
WHERE PAYS_ELEVE="FR"
ORDER BY NOM_ELEVE; 1
où la clause WHERE précise le filtre et la clause ORDER BY précise le tri.

EXERCICE 2 AFFICHAGE SUR CRITÈRE DE PRÉNOM

• Énoncé Affichez les noms et prénoms des élèves dont le prénom commence par un A.

* Solution Le critère de filtre utilisera le mot-clé « Comme » (LIKE en anglais) et le caractère « * »


(voir figure 4.13).
Pour cela effectuez les actions suivantes :
1. Dans le ruban du menu « Créer », cliquez sur « Création de requête ».
2. Sélectionnez la table « ELEVE » dans la fenêtre d’affichage des tables puis refermez-la.
3. Placez dans chacune des colonnes du tableau les champs « NOM_ELEVE »,
« PRENOM_ELEVE ».
4. Dans la zone Critères de la colonne PRENOM_ELEVE, inscrivez « Comme "A*" ».
5. Enregistrez la requête sous le nom « Req_412 ».

Figure 4.13
Paramétrage de
l’exercice 2.

EXERCICE 3 AFFICHAGE SUR CRITÈRE EXCLUANT UN PAYS

• Énoncé Affichez les seuls noms et prénoms des élèves qui ne sont pas français.

* Solution Le critère de filtre utilise le mot-clé « Pas » ; la colonne PAYS ne devant pas être affichée, la
case Afficher est décochée (voir figure 4.14). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).

1. Toutes les syntaxes sont simplifiées pour une meilleure lecture ; les parenthèses inutiles ou les préfixes de tables sont ici supprimés par
rapport à la requête créée par le générateur d’Access. On notera aussi que les guillemets devront être remplacés par des apostrophes ou des
doubles guillemets lorsque ces requêtes seront insérées dans du code Visual Basic.

104 Access® 2007 et VBA


Access Livre Page 105 Mercredi, 27. f vrier 2008 7:28 07

2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_


ELEVE » et « PAYS_ELEVE ».
4
Chapitre

3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « Pas "FR" ». Décochez la


case Afficher.

Figure 4.14
Paramétrage
de l’exercice 3.

EXERCICE 4 AFFICHAGE SUR CRITÈRES MULTIPLES

• Énoncé Affichez les noms et prénoms des élèves américains, allemands et anglais.

* Solution Le mot ET utilisé dans l’énoncé ne doit pas induire en erreur : un élève n’est pas simulta-
nément de plusieurs nationalités ; aussi c’est bien le critère OU qui doit être utilisé (voir
figure 4.15). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE » et « PAYS_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "USA" ». Puis dans les
zones Ou suivantes, « "D" » et « "UK" ».

Figure 4.15
Paramétrage
de l’exercice 4.

EXERCICE 5 AFFICHAGE SUR CRITÈRE DE DATE

• Énoncé Affichez les noms et prénoms des élèves français nés entre le 1er janvier 1960 et le
Exercices

31 décembre 1969.

Les requêtes 105


Access Livre Page 106 Mercredi, 27. f vrier 2008 7:28 07

* Solution Trois conditions se cumulent et doivent être placées sur la même ligne. La colonne
DATENAISSANCE_ELEVE invoquée deux fois n’est affichée qu’une fois. Les caractères
dièse (#) qui cernent les dates n’ont pas besoin d’être saisis : Access les pose automatiquement
(voir figure 4.16). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE », « PAYS_ELEVE », « DATENAISSANCE_ELEVE », et une nouvelle fois
« DATENAISSANCE_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "FR" ». Dans la zone Cri-
tères de la première colonne DATENAISSANCE_ELEVE, inscrivez « >=01/01/1960 ».
Dans la zone Critères de la seconde colonne DATENAISSANCE_ELEVE, inscrivez
« <=31/12/1969 ».

Figure 4.16
Paramétrage
de l’exercice 5.

EXERCICE 6 AFFICHAGE SUR CRITÈRES DE DATE ET DE PAYS

• Énoncé Affichez les noms et prénoms des élèves français et américains nés avant le 1er janvier
1960.

* Solution Il convient de répéter la condition d’âge sur les deux lignes pour qu’elle s’applique chaque
fois aux deux populations différentes (voir figure 4.17). Effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « PRENOM_
ELEVE », « PAYS_ELEVE », « DATENAISSANCE_ELEVE ».
3. Dans la zone Critères de la colonne PAYS_ELEVE, inscrivez « "FR" », et dans la zone
Ou « "USA" ». Dans la zone Critères de la colonne DATENAISSANCE_ELEVE, inscri-
vez « <01/01/1960 ». Et inscrivez la même valeur dans la zone « Ou » de cette colonne.

Figure 4.17
Paramétrage
de l’exercice 6.

106 Access® 2007 et VBA


Access Livre Page 107 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 7 AFFICHAGE AVEC VALEURS DISTINCTES


4
Chapitre

• Énoncé Citez tous les pays représentés dans l’école.

* Solution Pour répondre à cette question, il serait possible de faire une requête avec regroupe-
ment de données sur la colonne PAYS_ELEVE. Mais cette réponse n’est pas judicieuse :
on pourra avoir à réaliser ultérieurement des requêtes dans lesquelles la notion de
regroupement s’ajoute à la sélection de valeurs distinctes. C’est donc bien la zone
Valeurs distinctes dans la feuille des propriétés de la requête qui doit être positionnée à
Oui.
La requête en code SQL est : SELECT DISTINCT PAYS_ELEVE FROM ELEVE; , beaucoup plus
simple qu’une requête dotée d’un GROUP BY. Pour obtenir ce résultat, effectuez les
actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans la première colonne du tableau le champ PAYS_ELEVE.
3. Dans le ruban, sélectionnez la feuille des propriétés. Positionnez la propriété Valeurs
distinctes à « Oui ».

EXERCICE 8 AFFICHAGE DES PREMIERS ÉLÉMENTS

• Énoncé Affichez les ID, noms et prénoms des 5 premiers élèves.

* Solution Pour obtenir ce résultat, effectuez les actions suivantes :


1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les deux premières colonnes du tableau les champs « NOM_ELEVE », et
« PRENOM_ELEVE ».
3. Dans le ruban de création de requête, cliquez sur l’icône Renvoyer et sélectionnez la
valeur « 5 ». Il ne s’agit pas forcément des ID de 1 à 5, mais des 5 premiers enregistre-
ments qu’Access affichera. Cette option est destinée à n’afficher qu’un aperçu des
données lorsque la table comprend un très grand nombre d’enregistrements.
La traduction SQL de cette requête donne : SELECT TOP 5 ID_ELEVE, NOM_ELEVE,
PRENOM_ELEVE FROM ELEVE;.
Exercices

Les requêtes 107


Access Livre Page 108 Mercredi, 27. f vrier 2008 7:28 07

La figure 4.18 présente les paramètres de cette requête.

Figure 4.18
Paramétrage
de l’exercice 8.

EXERCICE 9 AFFICHAGE AVEC REGROUPEMENT PAR PAYS ET COMPTAGE

• Énoncé Combien y a-t-il d’élève par pays représenté ?

* Solution La réponse à cette question induit un regroupement par pays et un comptage sur ce même
critère. Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir de la table « ELEVE » (deux premières étapes de l’exercice 1).
2. Placez dans les deux premières colonnes du tableau le champ « PAYS_ELEVE », et à
nouveau « PAYS _ELEVE ».
3. Cliquez sur le bouton « ∑ » du ruban de création de requête. On notera qu’Access fait
un tri sur la colonne de regroupement sans même que cette option ait été demandée
(voir figure 4.19), puis changer l’opération Regroupement de la deuxième colonne en
Compte grâce à la liste déroulante.

Figure 4.19
Paramétrage
de l’exercice 9.

EXERCICE 10 AFFICHAGE AVEC JOINTURE

• Énoncé Affichez les noms des élèves, leurs notes et la matière correspondante.

* Solution Cette question nécessite l’introduction des tables « NOTE » et « MATIERE » (voir figure
4.20). Pour obtenir ce résultat, effectuez les actions suivantes :

108 Access® 2007 et VBA


Access Livre Page 109 Mercredi, 27. f vrier 2008 7:28 07

1. Créez la requête à partir des tables « ELEVE », « NOTE » et « MATIERE ». On constate


que les relations entre les trois tables apparaissent automatiquement (puisque qu’elles
sont établies définitivement dans le modèle relationnel mis en place à la fin des exercices
4
Chapitre

du chapitre 2).
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE », « MATIERE » et
« NOTATION ».
3. La requête renvoie 19 760 enregistrements.

Figure 4.20
Paramétrage
de l’exercice 10.

EXERCICE 11 AFFICHAGE AVEC JOINTURE ET REGROUPEMENT

• Énoncé Affichez les noms des élèves, la moyenne de leurs notes et la matière correspondante.
Classez les élèves par ordre alphabétique et par matière.

* Solution Le regroupement s’ajoute ici à la jointure des tables (voir figure 4.21). En première ana-
lyse, les moyennes sont affichées avec un grand nombre de chiffres après la virgule, ce qui
est peu indicatif. Il faut limiter la précision de la moyenne à deux décimales.
1. Repassez en mode création de requête construite à l’exercice précédent.
2. Cliquez sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
3. Modifiez l’Opération de la colonne NOTATION en Moyenne.
4. Double-cliquez du bouton droit sur la colonne NOTATION.
5. Sélectionnez Propriétés.
Exercices

6. Dans la zone Format, précisez Fixe.


7. Dans la zone Nombre de décimales, précisez 2.

Les requêtes 109


Access Livre Page 110 Mercredi, 27. f vrier 2008 7:28 07

8. Enregistrez la requête sous le nom « Req_4111 ».

Figure 4.21
Paramétrage
de l’exercice 11.

EXERCICE 12 APPEL DE REQUÊTES MULTIPLES

• Énoncé Affichez les noms des élèves, la moyenne de leurs notes et la matière correspondante.
Classez les élèves par ordre alphabétique et par matière. Les moyennes doivent être
arrondies au point le plus voisin.

* Solution La question comporte un piège. La première tentation consisterait à utiliser une formule
d’arrondi en utilisant la requête de l’exercice 11. Or, cet essai sera infructueux : si la for-
mule d’arrondi est appliquée directement, elle portera sur toutes les notes prises indivi-
duellement et non sur le résultat final. Il s’agit de calculer dans un premier temps la
moyenne par élève, puis de l’arrondir ensuite.

Première méthode
Une première solution, un peu lourde à mettre en œuvre, consiste à récupérer les résultats
de la requête « Req_4111 » et d’y appliquer une formule d’arrondi, comme à la figure 4.22.
1. Fermez toutes les requêtes en cours.
2. Créez une nouvelle requête dont la source sera la « Req_4111 ». Sélectionnez pour cela
l’onglet requête lorsque la fenêtre Afficher la table apparaît après la Création de requête.
Dans la liste choisissez « Req_4111 ».
3. Insérez les deux premières colonnes « NOM_ELEVE » et « NOM_MATIERE ».
4. Dans la troisième colonne, saisissez la formule : MoyenneFinale:Round([MoyenneDe-
NOTATION];0) où MoyenneFinale (en un seul mot) est l’alias de la colonne et Round()
la fonction d’arrondi.

Figure 4.22
Première solution
de l’exercice 12.

110 Access® 2007 et VBA


Access Livre Page 111 Mercredi, 27. f vrier 2008 7:28 07

Seconde méthode
Il existe une solution plus « esthétique », n’utilisant qu’une seule requête pour faire les
4
Chapitre

deux opérations simultanément et dans le bon ordre :


1. Reprenez la requête « Req_4111 ».
2. Dans la colonne NOTATION, utilisez l’Opération Expression (et non plus Moyenne).
3. Dans la zone Champ, à la place de NOTATION, entrez l’expression : MoyenneFinale:
Round(Moyenne([NOTATION]);0) où l’on voit bien que la moyenne est calculée avant
de l’arrondir.
La figure 4.23 présente l’état de la requête en création.

Figure 4.23
Seconde solution
de l’exercice 12.

EXERCICE 13 AFFICHAGE DE LA MOYENNE GÉNÉRALE

• Énoncé Affichez les noms des élèves et leur moyenne générale. Classez les élèves du plus brillant
au moins bon. On ne veut voir que ceux qui ont la moyenne.

* Solution Ici, la table « MATIERE » n’est plus utile puisqu’il s’agit d’une moyenne toutes matières
confondues (voir figure 4.24). Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir des tables « ELEVE » et « NOTE ».
2. Placez dans les colonnes du tableau les champs « NOM_ELEVE » et « NOTATION ».
3. Cliquer sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
4. Modifiez l’Opération de la colonne NOTATION en Moyenne.
Exercices

5. Ajoutez dans la colonne NOTATION le critère « >=10 ».


6. Cliquez du bouton droit sur la colonne NOTATION.
7. Sélectionnez Propriétés.
8. Dans la zone Format, précisez Fixe.

Les requêtes 111


Access Livre Page 112 Mercredi, 27. f vrier 2008 7:28 07

9. Dans la zone Nombre de décimales, précisez 2.

Figure 4.24
Paramétrage
de l’exercice 13.

EXERCICE 14 AFFICHAGE DE LA MOYENNE PAR MATIÈRE

• Énoncé Affichez les noms des élèves et leur moyenne en français. Les élèves de cette nationalité
étant avantagés, ajoutez 2 points à tous ceux de nationalité étrangère.

* Solution La table « MATIERE » est de nouveau nécessaire et donne lieu à un critère de filtre sur la
matière FRANCAIS. Une condition VraiFaux doit être introduite pour solutionner le pro-
blème, insérée dans Expression et non un regroupement ou tout autre calcul intégré (voir
figure 4.25). La formule à insérer dans la dernière colonne se rédige ainsi :
NoteRéévaluée : VraiFaux([PAYS_ELEVE]<>"FR";Round((Moyenne([NOTATION])+2);2);
Round(Moyenne([NOTATION]);2))
Pour obtenir ce résultat, effectuez les actions suivantes :
1. Créez la requête à partir des tables « MATIERE », « ELEVE » et « NOTE ».
2. Placez dans les colonnes du tableau les champs « NOM_MATIERE », « NOM_
ELEVE », « PAYS_ELEVE » et « NOTATION ».
3. Cliquer sur le bouton « ∑ » du ruban de création de requête pour faire apparaître
l’opération regroupement.
4. Ajoutez dans la colonne MATIERE le Critère « FRANCAIS ».
5. Modifiez l’Opération de la colonne NOTATION en Moyenne.
6. Cliquez du bouton droit sur la colonne NOTATION.
7. Pour la colonne NOTATION, sélectionnez Propriétés, dans la zone Format, précisez
Fixe, puis deux décimales.
8. Changez le champ de la colonne NOTATION en NoteBrute:NOTATION.

112 Access® 2007 et VBA


Access Livre Page 113 Mercredi, 27. f vrier 2008 7:28 07

9. Dans une nouvelle colonne, indiquez dans la zone Champ la formule NoteRéévaluée
présentée précédemment.
4
Chapitre

10. Modifiez le champ Opération de cette colonne en Expression.

Figure 4.25
Paramétrage
de l’exercice 14.

EXERCICE 15 TABLEAU CROISÉ DYNAMIQUE

• Énoncé Faites un tableau croisé dynamique des élèves et de leur moyenne par matière. Un tel
tableau présente aux croisements des lignes et des colonnes les valeurs correspondantes.
Dans notre cas, les lignes indiqueront le nom des élèves, les colonnes les matières et cha-
que cellule de ce tableau présentera la note moyenne de chaque élève pour cette matière.

* Solution Cet aspect des requêtes n’a pas été présenté dans le cours. Il est possible, comme dans
Excel, de monter des tableaux croisés pourvu que les données s’y prêtent, ce qui est le cas
ici. Opérez de la manière suivante :
1. Fermez les éventuelles requêtes ouvertes.
2. Créez une nouvelle requête et appelez les tables « ELEVE », « NOTE » et
« MATIERE ».
3. Dans le ruban du menu de création de requête, cliquez sur le bouton « Analyse
croisée ».
4. Dans le damier du pavé inférieur apparaissent deux nouvelles zones, l’une déjà
connue et nommée Opération (pour les regroupements), l’autre nommée Analyse
pour désigner les en-têtes de lignes et de colonnes.
5. Insérez le champ « NOM_ELEVE » dans la première colonne.
6. Dans la zone Analyse de la première colonne, indiquez En-tête de ligne.
7. Insérez le champ « NOM_MATIERE » dans la deuxième colonne.
8. Dans la zone Analyse, indiquez En-tête de colonne.
9. Insérez le champ « NOTATION » dans la troisième colonne.
10. Dans la zone Opération de la troisième colonne, indiquez Moyenne (au lieu de
Regroupement pour les deux colonnes précédentes).
11. Dans la zone Analyse de la troisième colonne, sélectionnez Valeur.
Exercices

12. Affichez le résultat et élargissez les colonnes afin de pouvoir lire les données (au
besoin, précisez dans la propriété de la colonne NOTATION le format Fixe et le nombre
de décimales voulu).

Les requêtes 113


Access Livre Page 114 Mercredi, 27. f vrier 2008 7:28 07

Le paramétrage décrit et le résultat obtenu sont présentés sur la figure 4.26.

Figure 4.26
Paramétrage d’un
tableau croisé et
résultats.

EXERCICE 16 TABLEAU CROISÉ AVEC REGROUPEMENT

• Énoncé Présentez le même tableau qu’à la question précédente, mais en utilisant la notion de
Langue vivante et non plus en détaillant Anglais, Allemand et Italien.

* Solution Il suffit de faire intervenir les tables GROUPE et REGROUPEMENT (mises en place dans
l’exercice 4 du chapitre 3) en sus de celles déjà existantes pour obtenir le résultat voulu. La
colonne MATIERE comme en-tête de colonne doit être remplacée par le champ NOM_
GROUPE. Opérez de la manière suivante :
1. À partir de la requête précédente, ajoutez les tables « GROUPE » et « REGROUPE-
MENT » via l’icône Afficher la table du ruban.
2. Insérez une nouvelle colonne « NOM_GROUPE », en première position, avant la
colonne NOM_ELEVE. Pour cela, sélectionnez la colonne « NOM_ELEVE » actuelle
et cliquez sur « Insérer des colonnes » dans le ruban. Dans cette première colonne
ajouter le champ « NOM_GROUPE » de la table « GROUPE » grâce à la liste dérou-
lante. Dans la zone Analyse de cette colonne, sélectionnez En-tête de colonne.
3. Supprimez la colonne « NOM_MATIERE » pour ne conserver que les trois colon-
nes NOM_GROUPE, NOM_ELEVE, NOTATION comme cela est présenté sur la
figure 4.27.

114 Access® 2007 et VBA


Access Livre Page 115 Mercredi, 27. f vrier 2008 7:28 07

Figure 4.27
Paramétrage
4
Chapitre

de l’exercice 16.

EXERCICE 17 REGROUPEMENT ET COEFFICIENT

• Énoncé En reprenant l’exercice précédent, la notation doit désormais être corrigée par un coefficient.
Les coefficients sont les suivants :
• Histoire-géographie : 5.
• Langues vivantes : 4.
• Français : 3.
• Physique-chimie : 2.
• Mathématiques : 1.
Présentez les résultats généraux de la classe groupe de matières par groupe de matières en
tenant compte du coefficient et présentez dans le même tableau la note finale.

* Solution L’ajout de la notion de coefficient oblige à une modification des tables car elle n’est insérée
nulle part. Le fait que l’énoncé donne un coefficient aux langues vivantes (et non à chaque
langue séparément) incite à créer la notion au niveau de la table GROUPE et non à celui
de la table MATIERE.
1. Ouvrez la table « GROUPE » en mode création.
2. Ajoutez un champ « COEF_GROUPE », Numérique, Entier. Ne posez pas la consigne
Null interdit car la table ne pourrait pas être enregistrée (les coefficients ne sont pas
saisis).
Exercices

3. Repassez en mode feuille de données et saisissez les coefficients indiqués.


4. Repassez en mode création et mettez la propriété Null interdit à Oui.
5. Refermez la table.

Les requêtes 115


Access Livre Page 116 Mercredi, 27. f vrier 2008 7:28 07

L’utilisation d’un tableau croisé n’est pas possible dans l’immédiat pour au moins deux
raisons : d’une part, le tableau croisé ne fait pas apparaître les résultats généraux (la
moyenne des moyennes) ; d’autre part, les en-têtes de colonnes et de lignes doivent tenir
compte d’une multiplication par un coefficient. Il faut donc procéder par étapes successives :
a. Calculer les moyennes coefficientées par élève et par matière ; en faire une première
requête.
b. Monter un tableau croisé à partir de la requête précédente dans une deuxième requête.
c. Créer une troisième requête, appelant la deuxième et ajoutant une colonne de moyenne
générale.
La première étape comprend la création d’une requête appelant toutes les tables (ELEVE,
NOTE, MATIERE, GROUPE et REGROUPEMENT). Elle a la structure de la figure 4.28,
où un alias MoyenneCoefficientée précède la multiplication de la note par le coefficient
correspondant.
1. La zone champ de la première colonne, contient « NOM_ELEVE » et la zone Opération est
positionnée à Regroupement.
2. La zone champ de la deuxième colonne, contient « NOM_GROUPE » et la zone Opé-
ration est positionnée à Regroupement.
3. La zone champ de la troisième colonne, contient « NOTATION » et la zone Opération
est positionnée à Moyenne.
4. La zone champ de la quatrième colonne, contient l’expression MoyenneCoefficien-
tée: Moyenne([NOTATION]*[COEF_GROUPE]) et la zone Opération est positionnée à
Expression.

Figure 4.28
Première étape
de l’exercice 17
(Requête Req_4117-1).

Il faut sauvegarder cette requête sous le nom « Req_4117-1 » pour pouvoir la réutiliser
tout de suite après.
En effet, la deuxième étape commence par créer une nouvelle requête de type Analyse croisée
(bouton dans le ruban) qui récupère les données agrégées de la requête Req_4117-1.
1. En première colonne, le champ « NOM_ELEVE » est choisi, la zone Analyse est posi-
tionnée à En-tête de lignes, et la zone Opération à Regroupement.
2. En deuxième colonne, le champ « NOM_GROUPE » est choisi, la zone Analyse est
positionnée à En-tête de colonnes, et la zone Opération à Regroupement.
3. En troisième colonne, la moyenne coefficientée est reprise comme valeur (zone
Champ affectée à MoyenneCoefficientée, et zone Analyse affectée à Valeur), avec une
fonction d’agrégat quelconque (Somme, Moyenne ou autres, dans le champ Opéra-
tion) ; elle ne peut pas être une expression (qui ne ferait pas partie d’un agrégat) et ne
peut pas être non plus un regroupement (puisque les deux axes sont déjà utilisés).
Essayez ces différentes possibilités et voyez les réactions d’Access. La fonction Somme
employée ici n’additionne rien puisqu’une seule valeur est déclarée par ligne dans la
requête précédente.

116 Access® 2007 et VBA


Access Livre Page 117 Mercredi, 27. f vrier 2008 7:28 07

La structure de la deuxième requête, qu’on enregistrera sous le nom « Req_4117-2 », est


présentée à la figure 4.29.
4
Chapitre

Figure 4.29
Deuxième étape
de l’exercice 17
(Requête Req_4117-2).

La dernière étape a pour but d’améliorer la présentation (les moyennes sont affichées avec
de nombreuses décimales) et d’ajouter la moyenne finale de chaque élève sur 20.
1. Après avoir enregistré la requête précédente et l’avoir fermée, créez-en une nouvelle.
2. Dans la fenêtre d’affichage des tables et requêtes, sélectionnez la requête « Req_4117-2 ».
3. On constate que la liste des champs affichés porte le nom des matières, qui sont devenues
des en-têtes dans le tableau croisé.
4. Cliquez sur le bouton « ∑ » pour passer en mode « Regroupement de données ».
5. Insérez le champ « NOM_ELEVE » dans la première colonne, précédé de l’alias Nom
pour parfaire la présentation.
6. La deuxième colonne contient une expression, et non un regroupement, de la forme :
Littérature: Round(Somme([Français]);2) . L’alias ne doit pas porter le même
nom qu’un champ : c’est la raison pour laquelle nous avons employé le mot Littéra-
ture. La fonction Somme() est présente car une fonction agrégat doit impérativement
être utilisée mais, encore une fois, la fonction ne fait qu’additionner un seul chiffre.
La fonction Round() arrondit le résultat 1.
7. Présentez les 4 autres matières sous la même forme que le Français. On prendra garde
à la présence des parenthèses et des crochets, indispensables. Les formules sont respec-
tivement : Histoire-Géo: Round(Somme([HISTOIRE-GEOGRAPHIE]);2)
Langues: Round(Somme([LANGUES_VIVANTES]);2)
Maths: Round(Somme([MATHEMATIQUES]);2)
Physique: Round(Somme([PHYSIQUE-CHIMIE]);2).
8. La dernière colonne contient une dernière expression pour calculer la moyenne géné-
rale : Moyenne Générale sur 20: Round(((Somme([Français])+Somme([HISTOIRE-
GEOGRAPHIE])+Somme([LANGUES_VIVANTES])+Somme([MATHEMATIQUES])
+Somme([PHYSIQUE- CHIMIE]))/15);2) .
Exercices

1. La présentation des résultats (propriété Format Fixe à 0 décimales) ne fonctionne pas toujours correctement dans ce type de tableau ; il est
donc préférable de forcer le résultat par l’usage d’une fonction dans l’expression.

Les requêtes 117


Access Livre Page 118 Mercredi, 27. f vrier 2008 7:28 07

Note
Le chiffre 15 a été mis ici pour simplifier la somme des coefficients de toutes les matières. Ce pro-
cédé peu orthodoxe sera avantageusement remplacé par une fonction qui va additionner tous
les coefficients de la table GROUPE ; or, nous n’avons pas encore étudié cette fonction de
domaine. La bonne tournure serait SomDom("[COEF_GROUPE]";"GROUPE").

La structure de la dernière requête est présentée à la figure 4.30.

Figure 4.30
Troisième étape
de l’exercice 17
(Requête
Req_4117-3).

EXERCICE 18 REQUÊTE AJOUT

• Énoncé Ajoutez la note de 14 en mathématiques à Martin EDEN.

* Solution Cet énoncé très court revêt en fait plusieurs difficultés : la matière est exprimée alphabéti-
quement alors que la table NOTATION ne comporte que des IDs, le nom de l’élève est cité
alors que la même table NOTATION ne contient que les numéros des élèves. En outre, un
champ supplémentaire est obligatoire dans la table NOTATION concernant la date
d’attribution de la note. Deux manières de procéder sont possibles :
• soit rédiger une requête ajout après avoir consulté les tables et repéré les ID de la
matière et de l’élève ;
• soit rédiger une requête ajout qui parvient à utiliser les noms contenus dans les champs
adéquats.
Nous utiliserons les deux méthodes qui nous conduiront à découvrir de nouvelles fonc-
tionnalités.

Première méthode
Créez une nouvelle requête de la manière suivante :
1. Appelez la table « NOTE ».
2. Cliquez sur le bouton Ajout du ruban.
3. Dans la fenêtre qui s’ouvre, notifiez que les ajouts se feront dans la table « NOTE ».
4. Faites glisser le champ « ID_ELEVE » dans la première colonne : vous noterez
qu’Access place automatiquement le champ ID_ELEVE dans la zone Ajouter à : la
similitude des noms suffit. Saisissez à la suite du nom de champ le signe « deux-
points » et le chiffre « 1 » (correspondant à l’élève EDEN).

118 Access® 2007 et VBA


Access Livre Page 119 Mercredi, 27. f vrier 2008 7:28 07

5. Faites glisser le champ « ID_MATIERE » en deuxième colonne. Ajoutez à la suite du


nom de champ le signe « deux-points » et le chiffre « 2 » (correspondant à la matière
Mathématiques).
4
Chapitre

6. Faites glisser le champ « NOTATION » en troisième colonne, ajoutez à la suite du nom


de champ le signe « deux-points » et le chiffre « 14 ».
7. Faites glisser le champ « DATE_NOTE » en quatrième colonne, ajoutez à la suite du
nom de champ le signe « deux-points » et la formule « Date() ». Cette formule (suivie
par des parenthèses) est une fonction Access qui renvoie la date du jour.
8. Cliquez sur le bouton « Exécuter » : vous constatez avec effroi que le programme va
ajouter des dizaines de milliers de lignes, ce qui n’est pas du tout votre intention !
9. Annulez cette commande qui provient du fait que tous les enregistrements de la table
« NOTE » sont comptés pour l’insertion.
10. Retirez la table « NOTE » du pavé supérieur en appuyant sur la touche « Sup. » du clavier
après avoir cliqué dans la table.
11. Cliquez de nouveau sur « Exécuter » : cette fois, une seule ligne sera insérée. Acceptez
l’opération.
12. Enregistrez cette requête sous le nom « Req_421-1 ».
Le code SQL de cette requête est : INSERT INTO [NOTE] (ID_ELEVE, ID_MATIERE, NOTA-
TION, DATE_NOTE ) SELECT 1 AS ID_ELEVE, 2 AS ID_MATIERE, 14 AS NOTATION,
Date() AS DATE_NOTE;
La figure 4.31 présente les paramètres de cette requête.

Figure 4.31
Première solution
de l’exercice 18
(Req_421-1).

Seconde méthode
Cette deuxième méthode fait appel à la notion de sous-requête, que nous n’avons pas
encore étudiée, et à l’utilisation d’un subterfuge dû à l’imperfection de l’interpréteur de
requête d’Access.
Il est nécessaire tout d’abord de créer une table « fantôme » qu’on appellera TABLEVIDE,
contenant un et un seul enregistrement :
1. Créez la table avec pour seul champ le « N˚ » établi par défaut.
2. En mode création, nommez-la « TABLEVIDE ».
3. En mode feuille de données, validez une ligne pour obtenir un et un seul enregistrement.
4. Fermez la table.
Reprenons la première requête :
1. La requête Req_421-1 étant fermée, cliquez du bouton droit dessus et sélectionnez
Exercices

« Copier ».
2. Dans le volet de navigation, cliquez du bouton droit et sélectionnez « Coller ».
3. Renommez la nouvelle requête « Req_421-2 » (en lieu et place de Copie de Req_421-1).
4. Ouvrez la nouvelle requête en mode création.

Les requêtes 119


Access Livre Page 120 Mercredi, 27. f vrier 2008 7:28 07

5. Ajoutez la table « TABLEVIDE » 1 grâce à l’icône Afficher la table du ruban.


6. À la place de la valeur 1, positionnée après l’alias de la première colonne ID_ELEVE,
insérez le texte suivant entre parenthèses, correspondant à une requête pour retrouver
l’ID de l’élève à partir de son nom : (SELECT ID_ELEVE FROM ELEVE WHERE NOM_
ELEVE = "EDEN").
7. À la place de la valeur 2, positionnée après l’alias de la deuxième colonne, insérez le
texte suivant entre parenthèses (SELECT ID_MATIERE FROM MATIERE WHERE NOM_
MATIERE = "MATHEMATIQUES")
La requête, fonctionnelle, possède la structure de la figure 4.32 2, son exécution affecte la
note 14 à l’élève EDEN en Mathématiques.

Figure 4.32
Seconde solution
de l’exercice 18
(Req_421-2).

EXERCICE 19 REQUÊTE SUPPRESSION

• Énoncé Supprimez la ou les notes qui viennent d’être ajoutées lors de l’exercice précédent.

* Solution 1. Créez une nouvelle requête.


2. Appelez la table « NOTE ».
3. Cliquez dans le ruban sur l’icône Suppression.
4. Faites glisser les quatre champs « ID_ELEVE », « ID_MATIERE », « NOTATION » et
« DATE_NOTE » dans les colonnes du pavé inférieur.
5. Insérez dans la zone Critères les mêmes que ceux de l’exercice précédent, soit respec-
tivement « 1 », « 2 », « 14 » et « Date() », pour obtenir le dessin de la figure 4.33.

1. Il est obligatoire d’utiliser ce subterfuge car Access refuse de faire des sous-requêtes si une table au moins n’est pas citée dans le FROM.
2. Une troisième solution consisterait à utiliser la fonction RechDom(), non encore étudiée, et qui n’aurait pas utilisé la notion de sous-
requête, bien utile par ailleurs.

120 Access® 2007 et VBA


Access Livre Page 121 Mercredi, 27. f vrier 2008 7:28 07

Figure 4.33
Requête
4
Chapitre

suppression.

EXERCICE 20 REQUÊTE MISE À JOUR

• Énoncé Modifiez toutes les notes en leur ajoutant 2 points sauf si la note est déjà supérieure ou
égale à 18.

* Solution L’exercice permet de modifier en bloc toutes les notes. La condition posée (sont exclues les
notes supérieures à 18) évite de voir des élèves dotés d’un 21/20, par exemple !
1. Créez une nouvelle requête.
2. Appelez la table « NOTE ».
3. Cliquez sur le bouton Mise à jour du ruban.
4. Faites glisser le champ « NOTATION » dans la première colonne.
5. Dans la zone Mise à jour, en bas d’écran, insérez la formule « [NOTATION]+2 ».
6. Dans la zone critères, saisissez « <18 ».
La syntaxe SQL de cette requête dont la représentation graphique est en figure 4.34 est :
UPDATE NOTE SET NOTATION = NOTATION+2 WHERE NOTATION<18; .

Figure 4.34
Requête mise à jour.
Exercices

Les requêtes 121


Access Livre Page 122 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 123 Mercredi, 27. f vrier 2008 7:28 07

Les formulaires
5
Chapitre

1. Les grands principes


Le formulaire constitue l’outil graphique essentiel
de fonctionnement ................. 124 pour la présentation des données stockées dans les
2. La manipulation des outils ..... 131
Problèmes et exercices
tables, leur modification ou l’insertion de nouvelles
1. Formulaire unique d’affichage données. Ce chapitre présente en premier lieu les
des élèves ............................. 151
2. Formulaire et sous-formulaire
grands principes de fonctionnement des formu-
des élèves et de leurs moyennes 155 laires, puis étudie tous les outils mis à disposition
3. Formulaire avec zone de liste
et réactualisation ................... 160 du programmeur pour manipuler les données,
quel que soit leur genre. L’objectif final consiste
à construire ex nihilo une interface complète
homme/machine permettant à un utilisateur
de manipuler ses données dans un contexte ergo-
nomique et sécurisé.

123
Access Livre Page 124 Mercredi, 27. f vrier 2008 7:28 07

(1) Les grands principes de fonctionnement


Avec Access 2007, la mise en œuvre d’un formulaire est devenue d’une extrême simplicité.
Nous commencerons par définir les éléments principaux constitutifs du « paysage » de ces
documents à partir de la base CODES_POSTAUX de la partie théorique du chapitre
précédent.
1. Ouvrez la base « CODES_POSTAUX » et sélectionnez la table « CODE_POSTAL »,
sans pour autant l’ouvrir.
2. Dans la barre de menu « Créer », cliquez sur l’icône Formulaire (et non pas création de
formulaire que nous utiliserons plus tard). Un formulaire est déjà créé, tel que montré
à la figure 5.1, et il se visualise immédiatement en mode formulaire, par opposition au
mode création grâce auquel on le modifie. Sa présentation, tout à fait correcte, est
susceptible d’amélioration.
D’une manière générale, il est préférable d’ouvrir les documents créés automatiquement,
et non démarrer d’un formulaire totalement vierge à partir du bouton du ruban Création
de formulaire.

Figure 5.1
Formulaire initial en
mode Formulaire.

Les différents éléments de ce simple affichage doivent être précisément énumérés afin que
les propriétés de l’objet formulaire soient bien comprises et retrouvées dans le dédale des
options possibles :
• En haut, dans l’onglet, le nom de l’objet (dont l’intitulé peut être modifié par la propriété
Légende) ;
• Au-dessous, une zone bleue, fixe, nommée En-tête de formulaire ;
• Au milieu, une zone blanche nommée Détail ;

124 Access® 2007 et VBA


Access Livre Page 125 Mercredi, 27. f vrier 2008 7:28 07

• En bas une deuxième et dernière zone fixe nommée Pied de formulaire, qui n’apparaît
pas ici ;
5
Chapitre

• À gauche, doté d’un petit triangle en haut, le Sélecteur, qui correspond à un enregis-
trement ;
• Tout en bas, les boutons de déplacement ;
• Dans le corps du formulaire, deux contrôles, qui sont plus précisément des zones de
texte ; chacune d’entre elles se compose d’une étiquette (qui restera fixe) et de la zone de
texte proprement dite (qui verra défiler le contenu des enregistrements).
Tous ces éléments, affichables ou non, peuvent changer de forme, de couleur et autres
caractéristiques. Cliquez dans le ruban sur le triangle situé sous le bouton Affichage et
passez en mode création 1 : vous observez la constitution même du document tel qu’il
apparaît à la figure 5.2.

Figure 5.2
Formulaire initial en
mode création.

1.1 CONVENTIONS DE NOMS

Avec la nouvelle présentation du volet de navigation d’Access 2007, le nom qui est attribué
au formulaire peut être différent de celui qui apparaît dans le volet de navigation et dif-
férent du nom qui apparaît dans l’onglet de la barre supérieure.
Afin de bien distinguer tous les éléments d’une base – requêtes, formulaires et macros – de
nombreux développeurs font précéder les formulaires d’un préfixe Frm_ ou Form_ ou
simplement F_. Cette syntaxe particulière, appliquée aussi avec les bases Access 2003 et
antérieures, s’avère bien utile lorsqu’on se sert de fonctions complexes comme les fonc-
tions de domaine (SomDom, RechDom, qui seront étudiées ultérieurement). C’est la
même convention qui prévaut pour les autres objets Req_ (pour les requêtes) et Mcr_
(pour les macros) : on s’efforcera de raccourcir au maximum le nom des objets et d’éviter
les espaces.
Dans la pratique, une convention de noms bien organisée emploie trois références :
• Le nom du formulaire proprement dit (préfixé par Frm_ par exemple), technique.
• Le nom qui apparaîtra dans le volet de navigation (correctement orthographié et clair
mais suffisamment court).
• Le nom de l’onglet supérieur (correctement orthographié et libre), renseigné par la
propriété Légende de la feuille de propriété du formulaire.

1. On peut aussi faire un clic droit dans le document et sélectionner Création.

Les formulaires 125


Access Livre Page 126 Mercredi, 27. f vrier 2008 7:28 07

Dès lors, nous ne cherchons pas tout de suite à monter un volet de navigation mais seule-
ment à enregistrer le nouveau formulaire qui vient d’être créé sous un nom conforme à la
convention :
1. Cliquez du bouton droit sur l’onglet « CODE_POSTAL » du formulaire en cours de
création.
2. Sélectionnez « Enregistrer ».
3. À la place de CODE_POSTAL (un nom identique au nom de la table source pourrait
amener à de graves confusions), saisissez « Frm_Codes » 1.
Désormais un nouvel objet apparaît dans le volet de navigation. S’il n’est pas visible, cliquez
sur le triangle supérieur du volet et sélectionnez « Tous les objets par Type d’objets ».

1.2 LES FEUILLES DE PROPRIÉTÉS

Ouvrez à nouveau le formulaire en mode création (sélection du formulaire dans le volet


de navigation, clic-droit, puis Mode création), cliquez du bouton droit dans le corps du
document (partie bleue en dessous de Pied de formulaire) et sélectionnez « Propriétés ». La
feuille de propriété apparaît telle qu’à la figure 5.3, qui montre toutes les propriétés de tous
les objets contenus dans le formulaire.

Figure 5.3
Feuille de
propriétés.

En haut à gauche, une zone de liste déroulante fait apparaître tous les objets du formu-
laire, qui portent tous un nom :
• le formulaire lui-même a sa feuille de propriété ;
• il existe deux zones de texte CODE et VILLE ;
• d’autres éléments encore ont leur feuille de propriété : les étiquettes, l’en-tête, etc.
Les onglets sous la zone de liste déroulante montrent, par catégorie, les différentes pro-
priétés car il en existe un grand nombre. Le dernier onglet « Toutes » liste toutes les
propriétés des onglets précédents. Contrairement à un préjugé, l’expérience montre qu’il
est plus rapide de retrouver une propriété par l’onglet « Toutes » qu’en cherchant parmi
les autres.
• L’onglet « Format » liste toutes les propriétés ayant trait à la présentation de l’objet
(taille, couleur, etc.).

1. Par défaut, l’onglet qui apparait dans la barre supérieure porte le nom du formulaire, mais il est toujours possible de nommer différemment
l’onglet en utilisant la propriété Légende du formulaire.

126 Access® 2007 et VBA


Access Livre Page 127 Mercredi, 27. f vrier 2008 7:28 07

• L’onglet « Données » regroupe les options relatives aux valeurs présentées dans l’objet
(source, droits de modification, etc.).
5
Chapitre

• L’onglet « Événement » contient les liens avec les macros ou le code Visual Basic à
exécuter, à l’occasion d’événements précis (sur clic, avant ou après mise à jour, etc.).
• L’onglet « Autres » rassemble toutes les propriétés non incluses dans les options précé-
dentes.

1.3 FORMULAIRE UNIQUE OU CONTINU

Dès la création d’un formulaire, l’un des aspects les plus importants à mettre en place
consiste à définir le mode d’affichage des données, soit en mode unique, soit en mode
continu.
1. Ouvrez la feuille des propriétés du formulaire.
2. Choisissez « Formulaire » dans la liste déroulante supérieure.
3. Descendez à la propriété Affichage par défaut.
4. Ouvrez la liste déroulante à droite de cette zone.
5. Sélectionnez « Formulaires continus ».
6. Fermez la feuille des propriétés et repassez en mode formulaire (bouton de gauche en
bas de la fenêtre).
L’affichage des données change (voir figure 5.4) : on lit les six premiers enregistrements
(sur 8 009) de la table et non plus un seul ; les données défilent avec les boutons de dépla-
cement en bas, les touches PgDn/PgUp du clavier ou la barre de défilement vertical à
droite de l’écran.

Figure 5.4
Affichage
du formulaire en
mode continu.

Les formulaires 127


Access Livre Page 128 Mercredi, 27. f vrier 2008 7:28 07

Au seul plan ergonomique, certaines règles doivent être respectées :


• si un enregistrement comporte de très nombreuses colonnes, il est toujours souhaitable
d’afficher les données en formulaire unique : le grand nombre de contrôles rend la
lecture difficile en mode continu ;
• en cas de formulaire servant à entrer de nouvelles données, le mode unique est préférable
au continu ;
• inversement, si le formulaire est destiné à un balayage visuel permanent et à des mani-
pulations de lecture/modification, le continu est à recommander.
Au plan technique, le choix induit les conséquences suivantes :
• un formulaire en mode unique n’a pas nécessairement besoin d’en-tête et de pied puis-
que tous les éléments sont inclus dans la même fenêtre (y compris un titre de fenêtre et
des zones de renseignements divers) ;
• un formulaire en mode continu implique toujours la présence d’un en-tête dans lequel
on insérera un titre et des en-têtes de colonnes (celles qui apparaissent dans le corps) ;
le pied de formulaire sert souvent à afficher des totaux.
Outre les modes continu et unique, un formulaire peut s’afficher :
• en mode feuille de données, auquel cas il ressemble à s’y méprendre à la présentation
d’une table ;
• en mode double affichage : cette nouvelle présentation est particulière à Access 2007.
Elle montre les données en deux fenêtres : l’une en formulaire et l’autre en feuille de
données ;
• en mode tableau ou graphique croisé dynamique ; on réservera ces présentations aux
données qui s’y prêtent : sauf de rares cas, il ne s’agit que de formulaires en lecture
seule.

1.4 FORMULAIRE D’AJOUT OU DE MODIFICATION

Dans le cadre de l’utilisation de formulaires pour contrôler la saisie ou la modification des


données par les futurs utilisateurs, il est vivement recommandé de spécifier des formulaires
différents pour la lecture, la création et la modification de données (sans parler des
suppressions, à traiter souvent à part).
La saisie de nouvelles données donne lieu, dans la plupart des cas, à la mise en place de
règles de gestion dans le formulaire pour contrôler au plus près la qualité des entrées.
Deux exemples pour illustrer ce propos :
• À la saisie d’un Relevé d’Identité Bancaire, il existe toujours un petit programme associé
qui vérifie le numéro de clé du RIB.
• À la saisie d’un nouveau client, il existe souvent des procédures pour vérifier que le
client n’existe pas déjà.
La présence de nombreuses règles de gestion pousse toujours un peu plus le programmeur
vers la solution d’une séparation entre le formulaire Ajout de données et le formulaire
d’affichage des données existantes. Pour citer un cas concret, la démarche fréquemment
utilisée sera la suivante :
a. l’utilisateur se trouve dans un formulaire de consultation ;

128 Access® 2007 et VBA


Access Livre Page 129 Mercredi, 27. f vrier 2008 7:28 07

b. il dispose d’une zone de liste déroulante qui montre, par exemple, tous les clients ;
c. il peut soit saisir le nom (la zone de liste affiche au fur et à mesure les données corres-
5
Chapitre

pondant aux caractères saisis), soit faire défiler la zone de liste ;


d. s’il ne trouve pas le client, il saisit son nom et valide ;
e. le programme ouvre une boîte message « Le client n’existe pas. Voulez-vous le
créer ? » ;
f. en répondant « Oui », l’utilisateur passe (sans le savoir parfois) d’un formulaire de
consultation à un formulaire de création.
Ces différents cas de figure se mettent en place dans la feuille de propriétés du formulaire,
et plus précisément dans l’onglet « Données » :
• La propriété du formulaire Entrée données, positionnée par défaut à Non, permet à
l’utilisateur soit de consulter, soit d’entrer des données. Si elle est positionnée à Oui, le
formulaire ne peut plus servir qu’à l’insertion.
• La propriété du formulaire Ajout autorisé, positionnée par défaut à Oui, permet à l’uti-
lisateur d’insérer de nouvelle données. Positionnée à Non, le formulaire ne peut plus
servir qu’à la lecture ou la modification.
• La propriété du formulaire Suppression autorisée, qui est par défaut à Oui, peut être
inversée.
• La propriété du formulaire Modification autorisée, qui est par défaut à Oui, peut être
inversée.
L’ensemble de ces propriétés permet de réaliser toutes les combinaisons possibles, depuis
la position la plus souple, celle par défaut, jusqu’à la plus rigide, avec par exemple, un seul
droit de lecture uniquement, sans insertion, ni modification, ni suppression.
Une bonne démarche du concepteur consiste donc, dès le début du projet, à dissocier tous
les formulaires entre ceux qui permettent de créer des données (et/ou en supprimer) et
ceux qui permettent de les visualiser (et/ou modifier). Dès la création du formulaire, les
premières propriétés définies concerneront le mode d’affichage (continu/unique) et le
mode de saisie (combinaison des propriétés listées ci-dessus).

1.5 LES SOURCES DE DONNÉES

Dans le cas du formulaire des codes postaux, la source des données est, directement, la
table CODE_POSTAL. Cette propriété se vérifie dans la zone Source de la feuille des
propriétés du formulaire.
Ce cas de figure est relativement rare : dans la plupart des cas, la source des données est
précisée différemment et, le plus souvent, résulte d’une requête car plusieurs tables sont
invoquées. La démarche la plus répandue passe par les étapes suivantes :
• création d’une requête qui appelle toutes les données qui seront nécessaires au formu-
laire, enregistrement de la requête ;
• création d’un formulaire dont la source de données est la requête créée précédemment.
Dans la pratique, il pourra donc exister, par exemple :
• une requête nommée Req_saisie_codes ;
• un formulaire nommé Frm_saisie_codes ;

Les formulaires 129


Access Livre Page 130 Mercredi, 27. f vrier 2008 7:28 07

• une requête nommée Req_modif_codes ;


• un formulaire nommé Frm_modif_codes.
Bien que cet agencement soit le plus répandu, il ne manque pas de poser des problèmes à
des niveaux informatiques d’un autre ordre :
• si la requête appelle de nombreuses données et que la base Access est utilisée en envi-
ronnement réseau multi-utilisateurs, la « remontée » des données depuis le serveur vers
le poste utilisateur va représenter un encombrement réseau non négligeable :
• le nombre d’enregistrements bloqués en raison de leur manipulation par un premier
utilisateur risque de poser des problèmes d’ergonomie et de temps de réponse.
Comme on le verra plus loin, il est tout à fait possible de ne pas citer de source de données
au niveau du formulaire, et de faire des appels « ciblés » à la base de données pour afficher
au moment le plus opportun l’information la plus précise.
1. Ouvrez le formulaire « Frm_codes » en mode création.
2. Affichez la feuille de propriétés du formulaire.
3. Dans l’onglet « Toutes », cliquez sur la première zone nommée Source.
4. À droite de la fenêtre apparaissent une zone de liste déroulante et un carré muni de
trois petits points.
La zone de liste déroulante ouverte montre toutes les sources de données directement dis-
ponibles, tables et requêtes. Si l’une d’entre elles est choisie, c’est l’ensemble des données
de cette source qui sera renvoyé à l’utilisateur.
Un clic sur la zone voisine démarre le générateur de requêtes et ouvre une fenêtre d’aver-
tissement.
1. Répondez « Oui » à la création d’une requête.
2. L’écran qui s’ouvre est très exactement celui des requêtes étudiées au chapitre 4.
3. Insérez les champs « CODE » et « VILLE » dans la requête.
4. Posez le critère « Comme "01*" » dans la colonne CODE (le formulaire ne présentera
plus que les villes du département de l’Ain).
5. Fermez la fenêtre de la requête et validez l’enregistrement de la requête SQL.
La propriété Source du formulaire n’est plus CODE_POSTAL (la totalité de la table des
codes), mais la requête : SELECT CODE, VILLE FROM CODE_POSTAL WHERE CODE Like
"01*";. Cette requête limitative réduit notablement le nombre de données à traiter. Passez
en mode formulaire pour voir le résultat.
En résumé, la propriété Source du formulaire varie entre :
• une table.
• une requête enregistrée comme telle.
• une requête insérée dans le formulaire dans sa propriété Source.
• ou bien rien du tout (les données seront appelées plus tard).

130 Access® 2007 et VBA


Access Livre Page 131 Mercredi, 27. f vrier 2008 7:28 07

(2) La manipulation des outils


5
Chapitre

Un formulaire est constitué de contrôles, chacun d’entre eux permettant de visualiser des
informations (contrôles de zones) ou de déclencher des actions (boutons). Tous consti-
tuent autant d’outils à la disposition du programmeur pour mettre en place une interface
homme/machine rigoureusement organisée. Nous étudions ci-après en détail tous les
contrôles utilisables.

2.1 LES CONTRÔLES DE FORMULAIRE

Quand un formulaire est ouvert en mode création, la barre de menu supérieure comporte
un onglet supplémentaire « Création » contenant toutes les icônes destinées à bâtir et
modifier le document ; sa partie centrale regroupe les contrôles de formulaire utilisables,
présentés à la figure 5.5.

Figure 5.5
Contrôles du ruban
de création de
formulaire.

Les contrôles de zones


Les contrôles zones de texte
Comme son nom l’indique, une zone de texte édite des caractères : ceux-ci peuvent défi-
ler, le cas échéant, si la longueur du texte excède celle de la zone. Si l’autorisation y est
accordée, les zones de texte permettent l’affichage, la modification ou la suppression.
Elles peuvent recevoir des caractères émis depuis le presse-papier (le résultat d’un coller)
ou bien faire l’objet d’un copier pour rééditer les données ailleurs.
Au plan de la présentation, les caractères peuvent être réglés comme dans un traitement de
texte (police, taille, gras, etc.). Toutefois, pour des raisons évidentes de confort graphique,
il est déconseillé de faire varier ces coordonnées d’une zone à une autre, d’un formulaire à
un autre. Il s’avère préférable de régler ces paramètres par défaut au début d’un nouveau
projet et de s’y tenir pour l’ensemble du logiciel créé. Dans les options d’Access (bouton
Office) :
• la page Feuille de données paramètre les valeurs par défaut pour la présentation des
feuilles ;
• la page Concepteur d’objets paramètre les valeurs par défaut dans la création des tables,
requêtes et formulaires.
La source des données qui vont s’afficher peut être :
• un champ parmi ceux qui sont renvoyés par la table ou la requête à la source du formu-
laire ;

Les formulaires 131


Access Livre Page 132 Mercredi, 27. f vrier 2008 7:28 07

• le résultat d’une formule faisant appel à des données externes au formulaire (du type
RechDom) ;
• le résultat d’une formule, de tout type, interne au formulaire.
Une zone de texte est soit liée à un enregistrement, soit indépendante de tout enregistre-
ment, mais elle ne peut pas, sauf formule particulière, être liée à un groupe d’enregistrement.
Voici un exemple d’utilisation d’une zone de texte :
1. Dans le menu « Créer », cliquez sur l’icône Création de formulaire : Access ouvre un
formulaire vierge nommé « Formulaire1 ».
2. Dans la barre d’icônes du menu « Création », cliquez sur Zone de texte.
3. Dessinez un rectangle en haut de page et relâchez la souris : le programme crée en
même temps une étiquette de zone de texte, à gauche, et la zone de texte proprement
dite. Si l’on déplace l’un des deux objets, l’autre « suit » ; mais il est possible de les
manipuler séparément en cliquant et glissant à partir de l’angle supérieur gauche de
l’un des deux objets.
4. Cliquez dans le libellé « Texte0 » de l’étiquette, et remplacez ce libellé par « Ceci est
une zone de texte ». Nécessairement, vous devrez déplacer l’étiquette pour laisser visible
la zone adjacente.
5. Cliquez du bouton droit sur l’étiquette et sélectionnez Propriétés (ou bien cliquez dans
la barre d’icône sur Feuille de propriétés).
6. Vous noterez que le nom de l’étiquette est « Etiquette1 » (attribué automatiquement
par Access), alors que la légende est le texte affiché en mode formulaire ; le cas
échéant, modifiez le nom de l’étiquette pour bien la distinguer des autres objets.
Attention ! Un nom de contrôle dans un formulaire est obligatoirement unique. Une
convention de nom judicieuse consiste à nommer les étiquettes en les préfixant par
« Eti_ » et en désignant ensuite le champ auquel elle se rattache (par exemple Eti_
Code).
7. Cliquez sur la zone de texte proprement dite en conservant la feuille de propriétés
ouverte : le nom du contrôle est « Texte0 » et la source n’est pas renseignée. Dans la
mesure où le formulaire lui-même n’a pas de source de données, aucun champ n’est
disponible. Vous pouvez, provisoirement, insérer la valeur 2 ou le mot « Bonjour »
dans le champ Source contrôle : ces valeurs sont affichées de manière statique dans le
formulaire.
8. Soit avec les boutons de la barre d’icône, soit avec les propriétés de la feuille, vous pou-
vez modifier la police, la taille et la couleur des caractères ; les caractéristiques du fond
de la zone et de ses bordures sont modifiables également. On prendra garde à permet-
tre une lecture correcte de tous les caractères du champ en tenant compte de sa longueur
maximale.
9. Cliquez du bouton droit sur l’onglet « Formulaire1 », en haut, puis sélectionnez
« Enregistrer ».
10. Nommez votre formulaire « Frm_Essais_Contrôles ».

132 Access® 2007 et VBA


Access Livre Page 133 Mercredi, 27. f vrier 2008 7:28 07

Un exemple de zone de texte est présenté à la figure 5.6.


5
Chapitre

Figure 5.6
Une zone de texte.

Les contrôles étiquettes


Les étiquettes ne peuvent pas invoquer une source de données, ce sont de simples libellés
qui serviront pour les titres, en-tête de colonnes et autres zones de texte fixe.
1. Dans le même formulaire d’essais, cliquez sur l’icône Etiquette et dessinez un rectangle
tout en haut de page.
2. Saisissez l’intitulé « Titre du formulaire » directement dans le rectangle.
Vous noterez qu’Access insère un message d’alerte à gauche : si l’on clique sur l’icône
jaune, Access informe que cette étiquette n’est liée à aucun contrôle (ce type de message
est nouveau avec Access 2007) : ce message n’a rien d’étonnant puisque l’étiquette est
effectivement isolée !

Les contrôles de zones de liste déroulante


Il ne faut pas confondre zone de liste (simple) qu’on verra plus loin et zone de liste dérou-
lante telle qu’elle est présentée à la figure 5.7. Cette dernière est d’abord destinée à contraindre
l’utilisateur à faire un choix unique. Le principe en est le suivant :
• lorsque la zone de liste déroulante est utilisée, elle est au départ vide de tout libellé ;
• l’utilisateur peut ouvrir la liste déroulante grâce au petit triangle situé à droite et sélec-
tionner une valeur parmi une liste provenant soit d’une liste de valeurs entrées par le
programmeur, soit d’une requête. Le choix ne peut être qu’unique. Le contrôle zone de
liste déroulante prend alors la valeur de l’occurrence choisie ;
• mais l’utilisateur peut aussi saisir un texte dans la zone à gauche du triangle : au fur et à
mesure de sa frappe, la fenêtre qui s’est ouverte présente toutes les occurrences qui se
rapprochent au mieux du texte entré. Encore une fois, le choix ne peut être qu’unique
parmi les items renvoyés par une liste de valeurs ou une requête.
• le contrôle peut être programmé pour n’accepter qu’une des occurrences de la liste (la
propriété du contrôle Limiter à liste est positionnée à Oui) ou bien accepter une valeur
nouvelle (la même propriété est à Non) et dans ce cas, le programmeur prévoit une pro-
cédure afin de poursuivre le traitement : enregistrement du nouvel item dans une table,
simple poursuite avec avertissement, etc.
Une zone de liste déroulante peut comporter plusieurs colonnes et s’ouvrir sur un nombre
d’items paramétrable ; certaines des colonnes peuvent être cachées (une colonne d’identi-
fiant en particulier) et le programmeur peut citer la colonne dont la valeur pourra être
stockée pour un usage ultérieur.

Les formulaires 133


Access Livre Page 134 Mercredi, 27. f vrier 2008 7:28 07

La zone de liste déroulante est un élément essentiel de la saisie guidée de l’utilisateur : plus
elle pourra être utilisée, plus le travail de l’opérateur en sera facilité et cadré.

Figure 5.7
Une zone de liste
déroulante ouverte.

Voici la liste des actions pour créer une liste déroulante de sélection des codes postaux
(voir figure 5.7).
1. Dans le formulaire d’essais, fermez le cas échéant, la feuille de propriétés.
2. Dans le ruban, cliquez sur l’icône Zone de liste déroulante, et tracez un rectangle dans
le formulaire.
3. Un assistant de création de zone de liste déroulante s’ouvre, proposant d’abord soit
d’utiliser comme source du contrôle une table ou une requête, soit d’insérer une liste
de valeurs fixe. choisissez la première option de table comme source et cliquez sur
« Suivant ».
4. Pointez la table « CODE_POSTAL » comme source du contrôle dans la deuxième
étape puis cliquez sur « Suivant ».
5. Dans la troisième étape, sélectionnez les deux champs « Code » et « Ville » et placez-
les dans le pavé de droite afin qu’ils apparaissent dans les champs affichés, puis cliquez
sur « Suivant ».
6. Ne demandez pas, dans l’étape suivante, de tri particulier des données : les codes postaux
sont déjà triés; cliquez sur « Suivant ».
7. Access propose, dans la cinquième étape, de cacher la clé de la table (les codes pos-
taux) ; dans le cas présent, cette proposition n’est pas adéquate car les codes postaux
sont indicatifs : décochez cette option.
8. Réglez la largeur des colonnes afin d’adapter la colonne CODE à la largeur constante
de 5 caractères et élargissez la colonne VILLE pour bien lire le libellé des communes.
9. La dernière étape consiste à opter pour une colonne qui servira de valeur de renvoi au
contrôle : sélectionnez la valeur par défaut « CODE » et cliquez sur « Terminer ».

134 Access® 2007 et VBA


Access Livre Page 135 Mercredi, 27. f vrier 2008 7:28 07

La zone de liste déroulante peut être testée : elle est parfaitement fonctionnelle. Cliquez du
bouton droit sur ce contrôle et consultez la liste des propriétés :
5
Chapitre

• Le nom du contrôle est Modifiable5, nom attribué par défaut : il peut être changé, par
exemple, par Choix_Code.
• La propriété Source est vide, ce qui est normal, alors que la propriété Contenu est :
SELECT [CODE_POSTAL].[CODE], [CODE_POSTAL].[VILLE] FROM CODE_POSTAL; .
Cette requête SQL se vérifie en cliquant sur les trois points à droite de la propriété. Elle
est modifiable par les mêmes moyens.
• La propriété Nombre de colonnes est à deux, correspondant au nombre de colonnes
choisi au moment de la création avec l’aide de l’assistant.
• La propriété Largeurs de colonnes est libellée en centimètres, chaque chiffre étant séparé
du suivant par un point-virgule.
• La propriété Colonne liée est fixée à 1, correspondant à la colonne CODE choisie précé-
demment.
• On notera pour finir que toutes les propriétés du type Événement sont vides : il n’y a pas
d’action programmée sur ce contrôle pour le moment.

Les contrôles de zones de liste


La démarche d’utilisation d’une zone de liste diffère de celle d’une liste déroulante. Dès
l’affichage du formulaire, à moins qu’une mise à jour ne soit nécessaire, la zone de liste est
déjà servie d’enregistrements en provenance d’une liste de valeurs ou d’une requête ; il
n’existe pas de triangle ouvrant la liste.
• Une ou des actions se déclenchent lors d’un clic ou un double-clic sur un élément de la liste.
• Le choix de plusieurs items dans la liste est possible, dès lors que le programmeur l’a
autorisé (propriété : Sélection multiple).
La zone de liste servira donc en priorité pour lancer des actions qui reprennent comme
paramètres les items choisis dans la liste. Un exemple illustrera cette utilisation : imagi-
nons que l’utilisateur ait à regrouper plusieurs bons de commandes pour lancer la factura-
tion correspondante. Si la liste des bons de commandes en attente de facturation est
présentée dans une zone de liste, l’utilisateur sélectionnera les bons adéquats et lancera un
programme qui fera le regroupement demandé.
Voici la mise en œuvre d’une zone de liste à sélection multiple :
1. Fermez, le cas échéant, la feuille de propriétés ouverte.
2. Le formulaire d’essais étant ouvert en mode création, cliquez dans le ruban sur l’icône
Zone de liste et dessinez un large rectangle.
3. Un nouvel assistant, destiné aux Zones de listes, s’ouvre : choisissez encore une fois
une table comme source des données (propriété Contenu du futur contrôle) et cliquez
sur « Suivant ».
4. Sélectionnez la table « CODE_POSTAL ».
5. Déplacez les deux champs « CODE » et « VILLE » dans le pavé de droite pour qu’ils
soient affichés.

Les formulaires 135


Access Livre Page 136 Mercredi, 27. f vrier 2008 7:28 07

6. N’utilisez pas de fonction de tri particulière.


7. Décochez l’option de non-affichage de la clé, comme dans l’exemple précédent, et
réglez les largeurs de colonnes.
8. Retenez le champ Code comme colonne liée et cliquez sur « Terminer ».
Le résultat s’affiche comme l’exemple de la figure 5.8.

Figure 5.8
Une zone de liste à
sélection multiple.

En passant en mode formulaire, vous constatez que la zone de liste est immédiatement
exploitable et affiche tout de suite les données. Les propriétés de cet objet, consultables en
mode création par un clic droit sur l’objet, sont très voisines de la zone de liste déroulante
mise en place précédemment. En revanche, une propriété supplémentaire, en bas de liste,
mérite une attention particulière : la propriété Sélection multiple, fixée par défaut à Aucun :
• cette première option signifie que l’utilisateur ne pourra choisir qu’un seul item de la
liste ;
• si l’option Simple est choisie, l’utilisateur pourra sélectionner plusieurs items (en gardant
le doigt sur Ctrl et en cliquant plusieurs lignes) ;
• si l’option Etendu est choisie, l’utilisateur pourra sélectionner plusieurs items avec les
touches Maj et Ø ou prendre toute la liste avec Ctrl + Ø.

Les contrôles de traits et rectangles


Ces deux outils permettent de dessiner des formes dans les formulaires. Quasi inutiles
dans les formulaires continus (la propriété Diviseur d’enregistrements crée déjà un trait
approprié), ils seront employés avec modération dans les formulaires uniques. En effet,
une trop grande surcharge de l’écran induit souvent une gêne visuelle de l’utilisateur.
1. Dans le ruban, cliquez sur le bouton « Rectangle ».
2. Dessinez un rectangle qui englobe les deux zones de listes précédemment faites.
3. Consultez, en mode formulaire, l’effet rendu.
4. Repassez en mode création et cliquez sur l’objet « Rectangle ».
5. Dans le ruban, à droite des boutons de création de contrôles, cliquez sur le bouton
« Epaisseur de ligne » et choisissez un trait plus épais.
6. En dessous, cliquez sur le bouton « Couleur du trait » et coloriez-le en rouge, par
exemple.
7. Vérifiez son aspect visuel.

136 Access® 2007 et VBA


Access Livre Page 137 Mercredi, 27. f vrier 2008 7:28 07

Les contrôles de déclenchement d’action


Le contrôle « Bouton de commande » sert exclusivement au déclenchement
5
Chapitre

d’actions générées soit sous forme de macros, soit sous forme de code VB (Visual Basic).
Un bouton peut être, sous sa forme standard, un simple carré ou rectangle doté soit d’un
libellé, soit d’une image bitmap. Mais il peut être aussi complètement transparent (une
action est générée, par exemple, par un simple clic sur une zone d’une image superposée)
ou partiellement transparent (seul un texte ou une icône se dégage du fond) ; cette der-
nière option est nouvelle avec Access 2007. La figure 5.9 montre de gauche à droite trois
présentations possibles des boutons :
• La première est dotée des propriétés Image : bitmap, Style fond : Standard.
• La deuxième est dotée des propriétés Image : aucune, Style fond : Standard, Légende :
Fermer formulaire.
• La troisième a les propriétés Image : bitmap, Style fond : Transparent.

Figure 5.9
Diverses
présentations des
boutons de
commande.

1. Dans le formulaire d’essais, fermez le cas échéant, la feuille de propriétés.


2. Cliquez sur l’icône Bouton et dessinez un carré en bas à droite d’écran.
3. L’assistant Bouton de commande d’Access affiche une étape 1 qui aide le program-
meur à atteindre son objectif : ici, nous allons créer un bouton destiné à fermer le
formulaire.
4. Dans le pavé de gauche des Catégories, choisissez « Opérations sur formulaire ».
5. Dans le pavé de droite des Actions, choisissez « Fermer un formulaire ».
6. Cliquez sur « Suivant ».
7. Dans la deuxième étape, conservez les options par défaut d’un bouton qui est sous
forme d’image avec « Sortir par la portière » et cliquez sur « Suivant ».
8. À la place du nom donné d’office par Access, mettez un nom explicite, « Sortie » par
exemple, et cliquez sur « Terminer ».
9. Le bouton est bien créé en bas du formulaire et il peut être testé.
10. Faites un clic droit sur ce bouton et sélectionnez « Propriétés ».
11. Atteignez la propriété SurClic (pour cela faites défiler un peu l’ascenseur) : elle est
dotée du libellé Macro incorporée.
12. Cliquez sur le carré, à droite, doté de trois points : vous accédez à une macro dont
nous verrons la signification plus loin. L’assistant Bouton de commande a non seu-
lement créé le bouton proprement dit, mais généré la macro de fermeture du
formulaire.
En lieu et place d’une macro incorporée, il serait possible d’écrire directement du code
Visual Basic pour effectuer la même opération. Cette nouvelle manière de travailler sera
privilégiée lorsque l’expérience sera acquise : le code Visual Basic s’exécute plus vite et plus
facilement que les macros.

Les formulaires 137


Access Livre Page 138 Mercredi, 27. f vrier 2008 7:28 07

Les autres contrôles


Les contrôles cadres d’objet dépendants
Le bouton Cadre d’objet dépendant permet de créer des zones dans lesquelles seront insé-
rés des objets dépendants d’enregistrements, tel que le montre la figure 5.10. L’exemple le
plus répandu est celui de la photo dans un fichier de personnes : le formulaire affiche en
même temps les coordonnées du contact et la photo de la personne correspondante. Cette
photo est stockée dans un champ OLE (Object Linking and Embedding)1. Mais plus géné-
ralement, l’objet dépendant peut être non seulement une image bitmap (ou autres
formats) mais aussi une grille Excel, un document Adobe Acrobat ou tout autre.

Figure 5.10
Formulaire avec
cadre d’objet
dépendant.

Ouvrez la table « ADRESSE » de la base de données « CODES_POSTAUX_FRANCE » ;


vous constatez qu’il existe un champ nommé PHOTO. Nous allons monter un nouveau
formulaire, de type continu, basé sur une requête qui va lier les tables ADRESSE et
CODE_POSTAL.
Créons tout d’abord la requête nécessaire :
1. Cliquez sur le menu « Créer » et l’icône Création de requête.
2. Ajoutez les deux tables « ADRESSE » et « CODE_POSTAL » (on notera que les
champs CODE sont déjà liés par une relation).
3. Insérez tous les champs des deux tables dans les colonnes de destination (choisissez-
les séparément plutôt que d’utiliser le caractère générique *).
4. Affichez les résultats pour tester la requête : vous constatez que le champ VILLE s’affiche
bien en regard de tous les codes postaux.
5. Enregistrez la requête sous le nom « Req_Annuaire ».
Fermez tous les objets ouverts et laissez en surbrillance la requête Req_Annuaire dans le
volet de navigation (sans pour autant l’ouvrir) ; nous créons maintenant le formulaire
continu en utilisant l’assistant.
1. Dans le menu « Créer », cliquez sur le bouton « Plusieurs éléments » parmi les boutons
de formulaires.
2. Le formulaire est créé immédiatement.
3. Enregistrez le nouveau formulaire sous le nom « Frm_Annuaire » (et non pas Req_
Annuaire comme Access l’a désigné par défaut).
Cette nouvelle grille-écran mérite quelques commentaires :
• les noms des colonnes présentées ne sont pas ceux des champs, mais ceux des légendes
qui y ont été ajoutées ;

1. Plus précisément, la table contient un lien vers un objet stocké sur un disque (et non pas l’objet lui-même).

138 Access® 2007 et VBA


Access Livre Page 139 Mercredi, 27. f vrier 2008 7:28 07

• la largeur de chaque colonne n’étant pas parfaitement adaptée, il est nécessaire de


manipuler la barre de défilement horizontale (en bas) pour visualiser l’ensemble des
données d’une ligne ;
5
Chapitre

• la hauteur de chaque ligne est assez importante, conditionnée par l’insertion du champ
PHOTO.
Par un clic du bouton droit sur le champ PHOTO, il peut être sélectionné l’option « Insérer
un objet » qui offrira à l’utilisateur le loisir de pointer une image stockée sur son disque 1 :
1. Cliquez du bouton droit sur le champ « PHOTO » d’un enregistrement quelconque.
2. Sélectionnez « Insérer un objet ».
3. Cliquez sur la case d’option À partir d’un fichier.
4. Pointez un fichier de votre choix : le résultat s’en affiche dans la zone.

Les contrôles cases à cocher


Dans la plupart des cas, les cases à cocher sont liées à des champs de tables du type Oui/
Non (booléen), mais elles peuvent également servir pour des programmes plus élaborés et
indépendants d’une table 2. De forme carrée, ils ne peuvent admettre que deux états, coché
ou non coché 3.
Dans le formulaire Frm_Annuaire qui a été créé dans le paragraphe précédent, il existe
une colonne « Membre le la famille » correspondant au champ nommé FAMILLE de type
booléen dans la table ADRESSE ; la création automatique du formulaire a généré une case
à cocher pour ce champ.
1. Ouvrez le formulaire « Frm_Annuaire » en mode création.
2. Faites un clic droit sur le contrôle « FAMILLE ».
3. Dans la feuille des propriétés, notez que la propriété Triple état est positionnée à Non
(par défaut) ; on pourra aussi regretter que la case à cocher ne puisse pas être réglée en
hauteur et largeur.

Les contrôles cases d’options et les groupes d’options


Il est rare qu’une case d’option, ronde par opposition à la case à cocher carrée, s’emploie
isolément : généralement, plusieurs cases d’options sont regroupées dans un groupe
d’options. Dans ce cas, chaque case d’option est exclusive des autres : si l’utilisateur clique
sur une case, les autres deviennent blanches. Le groupe d’options peut être lié à un champ
de table pour renvoyer une et une seule valeur parmi toutes celles des cases d’options
présentées à l’écran.
Reprenons le formulaire Frm_Essais_Contrôles pour créer trois cases d’options dans un
groupe :
1. En mode création, cliquez sur le bouton « Groupe d’options » du ruban (et non pas
sur case d’options).
2. Dessinez un rectangle dans le formulaire.

1. Dans le cas d’une utilisation en réseau de l’application Access, il faudra naturellement que les fichiers désignés soient accessibles par tous.
2. La valeur contenue dans la colonne de la table sera 0 (si la case n’est pas cochée) ou – 1 (si la case est cochée) : cette notation est spécifique à
Access.
3. Ils peuvent aussi comporter, sous condition, trois états : vide, coché, non coché.

Les formulaires 139


Access Livre Page 140 Mercredi, 27. f vrier 2008 7:28 07

3. L’assistant de création de Groupe d’options s’ouvre pour vous permettre de générer


autant d’options que nécessaire : saisissez trois noms d’étiquettes d’option tels que
« Choix1 », « Choix2 », « Choix3 » puis cliquez sur « Suivant ».
4. La deuxième étape permet de créer, le cas échéant, une option cochée par défaut.
5. La troisième étape donne la possibilité de renvoyer des valeurs (ou formules) corres-
pondant à chacune des options. Laissez les valeurs proposées.
6. La quatrième étape offre la latitude de prendre case à cocher ou case d’option ou bou-
ton bascule pour remplir le groupe d’options. Généralement ce sont les cases
d’options qui sont choisies.
7. Renseignez, dans la dernière étape, le nom du cadre avec le libellé, par exemple, « Faites
votre choix ».
8. Lors des tests, il sera possible de vérifier que chacun des choix est bien exclusif des
autres.
La vérification de la valeur renvoyée par le groupe d’option nous permettra d’aller plus
loin dans l’utilisation des contrôles créés jusqu’à maintenant :
1. Passez, le cas échéant, en mode création sur le formulaire Frm_Essais_Contrôles.
2. Affichez la feuille des propriétés du groupe d’option.
3. Le nom du groupe d’options a été fixé par défaut par Access à Cadre30 (ou un autre
numéro d’ordre) : modifiez-le par « MonGroupeOptions ».
4. Fermez la feuille des propriétés.
5. Cliquez sur le bouton « Zone de texte » et dessinez un nouveau contrôle voisin du
groupe d’options.
6. Dans la feuille de propriétés de cette zone de texte, positionnez-vous sur la propriété
Source contrôle et cliquez à droite sur le bouton aux points de suspension : Access
ouvre une fenêtre de générateur d’expression représenté à la figure 5.11.

Figure 5.11
Le générateur
d’expression
d’Access.

Le formulaire ouvert est représenté en haut à gauche, et tous les contrôles de ce formulaire
sont listés dans le pavé du milieu.
7. Dans le pavé central, sélectionnez le contrôle MonGroupeOptions.

140 Access® 2007 et VBA


Access Livre Page 141 Mercredi, 27. f vrier 2008 7:28 07

8. Double-cliquez dans le pavé de droite sur l’option <Valeur> : la formule [MonGroupeOp-


tions] (entre crochets) s’insère automatiquement.
5
Chapitre

9. Cliquez « OK ».
10. La propriété Source contrôle devient = [MonGroupeOptions] (le signe égal désignant
une formule est obligatoire).
11. Repassez en affichage formulaire
En cliquant sur les options du groupe d’option créé à l’origine, vous constatez que la
valeur renvoyée dans la zone de texte varie en même temps que les choix dans le groupe
voisin, sans nécessité de rafraîchissement de la grille-écran.

Les contrôles onglet


Les contrôles onglet sont difficilement utilisables avec des formulaire continus mais sont
particulièrement bien adaptés aux formulaires de type unique lorsqu’il existe un grand
nombre de données relatives à un seul enregistrement. Dans ce cas, il est judicieux de
décomposer les données en grandes catégories destinées à nommer les onglets.
Nous profiterons de l’utilisation des onglets pour découvrir de nouvelles manières de
créer un formulaire :
1. Fermez tous les objets éventuellement ouverts.
2. Dans le menu « Créer », cliquez sur le bouton « Création de formulaire » (pour obtenir
un formulaire vierge).
3. Cliquez dans le ruban sur Feuille de propriétés.
4. Ouvrez la zone de liste déroulante Source (flèche vers le bas) et sélectionnez la requête
Req_Annuaire : désormais le formulaire est basé sur les données renvoyées par la
requête.
5. Cliquez sur le bouton « Contrôle Onglet » et dessinez un large rectangle qui couvre
toute la surface disponible.
6. Deux onglets ont été créés d’emblée, nommés Page1 et Page2 1 ; cliquez sur le premier
onglet, puis en utilisant la propriété Nom, changez son nom en Coordonnées et changez
le second en Autres.
7. Fermez la feuille des propriétés et activez l’onglet « Coordonnées ».
8. Cliquez dans le ruban sur le bouton « Ajouter des champs existants » : la liste de tous
les champs rendus disponibles par la requête apparaît.
9. À l’aide de la touche Ctrl, sélectionnez simultanément les champs NOM, PRENOM,
ADRESSE1, ADRESSE2, CODE, VILLE.
10. Glissez ces 6 champs dans l’onglet actif (la disposition initiale est à parfaire).
11. Cliquez sur l’onglet « Autres » et reproduisez la même opération pour insérer les
champs PHOTO, FAMILLE et PJ.
12. Enregistrez ce nouveau formulaire « Frm_AnnuaireAOnglet ».
Le formulaire est prêt pour une visualisation : les deux onglets dissocient coordonnées et
autres champs pour un même enregistrement. Le déplacement d’un enregistrement à un
autre est assuré par les boutons de déplacement, en bas à gauche.

1. On peut ajouter de nouvelles pages avec le bouton du ruban « Insérer une page ».

Les formulaires 141


Access Livre Page 142 Mercredi, 27. f vrier 2008 7:28 07

Les contrôles d’objet graphique


À l’image d’Excel, Access permet de réaliser très aisément des graphiques. Afin d’illus-
trer ces capacités, nous tenterons de représenter graphiquement le nombre de codes
postaux par départements avec la même base de données.
Au départ, il est nécessaire de réaliser une requête qui calcule ce décompte :
1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».
2. Ajoutez la seule table « CODE_POSTAL ».
3. Dans la première colonne insérez l’expression : DPT : Gauche([CODE] ; 2).
4. Cliquez sur le bouton « ∑ Totaux » du ruban.
5. Sélectionnez l’opération Regroupement pour la première colonne.
6. Insérez le champ « CODE » dans la deuxième colonne et choisissez l’opération Compte.
7. Enregistrez la requête sous le nom « Req_Décompte_Codes ».
La requête, dont le code SQL est le suivant : SELECT Left([CODE],2) AS DPT,
Count(CODE_POSTAL.CODE) AS CompteDeCODE FROM CODE_POSTAL GROUP BY
Left([CODE],2); a la structure décrite sur la figure 5.12.

Figure 5.12
Requête de
décompte
des codes postaux
par département.

1. Créez un formulaire vierge en cliquant sur « Création de formulaire » dans le menu


« Créer ».
2. Cliquez sur le bouton « Insérer un graphique » dans le menu « Création ».
3. Dessinez un rectangle le plus large possible (le nombre de départements étant élevé).
4. L’assistant graphique demande, dans son étape 1, la source des données : sélectionnez
la requête « Req_Décompte_Codes ».
5. Dans la deuxième étape, déplacez les deux champs disponibles dans le pavé de droite
puis cliquez sur « Suivant ».
6. Choisissez le type de graphique en haut à gauche (histogramme non empilé), puis
cliquez sur « Suivant ».
7. La quatrième étape 1 permet de préciser les trois paramètres des données à poser sur
l’axe horizontal (ici les numéros de départements), des différentes séries (il n’y a
qu’une série à représenter) et des données (le nombre de bureaux distributeurs).

1. Peu claire, il faut bien l’admettre…

142 Access® 2007 et VBA


Access Livre Page 143 Mercredi, 27. f vrier 2008 7:28 07

Les paramètres étant bien choisis par défaut, on peut passer à l’étape suivante alors
qu’Access ne représente pas l’aperçu du graphique.
5
Chapitre

8. Renseignez le titre du tableau « Répartition des bureaux de poste » et optez pour


l’absence de légende puis cliquez sur « Terminer ».
9. Dans un premier temps, Access ne représente pas le graphique : il faut passer en mode
formulaire pour le consulter.
10. L’aspect graphique peut ne pas convenir à l’utilisateur : cliquez du bouton droit en
« Mode création » et sélectionnez « Objet graphique > Ouvrir ».
11. Le programme Microsoft Graph s’ouvre, commun à tous les produits de la gamme
Office. Il permet de modifier la forme du graphique.

Les contrôles Cadre d’objet indépendant et Image


Ces deux types de contrôles ont des fonctions qui se chevauchent : le Cadre d’objet indé-
pendant permet d’insérer dans un formulaire toutes sortes d’objets (y compris les images)
alors que le contrôle Image ne peut insérer que des objets de type image. Comme son nom
l’indique, l’objet indépendant n’est pas lié à un enregistrement de table, mais uniquement
à un fichier externe. La création des objets de ce type se rapproche beaucoup des objets
dépendants, déjà étudiés.

Les contrôles de liens hypertexte


Une zone de lien hypertexte peut être insérée dans un formulaire grâce à ce contrôle, mais
le lien est indépendant de toute donnée de la base ; il renvoie directement à toute source de
donnée, Web ou locale. On rappelle ici qu’il est possible de créer dans une table des
champs de type Lien Hypertexte. Quand le champ est affiché (en mode table, requête ou
formulaire), un simple clic sur le lien permet d’accéder aux données référencées. Un
exemple pour illustrer cette fonctionnalité : le fichier ADRESSE pourrait contenir un
champ SITE_WEB de type Lien Hypertexte qui permettrait d’accéder directement au site
web personnel de chaque personne citée.

Les contrôles Pièces jointes


La notion de pièce jointe est nouvelle avec Access 2007. Elle se rapproche beaucoup de la
notion bien connue dans les services de messagerie. Dans le formulaire Frm_Annuai-
reAOnglet, une zone de pièce jointe a déjà été créée 1.
1. Ouvrez à nouveau, si nécessaire, le formulaire en mode formulaire.
2. Un seul clic sur la zone de la pièce jointe fait apparaître, au-dessus, une série de trois
icônes dont le trombone. Un clic sur ce dernier permet d’ajouter ou de consulter des
pièces jointes, relatives à l’enregistrement en cours.
À n’en pas douter, cette nouvelle fonctionnalité est vouée à un franc succès pour l’avenir.

Les contrôles ActiveX


Les contrôles ActiveX sont des « utilitaires » complémentaires qui permettent de très
nombreux développements à l’intérieur même d’une application complète. Un bon nom-
bre d’entre eux nécessite l’insertion de code Visual Basic pour commander les paramètres
du contrôle, code que nous n’avons pas encore étudié. On se limitera donc à illustrer les
possibilités de ces contrôles en utilisant le très classique contrôle calendrier.

1. Pour qu’elle soit complètement fonctionnelle, le formulaire doit être enregistré au préalable.

Les formulaires 143


Access Livre Page 144 Mercredi, 27. f vrier 2008 7:28 07

1. Dans un formulaire vierge (ou un existant), en mode création, cliquez sur le bouton
« Contrôle ActiveX ».
2. Sélectionnez le « Contrôle Calendrier 12.0 » puis cliquez « OK ».
3. Un calendrier s’insère, en haut à gauche dans le formulaire ; on peut le déplacer et le
redimensionner.
L’avantage de ce calendrier réside dans le fait que, doté d’une ergonomie complète et
efficace, il renvoie une valeur de date conforme et réutilisable.

Les sous-formulaires
Les sous-formulaires, relativement complexes, constituent un élément essentiel de la palette
des outils d’Access. Fréquemment utilisés, ils s’avèrent bien souvent incontournables car
eux seuls permettent d’afficher des données en relation et stockées dans différentes tables. Il
existe bien un bouton, dans la barre d’icône, permettant de créer de toutes pièces un sous-
formulaire, mais cette méthode nous semble peu efficace et surtout peu pédagogique.
Nous avons vu dans le chapitre sur les modèles relationnels que l’architecture mettant en
relation trois tables, deux tables principales et une table intermédiaire, était fort courante.
La visualisation d’une telle architecture, via un formulaire, passe presque toujours par
l’utilisation d’un sous-formulaire.
Reprenons, pour illustrer cette présentation, l’exemple de la bibliothèque de prêts de
livres, dont le modèle simplifié est décrit à la figure 5.13.

Figure 5.13
Modèle relationnel
d’une bibliothèque
de prêt.

Dans le programme de gestion de la bibliothèque, il s’avérera indispensable de monter un


formulaire qui montre, adhérent par adhérent, tous les emprunts réalisés ou bien,
exemplaire par exemplaire, tous les emprunts en cours. Soit la vision s’opère à partir de
la table de gauche sur la table intermédiaire, soit à partir de la table de droite vers la même
table centrale.
Access gère très bien cette architecture en intégrant, dans l’assistant à la création de formu-
laire, un système détectant les organisations de ce type. Aussi, alors même que la conception
manuelle de sous-formulaires est assez ardue, sa mise en place par le système automatisé
s’effectue en quelques minutes pourvu que le modèle relationnel soit conforme aux
normes merisiennes.
1. Reprenez le premier exercice du chapitre 2 ou recréez les trois tables désignées
dans la figure 5.13 ; en fait seuls les champs ID_ADHERENT, NOM_ADHERENT,
ID_EMPRUNT, ID_EXEMPLAIRE, ISBN_LIVRE, DATE_EMPRUNT, RETOUR_
EMPRUNT seront utiles.
2. Renseignez trois noms d’adhérents dans la table « ADHERENT » : « Dupont »,
« Durand » et « Martin » par exemple (les ID sont numérotés 1, 2, 3 automatiquement).

144 Access® 2007 et VBA


Access Livre Page 145 Mercredi, 27. f vrier 2008 7:28 07

3. Renseignez cinq ISBN fictifs dans la table « EXEMPLAIRE » : « A », « B », « C », « D »,


« E » (les ID sont numérotés 1, 2, 3, 4, 5 automatiquement).
5
Chapitre

4. Renseignez une dizaine d’enregistrements dans la table « EMPRUNT » : la colonne


ID_EXEMPLAIRE comprendra des valeurs 1, 2, 3, 4, 5 (il y aura donc nécessairement
des doublons), la colonne ID_ADHERENT comprendra des valeurs 1, 2, 3 et les
colonnes de dates pourront contenir n’importe quelle valeur de date.
5. Enregistrez une requête qui appelle tous les champs des trois tables (sélectionnez
l’étoile de chaque table) et nommée « Req_Emprunt », représentée à la figure 5.14.

Figure 5.14
Requête
Req_Emprunt pour
sous-formulaire.

6. Dans le menu « Créer », cliquez sur l’icône Plus de Formulaires > Assistant formulaire ;
7. Ouvrez la zone de liste déroulante de l’assistant et désignez la requête Req_Emprunt
comme source des données ;
8. Déplacez, grâce au bouton doté de doubles chevrons, tous les champs dans le pavé de
droite puis cliquez « Suivant » ;
9. Immédiatement, Access reconnaît la structure de la demande et propose un choix
dans la fenêtre représentée à la figure 5.15.

Figure 5.15
Assistant pour la
création de sous-
formulaire.

Les formulaires 145


Access Livre Page 146 Mercredi, 27. f vrier 2008 7:28 07

Par défaut, Access propose de faire un formulaire avec sous-formulaire et demande dans
quel sens présenter les données :
• Si l’option Par ADHERENT est choisie, le formulaire principal permettra de faire défi-
ler les adhérents et de visualiser en dessous et simultanément dans un sous-formulaire
tous les emprunts faits par les adhérents pris individuellement.
• Si l’option Par EXEMPLAIRE est choisie, le formulaire principal permettra de faire
défiler les exemplaires et de visualiser en dessous et simultanément dans un sous-
formulaire tous les emprunts auxquels ils ont donné lieu, un par un.
• Si l’option Par EMPRUNT est choisie, on listera tous les emprunts en visualisant les
emprunteurs et exemplaires concernés.
On voit bien ici la puissance du système, dépendant essentiellement de la qualité du
modèle relationnel créé en amont.
10. Choisissez l’option Par ADHERENT et cliquez sur « Suivant ».
11. À l’étape suivante, choisissez l’option par défaut Feuille de données (pour le sous-
formulaire) et cliquez sur « Suivant ».
12. Choisissez le style de présentation qui vous convient le mieux (par défaut Office) et
cliquez sur « Suivant ».
13. Changez éventuellement le titre du formulaire en « ADHERENT », puis cliquez sur
« Terminer ».
La visualisation obtenue, sous réserve du choix de style de présentation, se présente
comme à la figure 5.16.

Figure 5.16
Formulaire
et sous-formulaire
imbriqué.

Les boutons de déplacements tout à fait en bas permettent de faire défiler les adhérents ;
ceux au-dessus, inclus dans le sous-formulaire, balayent la liste complète des emprunts
faits par l’adhérent indiqué en haut de formulaire.

146 Access® 2007 et VBA


Access Livre Page 147 Mercredi, 27. f vrier 2008 7:28 07

2.2 LES CALCULS ET LES AUTRES FONCTIONS DANS UN FORMULAIRE


5
Chapitre

Utilisation de fonctions traitant les données source du formulaire


Les contrôles Zone de texte supportent toutes les fonctions déjà vues dans l’utilisation du
langage SQL et d’autres encore. Deux voies s’offrent donc au développeur pour la mise au
point des formulaires :
• soit les calculs et présentations de données sont réalisés dans les requêtes à la source du
formulaire ;
• soit la requête à la source du formulaire ne livre que des données brutes et les calculs et
présentations sont faits dans le formulaire lui-même.
Un exemple réutilisant la table des codes postaux illustrera ce choix :
1. Fermez tous les onglets ouverts et mettez la table « CODE_POSTAL » en surbrillance
(sans l’ouvrir).
2. Dans le menu « Créer », cliquez sur l’icône Formulaire : le programme crée un formu-
laire de type unique (un enregistrement par page).
3. En mode création, modifiez le type de formulaire : dans la feuille de propriétés du for-
mulaire, mettez la propriété Affichage par défaut à Formulaires Continus (au lieu de
Formulaire Unique).
4. Nous voulons insérer une zone de texte affichant le seul numéro de département : tou-
jours en mode création, fermez la fenêtre des propriétés, cliquez sur le bouton « Zone
de texte » et dessinez un rectangle à droite du code (dans la zone bleue de droite).
5. Renommez l’étiquette du nouveau Contrôle Département.
6. Dans la feuille de propriétés du nouveau contrôle, renommez la zone de texte Dépar-
tement au lieu de Texte4.
7. Repérez le nom du contrôle contenant la valeur du code postal et situé dans la feuille
de propriété du contrôle : ce nom est CODE (celui hérité de la table).
8. Dans la feuille de propriétés du nouveau contrôle (sélectionnez Département dans la
liste déroulante de la fenêtre de propriété), entrez la formule : =Gauche([CODE];2)
dans la propriété Source Contrôle.
En mode formulaire, vous constatez que le nouveau contrôle à droite affiche bien le
numéro du département, soit les deux caractères de gauche du contrôle CODE affiché à
côté. Dans le cas présent, le formulaire utilise la valeur du contrôle CODE pour calculer la
valeur du contrôle Département. On aurait pu tout aussi bien créer une requête comme
source de ce formulaire et créer dans la requête une colonne contenant la même formule
qui aurait été appelée directement.
Les formules peuvent être beaucoup plus élaborées ; on se propose maintenant de créer
une nouvelle zone de texte qui affiche le mot PREFECTURE si c’est le cas, ou bien rien.
1. Créez une nouvelle zone de texte en dessous de Département en mode création.

Les formulaires 147


Access Livre Page 148 Mercredi, 27. f vrier 2008 7:28 07

2. Insérez la formule : =VraiFaux(Droite([CODE];3)="000";"PREFECTURE";"") dans


le nouveau contrôle 1.
3. Testez ce contrôle.
Il faut lire cette fonction, littéralement, de la manière suivante : si les trois derniers carac-
tères du code postal sont la chaîne 000, alors afficher le mot « PREFECTURE », sinon ne
rien afficher.
On retiendra les points suivants concernant la syntaxe :
• Le mot CODE est cerné de crochets pour indiquer un champ ou un contrôle de formu-
laire : il n’est pas indispensable de les saisir si le nom du champ est bien en un seul mot,
Access se charge d’ajouter les crochets.
• Les chaînes de caractères sont cernées par des guillemets ; un double guillemet consécutif
équivaut à une chaîne vide.
• Les arguments de la fonction sont séparés par des points-virgules ; ici, la structure de la
syntaxe est VraiFaux(<condition> ;<alors> ;<sinon>).
D’une manière plus générale, le générateur d’expression d’Access, présenté à la figure 5.17
et déjà abordé plus haut, est souvent utile. Ce générateur s’obtient en cliquant sur les trois
petits points à droite de Source contrôle dans la feuille des propriétés.

Figure 5.17
Fonctions intégrées
dans le générateur
d’expressions.

Dans la partie de gauche, le générateur montre d’abord les documents ouverts (et en pre-
mier lieu le formulaire en cours) puis un double-clic sur le signe + des tables montre
toutes les tables disponibles. Il en va de même pour les requêtes, formulaires et états.
Un double-clic sur les fonctions affiche, d’une part, d’éventuelles fonctions (code Visual
Basic) qui pourraient être insérées dans le formulaire en cours et, d’autre part, les Fonc-
tions Intégrées d’Access montrées à la figure 5.17. On trouve ici la liste exhaustive (dans le
pavé de droite) des fonctions reclassées par domaine (pavé du milieu).

1. On notera que cette syntaxe diffère suivant le programme Office : Excel utilise le mot-clé SI() alors qu’Access utilise VRAIFAUX(). Il en est
de même pour la fonction d’extraction de chaîne de caractères (EXTRACCHAINE() dans Access et STXT() dans Excel) et dans bien d’autres
fonctions. Seul le langage Visual Basic, commun aux deux produits, utilise la même syntaxe.

148 Access® 2007 et VBA


Access Livre Page 149 Mercredi, 27. f vrier 2008 7:28 07

Pour chaque élément pointé grâce au générateur d’expression, toutes les propriétés de
l’objet sont récupérables (et non pas seulement une valeur de renvoi). Si l’on clique sur
CODE_POSTAL dans le pavé de gauche et sur le contrôle CODE dans le pavé du milieu, la
5
Chapitre

liste de droite renvoie, par exemple, la valeur de la propriété Visible. Ainsi, l’affichage d’une
zone peut être conditionné par la visibilité d’une autre : ce n’est qu’une parmi les millions
des fonctionnalités qui peuvent être créées.
Il s’agit maintenant d’afficher en bas du même formulaire des codes postaux le compte des
codes de la table :
• Cliquez sur le bouton « Zone de texte » du ruban et dessinez un rectangle en bas de for-
mulaire, sous la barre nommée Pied de Formulaire : automatiquement, le pied de
formulaire jusqu’à maintenant inexistant est créé.
• Insérez la formule : =Compte([CODE]) dans la propriété Source contrôle de la nouvelle
zone.
Vous constatez qu’Access réalise bien le compte total de tous les codes contenus dans la
table. On aurait pu tout aussi bien insérer cette zone de totalisation dans l’en-tête de for-
mulaire, mais il aurait été mal venu de la placer dans le corps du formulaire, s’agissant
d’un formulaire continu.

Utilisation des fonctions de domaine


Dans les exemples précédents, les fonctions et opérations réalisées ne concernaient que le
formulaire en cours. Les fonctions de domaine ajoutent deux avantages majeurs : pouvoir
faire appel à des données étrangères aux documents en cours et insérer des conditions de
prise en compte.
Les principales fonctions de domaine disponibles sont détaillées ci-après.
La fonction RechDom() (DLookUp() en américain) permet de retrouver une valeur dans
une table sur la base de condition. Dans un premier exemple, nous cherchons à retrouver
directement le nom de la ville dont le code postal est 60000, cette table n’étant pas ouverte,
ni aucun formulaire associé.
1. Ouvrez un formulaire vierge en cliquant sur le bouton « Création de formulaire » (le
formulaire est vierge de tout contrôle et sans données source).
2. Créez une zone de texte.
3. Affectez à la propriété Source contrôle de la nouvelle zone la valeur :
=RechDom("[VILLE]";"CODE_POSTAL";"[CODE]='60000'")1.
4. Repassez en mode formulaire, le contrôle affiche effectivement la ville de Beauvais.
La syntaxe très particulière de cette fonction nécessite des explications :
• La structure globale de la fonction est RechDom(<Nom du champ recherché> ;<table
source> ;<condition>).
• Chaque argument est cité entre guillemets.
• Le champ VILLE est cerné par des crochets pour désigner un nom de champ ; l’utilisa-
tion des crochets est indispensable car Access ne « traduit » pas les noms de champs
cités entre guillemets (il les interprète comme des chaînes de caractères).

1. D’une certaine manière, cette requête équivaut à un SELECT VILLE FROM CODE_POSTAL WHERE CODE = ‘60000’ en langage SQL.

Les formulaires 149


Access Livre Page 150 Mercredi, 27. f vrier 2008 7:28 07

• La table CODE_POSTAL est citée entre guillemets, mais sans crochets.


• La condition est citée entre guillemets avec le nom de champ CODE cité entre crochets.
• La valeur 60000 est citée entre apostrophes car le champ CODE n’est pas numérique
mais alphabétique. Les apostrophes en lieu et place des guillemets sont indispensables 1.
La fonction CompteDom() compte les arguments cités en permettant éventuellement
d’insérer des conditions.
1. Créez une nouvelle zone de texte.
2. Affectez à la propriété Source contrôle de la nouvelle zone la valeur : =Cpte-
Dom("[CODE]";"CODE_POSTAL"). En mode formulaire, la zone renvoie le chiffre 8 009
correspondant au nombre de codes postaux stockés dans la table ; dans ce premier cas
de figure, la fonction ne comprend pas de condition.
3. Modifiez la formule en insérant une condition pour décompter le nombre de codes
postaux dont la ville est Paris. La formule devient : =CpteDom("[CODE]";"CODE_POS-
TAL";"[VILLE]='PARIS'"). En mode formulaire, on lit la valeur 29.
Une autre fonction largement utilisée est SomDom() qui additionne des valeurs conte-
nues dans des champs numériques et dont la syntaxe est similaire à celle de CpteDom().
Les autres fonctions de domaines sont répertoriées dans le générateur de fonctions sous la
catégorie Regroup.Domaine.

Résumé
Moyen central de visualisation des données, le formulaire peut prendre des formes multiples,
utilisant toute la palette des outils graphiques.
Un formulaire peut être unique ou continu pour présenter les données page par page ou
listées. Il peut gérer les droits des utilisateurs sur les données en acceptant un mode totale-
ment libre ou bien en réservant les opérations à la seule lecture, insertion ou modification.
Toutes ces propriétés sont composables entre elles.
La « boîte à outils » du formulaire inclut de nombreux types de contrôles qui utilisent des
graphismes variés pour présenter les données. Chacun des contrôles est doté d’une feuille
de propriétés destinée à paramétrer l’aspect graphique, la présentation des données et la
réaction du formulaire aux sollicitations de l’utilisateur. Les contrôles Zone de texte et
Etiquette servent essentiellement à présenter des données sous forme de caractères. Les
contrôles Zone de liste et Zone de liste déroulante donnent des choix visuels à l’utilisateur.
Les cases à cocher, cases d’options et boutons bascules sont une autre forme de présentation
des choix.
La source des données peut être précisée pour le formulaire lui-même via une requête ou
une table mais peut ne pas l’être. Les valeurs renvoyées par les différents contrôles seront
directement issues des requêtes source ou bien le résultat de calculs via des fonctions. Ces
dernières peuvent faire appel à la source de données en cours mais aussi à des domaines
étrangers au formulaire ouvert.

1. On verra plus loin que cette syntaxe pose des problèmes d’un autre ordre dans certains cas de figure. Les apostrophes (quotes simples
américaines) peuvent alors être remplacées par des doubles guillemets.

150 Access® 2007 et VBA


Access Livre Page 151 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
5
Chapitre

EXERCICE 1 FORMULAIRE UNIQUE D’AFFICHAGE DES ÉLÈVES

Tous les exercices sont basés sur les données contenues dans la base ECOLE_INTERNA-
TIONALE, ils visent, par degré de complexité croissant, à monter des formulaires utilisant
un bon nombre des outils détaillés dans le cours.

• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans la
table ELEVE ; les champs PAYS_ELEVE et SEXE_ELEVE sont à présenter sous forme de
zones de listes déroulantes, la première en extrayant toutes les nationalités comprises
dans la table, la deuxième en utilisant une simple liste de valeurs. Le formulaire doit être
en lecture seule ; insérez également un bouton pour fermer le formulaire et deux bou-
tons pour faire défiler les enregistrements ; retirez le sélecteur d’enregistrement et les
boutons de déplacements, devenus inutiles.

* Solution Création de la requête source et génération automatique du formulaire


Comme on l’a vu dans le cours, il est préférable de créer au préalable une requête plutôt
que d’utiliser directement la table comme source de données du formulaire.
1. Dans le menu « Créer », cliquez sur l’icône Création de requête.
2. Ajoutez la table « ELEVE ».
3. Sélectionnez tous les champs de la table (de préférence sans utiliser le caractère géné-
rique * ; il suffit de double-cliquer sur chaque champ, successivement, pour que celui-
ci s’insère à la suite du précédent).
4. Enregistrez la requête sous le nom « Req_élève ».
5. Dans le volet de navigation, sans l’ouvrir, mettez la requête en surbrillance.
6. Dans le menu « Créer », cliquer sur l’icône Formulaire.
7. Au premier jet, le formulaire se présente comme à la figure 5.18.

Figure 5.18
Première
présentation du
premier exercice.
Exercices

Les formulaires 151


Access Livre Page 152 Mercredi, 27. f vrier 2008 7:28 07

Mise en forme du formulaire généré automatiquement


Les défauts de présentation sont nombreux sur cette première mouture :
• Le titre du formulaire et le nom de l’onglet ne sont pas valides : ils sont hérités de la
requête source des données.
• Les étiquettes portent des noms techniques et non des libellés compréhensibles ; ceci est
dû au fait que les légendes n’étaient pas toutes servies dans la table initiale : il faudra les
corriger.
• La largeur des zones et la disposition générale ne sont pas bien adaptées.
• La zone PAYS_ELEVE est du type Zone de texte et non Zone de liste déroulante comme
demandé.
• La zone SEXE_ELEVE est déjà du type Zone de liste déroulante comme demandé dans
l’énoncé : ceci est dû au fait qu’une liste de valeurs existait déjà dans la table source. Elle
est donc correcte.
• Les boutons demandés ne sont pas présents.
• À gauche, le sélecteur d’enregistrements est inutile (s’agissant d’un formulaire de type
unique).
• En bas, les boutons de déplacements doivent être retirés.
• En bas, la barre de défilement horizontale est inutile.
• Le formulaire est en mode lecture/écriture.
Résolvons tous ces problèmes.
• Nom de l’objet, de l’onglet et du volet de navigation.
1. Enregistrez le formulaire sous le nom Frm_élève : ceci est le nom technique de l’objet
2. Afin d’avoir un nom d’onglet supérieur correct, dans la feuille de propriétés du for-
mulaire, servez la propriété Légende avec un libellé clair, du type Visualisation des
élèves.
3. Afin de préparer le volet de navigation à la création d’un menu complet, renommez
l’objet Frm_élève par Visualisation Elèves (le libellé est plus court pour permettre une
lecture complète dans la bande étroite du volet) : faites un clic droit sur l’objet dans le
volet de navigation et sélectionnez Renommer.
• Titre du formulaire.
1. En mode création, cliquez sur l’icône Feuille de propriétés.
2. Servez la propriété Légende de la zone de texte du titre par le libellé Visualisation des
élèves (à la place de Req_élève). Gardez la même police, mais passez sa taille à 28 et
mettez-la en gras.
• Libellé des étiquettes.
1. Cliquez directement sur les étiquettes de zones de texte en mode création et modifiez
tous les libellés. On insérera des items clairs et courts comme Nom, Prénom, Adresse,
Code postal et Ville.
2. L’étiquette ADRESSE2, pour la deuxième ligne d’adresse, ne sert à rien. Cliquez direc-
tement sur cette étiquette, supprimez tous les caractères : Access fait disparaître

152 Access® 2007 et VBA


Access Livre Page 153 Mercredi, 27. f vrier 2008 7:28 07

automatiquement sa bordure. Le code postal et la ville peuvent être alignés en même


temps : supprimez l’étiquette du code postal.
5
Chapitre

• Disposition des étiquettes.


1. Si vous tentez de modifier, par exemple, les largeurs des zones de texte, vous remar-
querez que cette modification entraîne le changement de largeur de toutes les zones de
la colonne. Ceci est dû au fait que le formulaire a été généré automatiquement et que,
par défaut, Access a assigné un mode tabulaire à l’ensemble.
2. Appuyez sur Ctrl + A, puis dans l’onglet Réorganiser (qui n’apparaît qu’en mode créa-
tion du formulaire en partie haute du ruban), cliquez sur l’icône Supprimer : les zones
de texte deviennent indépendantes les unes des autres.
3. Vous remarquerez qu’avec la souris vous pouvez sélectionner plusieurs zones simulta-
nément et les manipuler toutes ensemble pour les re-disposer.
4. Pour déplacer les zones de texte, les flèches directionnelles seront plus précises et
moins difficiles d’emploi que la souris. Les combinaisons de touches Maj + Ø, Maj +≠,
Maj + ¨, Maj + Æ règlent la hauteur et la largeur des zones.
5. Servez-vous du quadrillage pour aligner parfaitement les zones : si vous souhaitez une
haute précision dans la disposition, vous pouvez définir les propriétés Gauche, Haut,
Hauteur, Largeur des zones de texte en centimètres avec décimales dans la feuille de
propriétés.
Au final, et en simplifiant au maximum la présentation, on doit parvenir à une ébauche
similaire à celle de la figure 5.19.

Figure 5.19
Deuxième ébauche
du premier exercice
après mise en forme
des zones de texte.

Création de la zone de liste déroulante des nationalités


Il serait possible de créer de toutes pièces la zone de liste déroulante demandée, mais Access
permet aussi de transformer un contrôle d’un type à un autre :
1. En mode création, faites un clic droit sur le contrôle PAYS_ELEVE puis sélectionnez
« Remplacer Par > Zone de liste déroulante ».
2. La zone de liste déroulante est effective mais non paramétrée : elle n’affiche aucune
liste. Dans la propriété Contenu du contrôle (et non pas Source du contrôle), cliquez
sur le bouton à points de suspension.
Exercices

3. Affichez la table « ELEVE » et refermez la fenêtre des sources disponibles.


4. Insérez le champ « PAYS_ELEVE » dans la première colonne du bas.
5. Cliquez sur Feuille de propriétés dans le ruban (feuille de la requête et non du formu-
laire).

Les formulaires 153


Access Livre Page 154 Mercredi, 27. f vrier 2008 7:28 07

6. Positionnez la propriété Valeurs distinctes à Oui.


7. Refermez la feuille de propriétés ; la requête doit afficher dix enregistrements seule-
ment et son code SQL doit être SELECT DISTINCT ELEVE.PAYS_ELEVE FROM ELEVE;
(on affiche tous les pays contenus dans la table ELEVE, mais une seule fois).
8. Fermez la fenêtre de la requête et répondez « Oui » au message d’enregistrement.
9. La zone de liste déroulante est fonctionnelle.

Mode lecture seule du formulaire


1. En mode création, cliquez sur l’icône Feuille de propriétés.
2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire.
3. Positionnez les propriétés Entrée données, Ajout autorisé, Suppression autorisée, Modi-
fication autorisée à Non : le formulaire est entièrement « bridé ».

Bouton de commande de sortie du formulaire


1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande.
2. Dessinez un carré en bas à droite, de la taille d’un pavé du quadrillage.
3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Opéra-
tions sur formulaires > Fermer un formulaire ».
4. Laissez les options par défaut de la deuxième étape.
5. Nommez le bouton « Fermer » à la troisième étape (ne laissez pas le libellé automati-
que car le nom du bouton pourra être utilisé ultérieurement en code Visual Basic),
puis cliquez sur « Terminer ».

Boutons de commande de défilement du formulaire


1. Dans le ruban, en mode création, cliquez sur l’icône Bouton de commande.
2. Dessinez un carré en bas, de la taille d’un pavé du quadrillage.
3. Dans la première étape de l’assistant Bouton de commande, sélectionnez « Dépla-
cements entre enregistrements > Enregistrement suivant ».
4. Laissez les options par défaut de la deuxième étape.
5. Nommez le bouton « Suivant » à la troisième étape.
6. Refaites la même opération mais en prenant à la première étape les options « Dépla-
cements entre enregistrements > Enregistrement précédent ».
7. Testez les trois boutons de commande. Très normalement, Access renvoie un message
erreur lorsque l’utilisateur clique sur « Suivant » alors qu’on a atteint la fin de fichier
ou qu’il clique sur « Précédent » lorsque le pointeur est en début de fichier.

Suppression du sélecteur d’enregistrement, des boutons de déplacements système et


des barres de défilement
1. En mode création, cliquez sur l’icône Feuille de propriétés.

154 Access® 2007 et VBA


Access Livre Page 155 Mercredi, 27. f vrier 2008 7:28 07

2. Dans la zone de liste déroulante en haut à gauche, sélectionnez Formulaire.


3. Positionnez la propriété Afficher le sélecteur à Non.
5
Chapitre

4. Positionnez la propriété Boutons de déplacement à Non.


5. Positionnez la propriété Barres de défilement à Aucune.
Finalement, le formulaire a l’aspect de la figure 5.20, la zone de liste déroulante étant
ouverte.

Figure 5.20
Résultat du premier
exercice.

EXERCICE 2 FORMULAIRE ET SOUS-FORMULAIRE DES ÉLÈVES ET DE LEURS MOYENNES

• Énoncé Élaborez un formulaire de type unique qui affiche un par un les élèves contenus dans la
table ELEVE et simultanément leur moyenne dans chacune des matières. Le formulaire
montrera également la moyenne générale.

* Solution Assurément, cette problématique évoque immédiatement le besoin d’associer un formu-


laire principal, affichant l’identité de l’élève, et un sous-formulaire affichant les moyennes
correspondantes. Le procédé de construction automatique vu dans le cours ne pourra
malheureusement pas s’appliquer car la notion de regroupement et de moyenne appliquée
à la table NOTE empêche Access de repérer la structure en sous-formulaire. Il nous faut
donc :
• Créer une requête source de données du formulaire.
• Créer une requête source de données du sous-formulaire.
Exercices

• Créer un formulaire.
• Insérer un sous-formulaire dans le premier.

Les formulaires 155


Access Livre Page 156 Mercredi, 27. f vrier 2008 7:28 07

Création des requêtes


1. La première requête, nommée « Req1_Moyennes », contient le code SQL SELECT
ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE; (les seuls
numéro, nom et prénom des élèves suffisent). Elle a la structure de la figure 5.21.

Figure 5.21
Structure de la
première requête
Req1_Moyennes.

2. La deuxième requête, nommée « Req2_Moyennes », contient le code SQL SELECT


NOTE.ID_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNO-
TATION FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_MATIERE = NOTE.ID_
MATIERE GROUP BY NOTE.ID_ELEVE, MATIERE.NOM_MATIERE; . Elle a la structure de la
figure 5.22.

Figure 5.22
Structure de la
deuxième requête
Req2_Moyennes.

156 Access® 2007 et VBA


Access Livre Page 157 Mercredi, 27. f vrier 2008 7:28 07

Mise en œuvre du formulaire principal


1. Dans le volet de navigation, mettez la requête Req1_Moyennes en surbrillance.
5
Chapitre

2. Dans le ruban du menu « Créer », cliquez sur l’icône Formulaire.


3. Le formulaire est immédiatement créé en mode unique avec une large place vers le bas
pour insérer le sous-formulaire.
4. Enregistrez le formulaire sous le nom « Frm_Moyennes ».

Mise en œuvre du sous-formulaire


1. En mode création, positionnez la souris en bas du corps du formulaire, juste au-des-
sus de la barre libellée Pied de formulaire afin d’obtenir un pointeur en forme de flèche
Nord-Sud. Tirez vers le bas en vue d’agrandir le corps du formulaire.
2. Dans le ruban du menu « Créer », cliquez sur l’icône Sous-formulaire/Sous-état.
3. Dessinez un large rectangle dans la partie vide du corps de formulaire.
4. L’assistant sous-formulaire propose, dans une première étape, les deux différents
types de sources de données, requêtes/tables ou formulaires : gardez l’option de
requêtes prise par défaut.
5. Dans la deuxième étape, sélectionnez la requête Req2_Moyennes et déplacez les trois
champs disponibles dans le pavé des champs sélectionnés.
6. La troisième étape, représentée à la figure 5.23, consiste à établir le lien entre formu-
laire principal et sous-formulaire. Le texte affiché en bas est le plus clair : il propose
d’établir le lien sur le champ ID_ELEVE, ce qui est exact ; nous le vérifierons plus tard.
Cette étape est essentielle dans ce travail : sans elle, les affichages seraient fantaisistes et
difficilement vérifiables. Validez en cliquant sur « Suivant ».

Figure 5.23
Établissement du
lien entre formulaire
et sous-formulaire.
Exercices

7. Dans la dernière étape, renommez le sous-formulaire « Frm_Moyennes1 ».


8. Testez le formulaire : en faisant défiler les élèves, les moyennes par matière varient.
9. Vérifiez la relation entre les deux documents : dans le formulaire principal, cliquez
sur Feuille de propriétés, sélectionnez le sous-formulaire Frm_Moyennes1 : les

Les formulaires 157


Access Livre Page 158 Mercredi, 27. f vrier 2008 7:28 07

propriétés Champs Pères et Champs Fils sont bien toutes deux positionnées à ID_
ELEVE.
La présentation des résultats du sous-formulaire en mode feuille de données et non for-
mulaire n’est pas très heureuse : d’une part, on lit le numéro d’enregistrement de l’élève
(ce qui devient inutile dès lorsque le lien formulaire/sous-formulaire est vérifié et fonc-
tionnel) et, d’autre part, l’accès aux zones de listes déroulante des en-têtes de colonnes
renvoie des messages erreurs.
Nous suggérons donc de transformer le sous-formulaire en mode continu et affichage for-
mulaire, tout en faisant disparaître pour l’utilisateur la zone ID_ELEVE. Initialement, le
sous-formulaire a l’aspect représenté à la figure 5.24.

Figure 5.24
Sous-formulaire
avant modifications.

1. Positionnez la propriété Affichage par défaut du formulaire à Formulaires continus (à la


place de Feuille de données).
2. Sélectionnez les trois contrôles (CTRL + A) et désolidarisez-les en cliquant sur
« Supprimer » dans le menu « Réorganiser ».
3. Sélectionnez le seul contrôle ID_ELEVE et positionnez sa propriété Visible à Non.
4. Réduisez la taille du contrôle ID_ELEVE afin qu’il prenne le moins de place possible
en haut à gauche du formulaire.
5. Modifiez la propriété Couleur fond de l’en-tête de formulaire, si elle est noire, pour
qu’elle devienne blanche. Pour ce faire, cliquez sur le bouton à points de suspension
de la propriété et choisissez la couleur désirée.
6. Dans l’en-tête de formulaire, insérez deux nouvelles étiquettes Matière et Moyenne.
7. Dans le corps de formulaire, modifiez la propriété Format du contrôle MoyenneDe-
NOTATION par Fixe (au lieu d’aucune propriété).
8. Modifiez la propriété Décimales du contrôle Moyenne DeNOTATION en sélection-
nant 2 (au lieu d’aucune propriété) : la moyenne sera correctement présentée et non
plus avec un trop grand nombre de décimales.
9. Modifiez la propriété Aligner le texte du contrôle MoyenneDeNOTATION en sélec-
tionnant Droite (au lieu de Gauche).
10. Modifiez la propriété Afficher sélecteur du formulaire Frm_Moyennes1 en sélectionnant
Non.

158 Access® 2007 et VBA


Access Livre Page 159 Mercredi, 27. f vrier 2008 7:28 07

11. Modifiez la propriété Boutons de déplacements par Non.


12. Modifiez la propriété Barres de défilement par Aucune.
5
Chapitre

13. Insérez dans le Pied de formulaire une nouvelle zone de texte.


14. Modifiez l’étiquette par Moyenne générale.
15. Modifiez la propriété Source de données du nouveau contrôle par la formule :
=Moyenne([MoyenneDeNOTATION]).
16. Modifiez les propriétés Format, Décimales, Aligner le texte et Epaisseur police respec-
tivement par Fixe, 2, Droite et Gras.
17. Enregistrez le formulaire après ces modifications, afin qu’il ait l’aspect décrit à la
figure 5.25.

Figure 5.25
Sous-formulaire
après modifications.

Déplacez et redimensionnez les zones de texte et le sous-formulaire afin de disposer


l’ensemble de manière claire et harmonieuse. Les résultats, en mode création et en mode
formulaire apparaissent aux figures 5.26 et 5.27.

Figure 5.26
Formulaire du
deuxième exercice
en mode création.
Exercices

Les formulaires 159


Access Livre Page 160 Mercredi, 27. f vrier 2008 7:28 07

Figure 5.27
Formulaire du
deuxième exercice
en mode formulaire.

EXERCICE 3 FORMULAIRE AVEC ZONE DE LISTE ET RÉACTUALISATION

• Énoncé Élaborez un formulaire dépourvu de source de données ; une zone de liste déroulante
doit permettre d’afficher tous les élèves et d’en sélectionner un. Au moment du choix de
l’élève, l’utilisateur découvrira en dessous une zone de liste présentant les moyennes
de l’élève.

* Solution Cet exercice a le même objectif, apparemment, que le précédent : montrer la moyenne
d’un élève. Il en diffère pourtant profondément. D’une part, les outils zone de liste dérou-
lante et zone de liste ne sont pas les mêmes que les zones de texte et sous-formulaires uti-
lisés précédemment mais, d’autre part, l’accès aux données s’opère par des voies
totalement nouvelles. Dans l’exercice 2, l’utilisateur « remonte » du serveur de données la
totalité des informations, table des élèves et table des notes : cette manière de faire, parti-
culièrement lourde pour la charge réseau, n’est peut-être pas indispensable. Si l’utilisateur
n’a besoin de connaître les résultats que d’un seul élève, à quoi bon lui livrer la totalité des
données ?
Il sera nécessaire, pour cet exercice, d’utiliser une macro, pour la première fois, mais de
manière très limitée.

Création du formulaire et de la zone de liste déroulante


1. Fermez toutes les fenêtres éventuellement ouvertes.
2. Dans le menu « Créer », cliquez sur « Création de formulaire » (on obtient une grille
vierge, le formulaire étant dépourvu de toute source de données).
3. Enregistrez le formulaire sous le nom « Frm_Moyennes2 » avec pour légende Consul-
tation des résultats.
4. Dans le menu « Réorganiser », cliquez sur l’icône du ruban tout à fait à droite en bas
Afficher/masquer En-tête/Pied de formulaire.

160 Access® 2007 et VBA


Access Livre Page 161 Mercredi, 27. f vrier 2008 7:28 07

5. Insérez une étiquette de titre Consultation des résultats. Pour cela revenez au menu
« Création ».
5
Chapitre

6. Dans le menu « Création », cliquez sur le bouton « Zone de liste déroulante » et dessinez
un rectangle en haut du formulaire.
7. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Je
veux que la liste déroulante recherche les valeurs dans une table ou requête ».
8. À l’étape 2, choisissez la table « ELEVE ».
9. À l’étape 3, sélectionnez les trois champs « ID_ELEVE », « NOM_ELEVE » et
« PRENOM_ELEVE » et insérez-les parmi les champs sélectionnés du pavé de droite.
10. À l’étape 4 choisissez le champ « NOM_ELEVE » pour établir un tri croissant.
11. À l’étape 5, laissez cochée la case colonne clé cachée et adaptez les largeurs de colonnes.
12. À l’étape 6 (dernière), nommez le contrôle ELEVE en lieu et place de NOM_ELEVE.
13. Modifiez la propriété Nom du contrôle par Choix_Eleve (au lieu de Modifiable0). Ce
point est important car ce nom servira ultérieurement.
14. Testez le contrôle : il doit afficher les noms et prénoms de tous les élèves, sans les ID (la
propriété Largeurs de colonnes du contrôle Zone de liste déroulante doit être à
<0cm;3,5cm;2,5cm>). Le formulaire doit avoir l’aspect de la figure 5.28.

Figure 5.28
Formulaire du
troisième exercice
avec la seule zone
de liste déroulante.

Dans les propriétés de cette zone de liste déroulante, on notera les points suivants :
• Le contenu du contrôle est une requête SQL dont le code est SELECT ELEVE.ID_ELEVE,
ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE FROM ELEVE ORDER BY ELEVE.NOM_ELEVE; .
Exercices

À l’ouverture du formulaire, en conséquence, l’utilisateur ne génère aucune requête (ni


donc de trafic réseau) ; à l’ouverture de la zone de liste déroulante, il lance une requête
qui vise non pas la totalité de la table ELEVE, mais les seules données dont il a besoin.
Il réduit par là le trafic réseau généré.

Les formulaires 161


Access Livre Page 162 Mercredi, 27. f vrier 2008 7:28 07

• La propriété Colonne liée est fixée à 1, qui désigne la première colonne, non visible, de
l’ID de l’élève. Quand l’utilisateur choisit un élève, le contrôle prend dès lors la valeur
du numéro de l’élève désigné. Cette propriété nous sera utile.
• La propriété Limiter à liste est positionnée à Oui : l’utilisateur ne peut pas entrer un
nom qui n’existerait pas dans la liste.
• La propriété Source de données est vide ; en d’autres termes, le contrôle n’est lié à
aucune source de données indiquée dans le formulaire.

Création de la zone de liste


La zone de liste doit faire apparaître les moyennes des élèves : nous savons déjà comment
créer une requête propre à effectuer ce calcul ; en revanche, il sera nécessaire, ici, d’ajouter
une condition pour faire en sorte que les moyennes affichées correspondent à l’élève choisi
dans la zone de liste déroulante supérieure.
1. En mode création, cliquez dans le ruban du menu « Création » sur le bouton « Zone de
liste » puis dessinez un large rectangle sous la zone de liste déroulante déjà mise en place.
2. À l’étape 1 de l’assistant Zone de liste déroulante, conservez l’option par défaut « Je
veux que la liste déroulante recherche les valeurs dans une table ou requête ».
3. À l’étape 2, choisissez la table « NOTE » comme source des données : nous savons fort
bien que cette table fournit l’intégralité des notes et non les moyennes, nous corrigerons
ce point ultérieurement.
4. À l’étape 3, pointez les champs « ID_ELEVE », « ID_MATIERE » et « NOTATION », puis
insérez-les dans le pavé des champs sélectionnés. Nous savons qu’il manque ici le
libellé de la matière (qui se trouve dans une autre table), nous corrigerons ce point
ultérieurement.
5. Négligez l’étape suivante qui permet de préciser d’éventuels tris.
6. À l’étape 5, maintenez la colonne clé cachée et les largeurs de colonnes définies par
défaut.
7. Nommez à l’étape 6 l’étiquette du contrôle « Moyennes » puis cliquez sur « Terminer ».
8. Dans la feuille de propriété du contrôle qui vient d’être créé, modifiez la propriété
Nom par Moyennes (et non Liste5).
À ce stade d’avancement, le formulaire peut être visualisé ; on y constate que les deux
contrôles sont fonctionnels, mais totalement indépendants l’un de l’autre : le premier
montre tous les élèves mais un choix dans la liste n’a aucun effet particulier ; le second
montre la liste intégrale de toutes les notes, tous élèves confondus.
1. Dans la feuille de propriétés du contrôle Moyennes, accédez à la requête de la propriété
Contenu en cliquant sur le bouton aux trois points de suspension.
2. Ajoutez tout d’abord la table « MATIERE » manquante, grâce à l’icône Afficher table.
3. Supprimez la colonne « ID_MATIERE » inutile, ainsi que la colonne « ID_NOTE ».
4. Ajoutez le champ « NOM_MATIERE » avant la colonne NOTATION.
5. Cliquez sur le bouton « ∑ Totaux » pour faire apparaître la notion d’opération
dans la requête et modifier l’Opération de la colonne NOTATION en Moyenne. Si
on veut produire des moyennes avec un arrondi à la deuxième décimale, on peut
affecter la zone Opération avec la valeur Expression (à la place de moyenne) et mettre

162 Access® 2007 et VBA


Access Livre Page 163 Mercredi, 27. f vrier 2008 7:28 07

l’expression suivante dans la zone Champ : « MoyenneDeNOTATION:Round-


((Moyenne(NOTE.NOTATION));2) ».
5
Chapitre

6. Faites un clic droit sur la colonne NOTATION et sélectionnez Propriétés : la propriété


Format de la colonne doit être mise à Fixe et la propriété Décimales à 2.
7. Testez la requête : elle doit renvoyer toutes les moyennes, élève par élève, ventilées par
matières.
8. Dans la ligne Critères de la colonne ID_ELEVE, insérez la formule : [Formulai-
res]![Frm_Moyennes2]![Choix_Eleve] . Cette formule permet de préciser dans la
requête la valeur de l’ID_ELEVE dont on veut afficher les moyennes. Elle est compo-
sée de trois parties séparées par des points d’exclamation et de la forme : [Formulai-
res]![Nom_du_formulaire]![Nom_du_contrôle].
9. Le code SQL de la requête doit être, au final, SELECT NOTE.ID_ELEVE, MATIERE.NOM_
MATIERE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN
[NOTE] ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE GROUP BY NOTE.ID_ELEVE,
MATIERE.NOM_MATIERE HAVING (((NOTE.ID_ELEVE)=[Formulaires]![Frm_
Moyennes2]![Choix_Eleve]));.
La structure graphique doit être similaire à la figure 5.29. La requête ainsi générée par
l’interface peut être sauvegardée et fermée pour revenir au formulaire.

Figure 5.29
Requête de la zone
de liste du troisième
exercice.

Nouveau point sur le fonctionnement général du formulaire : apparemment le résultat est


correct au premier affichage (si un élève était au préalable sélectionné). Malheureusement,
le choix d’un autre élève ne provoque aucun changement dans la zone Moyennes en des-
sous. Pire, si le formulaire est fermé puis réouvert, le choix d’un élève laisse la zone
Moyennes complètement vierge !
Cette imperfection provient du déroulement des faits suivants :
• À l’ouverture du formulaire, le contrôle Choix_Eleve ne comporte pas de valeur (aucun
Exercices

élève n’est sélectionné).


• Simultanément, la requête du contrôle Moyennes est lancée : elle ne renvoie aucun
enregistrement puisque la référence au contrôle Choix_Eleve est vide.
• Au moment du choix d’un élève, la valeur du contrôle Choix_Eleve devient valide.

Les formulaires 163


Access Livre Page 164 Mercredi, 27. f vrier 2008 7:28 07

• En revanche, la requête qui détermine le contrôle Moyennes ayant déjà eu lieu, elle n’est
pas relancée.
Il ne manque donc plus qu’à monter un mécanisme pour relancer la requête à la source
des données du contrôle Moyennes chaque fois que la zone de liste déroulante est mise à
jour. Ce mécanisme doit s’associer à la zone de liste déroulante Choix_Eleve.
1. Sélectionnez la propriété Après MAJ du contrôle Choix_Eleve.
2. Cliquez sur le bouton aux trois points de suspension.
3. Choisissez « Générateur de Macros » et validez par « OK ».
4. À la première ligne, ouvrez la zone de liste déroulante et sélectionnez Actualiser.
5. En bas, dans la zone Nom du contrôle, saisissez « Moyennes ».
Le résultat doit être conforme à la figure 5.30.

Figure 5.30
Macro incorporée
du troisième
exercice.

6. Fermez et enregistrez la macro.


7. Testez le formulaire après l’avoir fermé puis réouvert : au départ, les deux contrôles
doivent être vierges ; lors du choix d’un élève, les moyennes apparaissent.

Finition du formulaire
1. La propriété Nombre de colonnes du contrôle Moyennes est fixé à 3.
2. La propriété Largeurs de colonnes du contrôle Moyennes est fixée à
<0cm;3,505cm;0,501cm> 1.

1. Vous aurez peut-être noté que, bien que la requête fixe explicitement le format des chiffres à deux décimales, la zone de liste subséquente ne
tient pas compte de cette propriété. Il s’agit d’une erreur de programmation d’Access : le format des données dans les colonnes de la zone de
liste ne sont pas déterminables. Nous utilisons donc ici la largeur de colonne comme subterfuge pour cacher le grand nombre de décimales des
résultats.

164 Access® 2007 et VBA


Access Livre Page 165 Mercredi, 27. f vrier 2008 7:28 07

3. La propriété Largeur du contrôle Moyennes est fixée à 4 cm.


La grille finale aura un aspect similaire à celui représenté à la figure 5.31.
5
Chapitre

Figure 5.31
Résultat final du
troisième exercice.

Exercices

Les formulaires 165


Access Livre Page 166 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 167 Mercredi, 27. f vrier 2008 7:28 07

Les états
6
Chapitre

1. Fonctionnement automatisé .... 168


Il est toujours possible d’imprimer des formulaires.
2. Conception d’états, notion Mais là n’est pas leur destination première.
de regroupement ................... 170
Problèmes et exercices
Les formulaires sont conçus pour la visualisation
1. État des notes des élèves ........ 174 des données, non leur impression. Access dispose
pour ce type d’édition d’une option spécifique,
dotée d’outils particuliers, les états. Le program-
meur ne doit pas négliger cet aspect fondamental
des états imprimés lors de la mise en œuvre
d’une application : même si la dématérialisation
des documents devient de plus en plus courante,
les impressions conservent une force probante.

167
Access Livre Page 168 Mercredi, 27. f vrier 2008 7:28 07

(1) Fonctionnement automatisé


À l’image des formulaires, les états utilisent les mêmes sources de données : tables directes
ou requêtes. Comme pour les formulaires, il sera préférable de monter des requêtes spéci-
fiques à chaque état plutôt que d’utiliser les tables directement. En revanche, et à l’inverse
des formulaires, un état nécessite impérativement des données dès l’ouverture de l’état : il
n’est pas possible de faire intervenir des contrôles tels que les zones de liste.
Pour un premier essai, nous utiliserons les automatismes d’Access afin de tester les fonction-
nalités du programme :
1. Ouvrez la base de données des « Codes Postaux ».
2. Dans le volet de navigation, mettez la table « CODE_POSTAL » en surbrillance.
3. Dans le menu « Créer », cliquez sur l’icône Etat.
4. Le programme construit un état.
Le document est présenté avec les standards de toute impression : en haut à droite appa-
raissent la date et l’heure de l’impression. Il est visualisable comme un formulaire, mais
non pas comme une impression.
1. Cliquez sur le triangle en bas de l’icône Affichage.
2. Sélectionnez l’option Aperçu avant impression.
3. Le document apparaît tel qu’il sera imprimé, avec le montage des pages prévu (Access
ne calcule pas immédiatement le nombre de pages à imprimer, ici 217).
4. Chaque page reprend l’intitulé des colonnes afin de rendre l’état compréhensible,
quelle que soit la page.
5. La visualisation se fait sur une page et une seule : l’aperçu est donc différent de celui de
Word ou Excel, qui regroupent l’état en un seul document.
6. Une nouvelle barre d’icône supérieure permet de régler les paramètres d’impression
(voir figure 6.1).

Figure 6.1
Menu de l’aperçu
avant impression.

Les boutons Taille, Portrait, Paysage et Marges sont des raccourcis du bouton Mise en page
qui détaille précisément chacun de ces paramètres.
• Les marges sont exprimées en millimètres. Il est maladroit de chercher à réduire exces-
sivement les marges : outre des messages erreurs systématiques, l’impression est condi-
tionnée de toute façon par les capacités de l’imprimante. Afin de s’adapter à toutes les
imprimantes du marché, il est plus judicieux de ne pas descendre en deçà de 5 mm.
• L’orientation dépendra du format des tableaux à présenter : tous les calculs d’impres-
sion se font sur la base du papier généralement utilisé : en Europe, il s’agit du format A4
alors qu’aux États-Unis le format Lettre US est le standard (réglages à préciser dans les
Paramètres Régionaux du panneau de configuration Windows).
• En vue d’économiser du papier, il est possible de multiplier les colonnes. Dans le cas
présent, le nombre de colonnes est fixé à 1 mais dans la mesure où les seules données à

168 Access® 2007 et VBA


Access Livre Page 169 Mercredi, 27. f vrier 2008 7:28 07

imprimer occupent peu de place en largeur, ce chiffre peut être monté à 2, réduisant de
moitié le nombre de feuilles nécessaires ! 1.
6
Chapitre

Sans même disposer d’Adobe Acrobat Writer, il est possible, avec la version 2007 d’Access,
d’imprimer vers un fichier PDF. Il est nécessaire toutefois de télécharger un complément
Microsoft en accédant au site www.microsoft.com/downloads/Search.aspx?display-
lang=fr dans la famille des produits Office (voir figure 6.2).

Figure 6.2
Téléchargement
du complément
Microsoft Office
2007.

Nativement, Access peut exporter les impressions vers Word (fichier RTF) ou vers un
fichier XML ou HTML.
1. Fermez l’Aperçu avant impression.
2. Revenez au menu Format de l’état. Dans la partie droite du ruban, Access propose des
mises en forme automatiques comme le montre la figure 6.3.

Figure 6.3
Options de mise en
forme automatique.

La mise en forme automatique peut être accompagnée de mises en forme conditionnelles,


particulièrement utiles dans certains cas :
1. Cliquez sur le bouton « Mise en forme conditionnelle ».
2. Dans le pavé Condition 1 de la mise en forme conditionnelle, cliquez dans la zone de
liste déroulante et sélectionnez Expression.
3. Dans la zone de l’expression insérez la formule : Droite([CODE];3)="000".
4. Cliquez sur le bouton « Gras » et la police de caractère coloriée en rouge, par exemple.
Grâce à cette mise en forme, toutes les préfectures seront imprimées en rouge et en gras
alors que les autres bureaux distributeurs resteront en police normale.

1. Un réglage de la largeur des zones à imprimer est à réaliser manuellement suivant des modalités que nous verrons plus loin.

Les états 169


Access Livre Page 170 Mercredi, 27. f vrier 2008 7:28 07

(2) Conception d’états, notion de regroupement


Comme pour les formulaires, et à moins de particularités, il est plus rapide de générer
automatiquement un état et de le modifier que de partir d’une matrice vierge. Afin d’illus-
trer la fonction de regroupement et d’étudier la conception des états, nous envisagerons
d’imprimer un document qui fournit la liste des bureaux distributeurs, département par
département.
Commençons par créer la requête à la source de l’état :
1. Créez une requête appelant la table « CODES_POSTAUX ».
2. Insérez les champs « CODE » et « VILLE ».
3. Ajoutez une troisième colonne nommée « DEPARTEMENT » dont la formule est
Gauche([CODE];2).
4. Ajoutez le critère suivant à la colonne DEPARTEMENT : « Comme[Indiquez un
numéro de département ou tapez *] ».
La requête, dont le code SQL est SELECT CODES_POSTAUX.CODE, CODES_POSTAUX.VILLE,
Left([CODE],2) AS DEPARTEMENT FROM CODES_POSTAUX WHERE (((Left([CODE],2))
Like [Indiquez un numéro de département ou tapez *])); aura la structure graphi-
que de la figure 6.4.

Figure 6.4
Requête paramétrée
des codes postaux
par département.

Rappel : la citation entre crochets dans la zone des critères génère une requête dite para-
métrée qui ouvre une boîte de dialogue destinée à l’utilisateur. Le mot-clé « Comme »
placé avant la citation entre crochets permet de faire intervenir le « joker » « * » pour
montrer tous les départements.
5. Enregistrez la requête sous le nom « Req_Codes_Dpts ».
6. Fermez la requête tout en la laissant en surbrillance dans le volet de navigation.
7. Dans le menu « Créer », cliquez sur l’icône Etat : le message de demande du département
apparaît, appuyez sur la touche *.
8. Le nouveau document est immédiatement généré.
Cette impression n’est pas satisfaisante : on souhaite un état qui s’interrompe à chaque
département, imprime un compte du nombre de bureaux distributeurs et n’imprime pas
la troisième colonne. On veut en outre que, pour chaque département, les enregistrements
soient triés par ordre alphabétique de ville.

170 Access® 2007 et VBA


Access Livre Page 171 Mercredi, 27. f vrier 2008 7:28 07

9. Cliquez sur l’icône Affichage en haut à gauche et sélectionnez le « Mode Création » ; le


document apparaît tel qu’à la figure 6.5.
6
Chapitre

Figure 6.5
État en mode
création.

Le dessin général de l’état en mode création ressemble beaucoup à celui des formulaires.
On y retrouve les En-tête et Pied déjà vus, auxquels s’ajoutent ici un En-tête de page et un
Pied de page. Ces deux derniers éléments contiennent les libellés (ou formules ou don-
nées) qui se répètent à chaque page imprimée ; dans le cas présent, les libellés CODE,
VILLE et DEPARTEMENT sont inclus dans l’en-tête de page alors que le pied de page
comprend une formule destinée à la pagination (sous la forme Page X sur Y pages). L’en-
tête d’état, enfin, contient une formule destinée à imprimer la date et l’heure en cours.
1. Cliquez sur le bouton « Regrouper et Trier » du ruban : une fenêtre s’ouvre en bas
d’écran.
2. Cliquez sur le bouton « Ajouter un groupe ».
3. Une nouvelle zone d’en-tête de groupe DEPARTEMENT dans l’état s’est insérée en
dessous de l’en-tête de page.
4. Cliquez sur le champ DEPARTEMENT qui est apparu dans une nouvelle fenêtre en
bas.
5. Dans la fenêtre inférieure, un bandeau jaune est apparu, cliquez sur Plus.
6. Cliquez sur la zone de liste déroulante voisine de Avec un total de CODE.
7. Le type Compter les valeurs sur cette zone CODE est par défaut le bon.
8. Cochez la case Afficher dans le Pied de page de groupe : un pied de page de groupe
apparaît avec une formule de Compte().
9. Cliquez sur le champ DEPARTEMENT dans la zone Détail.
10. Appuyez sur Ctrl + X (pour le couper).
11. Cliquez sur l’en-tête de groupe et utilisez la combinaison Ctrl + V (pour le coller).
12. Ajoutez une étiquette Département dans l’en-tête de groupe (l’étiquette d’origine a
disparu lors du couper-coller).
13. Un « smart tag » ou message d’anomalie (triangle vert en haut à gauche de la zone
d’étiquette) est apparu : cliquez sur le losange jaune et associez l’étiquette à la zone de
texte voisine.
14. Dans le bandeau inférieur, cliquez sur Ajouter un tri.

Les états 171


Access Livre Page 172 Mercredi, 27. f vrier 2008 7:28 07

15. Sélectionnez le champ VILLE pour que les villes soient triées par ordre alphabétique.
La liste globale va donc afficher tous les départements en commençant par 01 pour
finir par 98 mais, à l’intérieur de chaque département, les enregistrements seront triés
par ordre alphabétique de ville.
L’ordonnancement qui vient d’être mis en place n’est nullement le résultat de tris ou de
sous-totalisations dans la requête source des données, mais bien l’effet de la structure de
l’état lui-même. En définitive, il doit avoir la structure présentée à la figure 6.6.

Figure 6.6
État avec
sous-totaux.

Il est possible de créer autant de groupes qu’il existe de champs dans la source de données.
On prendra garde, pourtant, à ne pas multiplier à l’infini cette notion de rupture dans les
impressions.
Toutes les formules, tous les mots-clés utilisés dans les contrôles Zone de texte des formu-
laires restent identiques dans les états.
L’utilisation d’une étiquette comme d’un texte complet permet d’envisager le montage de
publipostages dans Access même, sans autre outil : les coordonnées des destinataires
seraient gérées comme tout autre champ en haut à droite de la page et le texte mis en place
dans autant d’étiquettes qu’il y aurait de paragraphes. Mais cette démarche nous paraît
hasardeuse : il serait impossible d’insérer des champs variables au sein même des textes et
surtout, il serait impossible de gérer les largeurs de zones. Il est infiniment plus efficace de
faire le mailing dans Word en appelant les données stockées dans la base Access. Inverse-
ment, Access s’adapte parfaitement bien à l’impression des documents à structure fixe
comme les factures.
Contrairement aux formulaires, enfin, les enregistrements imprimés dans un état peuvent
être numérotés pour établir des références précises :
1. Dans l’état des codes postaux ci-dessus, en mode création, décalez les champs CODE
et VILLE vers la droite de 2 carreaux (si les zones de texte sont restées solidaires,
l’ensemble des zones se décale simultanément).
2. Dans l’en-tête de page, ajoutez une étiquette N˚ de ligne.
3. Dans le détail, ajoutez une zone de texte vierge et retirez le texte de son étiquette.
4. Dans la feuille de propriétés de la nouvelle zone, entrez la formule « =1 » à la propriété
Source contrôle.

172 Access® 2007 et VBA


Access Livre Page 173 Mercredi, 27. f vrier 2008 7:28 07

5. Dans la même feuille de propriétés, positionnez la propriété Cumul à Par Groupe (au
lieu de Non).
6
Chapitre

Le résultat final de l’état doit correspondre à celui de la figure 6.7.

Figure 6.7
Résultat de l’état
« Bottin des codes
postaux » avec
numérotation des
lignes.

Résumé
Access a conçu l’impression des données par la génération d’états dont l’essentiel des
règles est régi de la même manière que les formulaires. La source des données sera, la plu-
part du temps, fournie par une requête spécifique dont on exclura tout tri ou sélection
spécifique ; en effet, Access permet de mettre en place dans les états des ruptures d’édition
(avec ou sans sous-totaux) et des tris qui font du générateur d’états un outil particulière-
ment performant. Inadapté aux mailings, l’état Access correspond très bien, en revanche,
aux besoins des gestionnaires et commerciaux (listings, factures, etc.).

Les états 173


Access Livre Page 174 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
EXERCICE 1 ÉTAT DES NOTES DES ÉLÈVES

Le seul exercice de ce chapitre porte sur les données contenues dans la base ECOLE_
INTERNATIONALE. Il met en œuvre, simultanément, les connaissances acquises sur les
formulaires et les états.

• Énoncé Mettez en place un formulaire doté d’une zone de liste déroulante proposant tous les élè-
ves ; un clic sur un bouton d’impression dans le même formulaire lancera l’aperçu avant
impression du « carnet de notes » de l’élève choisi avec toutes les moyennes ; il doit appa-
raître, en sus, une moyenne des langues vivantes.

* Solution Le formulaire demandé est un classique de la programmation : il s’agit d’une fenêtre de


paramètres d’impression qui s’ouvre uniquement au moment d’une demande d’édition ;
on parle de boîte de dialogue modale. La notion de filtre sur état servira à afficher l’élève
sélectionné dans la zone de liste déroulante

Création de la boîte de dialogue modale


1. Dans le menu « Créer », cliquez sur l’icône Plus de formulaires.
2. Sélectionnez Boîte de dialogue modale : un formulaire vierge est créé. En le passant en
mode formulaire, on constate qu’il s’agit d’une fenêtre dépourvue de boutons de
dimension en haut à droite (sauf la croix de fermeture) et que deux boutons d’actions
sont déjà insérés en bas (OK et annuler). Les propriétés Fen Modale et Fen indépen-
dante du formulaire sont positionnées à Oui, contrairement aux formulaires habituels
où ces deux propriétés sont positionnées à Non. La fenêtre a l’aspect présenté à la
figure 6.8.
3. Enregistrez la boîte de dialogue modale sous le nom « Frm_Choix_Eleve » et rensei-
gnez la propriété Légende du formulaire par « Choix d’un élève », libellé qui apparaîtra
dans la barre bleue supérieure du formulaire 1.
4. Insérez une zone de liste déroulante dans le formulaire.
5. À l’étape 1, conservez l’option par défaut de source des données (table).
6. À l’étape 2, choisissez la table « ELEVE ».

1. On remarquera que l’affichage de la boîte de dialogue en mode création ne peut pas être obtenu avec le bouton haut gauche du ruban de
création ; il est nécessaire de faire un clic droit sur l’objet dans le volet de navigation et de sélectionner « Mode Création ».

174 Access® 2007 et VBA


Access Livre Page 175 Mercredi, 27. f vrier 2008 7:28 07

Figure 6.8
Boîte de dialogue
6
Chapitre

modale vierge.

7. À l’étape 3, faites glisser les trois champs « ID_ELEVE », « NOM_ELEVE »,


« PRENOM_ELEVE » dans le pavé des champs sélectionnés.
8. Ne vous arrêtez pas à l’étape 4 de la mise en place de tris.
9. Conservez la colonne clé cachée à l’étape 5.
10. Nommez l’étiquette de la zone de liste déroulante « Choix d’un élève » à la dernière
étape.
11. En mode création, nommez le contrôle de Zone de liste déroulante « Choix_eleve »
dans les propriétés (ce point est important car le nom du contrôle sera nécessaire par
la suite).

Création de la requête à la source de l’état


La requête qui appelle les informations nécessaires à l’état est conçue pour renvoyer toutes
les données (alors qu’un seul élève donnera lieu à impression) et dépourvue de tout tri :
ces opérations se feront en aval.
1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».
2. Affichez les tables « ELEVE », « MATIERE » et « NOTE ».
3. Insérez les champs « ID_ELEVE », « NOM_ELEVE », « PRENOM_ELEVE »,
« NOM_MATIERE », « NOTATION ».
4. Cliquez sur le bouton « ∑ Totaux ».
5. Conservez l’opération Regroupement pour tous les champs de la requête sauf pour
NOTATION où la fonction Moyenne doit être sélectionnée.
6. La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE,
Exercices

ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE, Avg(NOTE.NOTATION) AS Moyen-


neDeNOTATION FROM MATIERE INNER JOIN (ELEVE INNER JOIN [NOTE] ON
ELEVE.ID_ELEVE = NOTE.ID_ELEVE) ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE

Les états 175


Access Livre Page 176 Mercredi, 27. f vrier 2008 7:28 07

GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE,


MATIERE.NOM_MATIERE;, doit avoir la structure présentée à la figure 6.9.

Figure 6.9
Requête Req3_
Moyennes de
l’exercice 6-1.

Enregistrez la requête sous le nom « Req3_Moyennes » (si les exercices des chapitres pré-
cédents ont été faits, il existe déjà une requête Req1_Moyennes et une requête Req2_
Moyennes).

Création de l’état
1. Fermez toutes les fenêtres en cours et positionnez la surbrillance du volet de navigation
au-dessus de la requête source Req3_Moyennes.
2. Dans le menu « Créer », cliquez sur l’icône Assistant État.
3. À la première étape, déplacez tous les champs du pavé champs disponibles au pavé
champs sélectionnés.
4. À la deuxième étape, indiquez à Access un niveau de regroupement en cliquant sur la
flèche vers la droite pour insérer le champ ID_ELEVE comme niveau. L’assistant doit
avoir la configuration indiquée à la figure 6.10.

Figure 6.10
Niveaux de
regroupement dans
l’assistant États.

176 Access® 2007 et VBA


Access Livre Page 177 Mercredi, 27. f vrier 2008 7:28 07

5. Dans la troisième étape, n’indiquez pas d’ordre de tri, mais cliquez sur le bouton
« Options de synthèse ». Cochez la case Moyenne pour demander à programmer une
moyenne générale pour l’élève.
6
Chapitre

6. Dans les deux étapes suivantes, choisissez le style de formulaire qui vous convient le
mieux.
7. Indiquez le titre « Résultats » pour l’état à la dernière étape.
L’effet obtenu n’est pas totalement satisfaisant :
• Le regroupement est correct (ID_ELEVE par ID_ELEVE), mais l’état répète le nom
et le prénom de chacun autant de fois qu’il existe de matières : ceci est dû au fait
que le regroupement s’effectue sur le seul ID et non pas sur le triplet ID-NOM-
PRENOM.
• Les moyennes par matière apparaissent sous la forme ########## car la zone n’est pas
suffisamment large.
• Le libellé « Synthèse pour ID_ELEVE… » n’est pas très heureux.
Procédons aux perfectionnements nécessaires en mode création :
1. Sélectionnez l’ensemble des étiquettes contenues dans l’en-tête de page, puis, dans le
menu « Réorganiser », cliquez sur Supprimer (les étiquettes se désolidarisent des zones
de texte placées dans le Détail).
2. Supprimez toutes les étiquettes de l’en-tête de page en appuyant sur « Sup ».
3. Réduisez la hauteur de la zone En-tête de page afin qu’elle devienne invisible.
4. Déplacez le champ NOM_ELEVE de la zone Détail à la zone En-tête de groupe.
5. Déplacez le champ PRENOM_ELEVE de la zone Détail à la zone En-tête de groupe.
6. Mettez les deux champs précédents en Gras.
7. Déplacez les champs MATIERE et MoyenneDeNOTATION pour les placer en milieu
d’état.
8. Élargissez le champ MoyenneDeNOTATION.
9. Positionnez les propriétés du champ MoyenneDeNOTATION Format et Décimales
respectivement à Fixe et 2.
10. Dans le pied de groupe, supprimez le libellé automatique de synthèse pour ne conserver
que la moyenne générale et son libellé.
11. Modifiez les propriétés du champ de Moyenne générale dont la propriété Source est
=Moyenne([MoyenneDeNOTATION]) : les propriétés Format et Décimales doivent
être respectivement à Fixe et 2.
Exercices

Les états 177


Access Livre Page 178 Mercredi, 27. f vrier 2008 7:28 07

L’état des résultats doit avoir la structure décrite à la figure 6.11.

Figure 6.11
Structure de l’état
des résultats après
modifications.

Mise en place du passage du formulaire à l’état et du filtre


La boîte de dialogue modale et l’état étant prêts, il ne reste plus qu’à lier les deux éléments
en insérant dans le même temps la notion de filtre.
1. Ouvrez la boîte de dialogue modale « Frm_Choix_Eleve » en mode création (clic du
bouton droit dans le volet de navigation sur l’élément et sélection du « Mode
Création »).
2. Ouvrez la feuille de propriété du contrôle Bouton de commande nommé OK.
3. Sélectionnez la propriété SurClic (qui contient déjà une macro incorporée) et cliquez
sur le bouton aux trois points de suspension.
4. La macro ne contient qu’une ligne avec le mot-clé « Fermer » pour action : nous allons
insérer une ligne avant cette action.
5. Faites un clic droit à gauche de la première ligne et sélectionnez Insérer des lignes : une
ligne blanche se positionne au-dessus de l’action Fermer.
6. Ouvrez la zone de liste déroulante dans la colonne Action et sélectionnez OuvrirEtat.
7. Dans la zone inférieure de l’écran, précisez le nom de l’état Résultats en le pointant
dans la zone de liste déroulante Nom de l’état.
8. Toujours en bas d’écran, insérez la condition WHERE suivante : [ID_ELEVE]=[For-
mulaires]![Frm_Choix_Eleve]![Choix_Eleve] . Dans cette expression, le premier
ID_ELEVE entre crochets renvoie à celui de l’état pendant que la partie droite de
l’équation utilise une structure déjà étudiée au chapitre précédent : le mot-clé For-
mulaires entre crochets désigne la collection d’objets de ce type, [Frm_Choix_
Eleve] désigne le formulaire ciblé (la boîte de dialogue modale) et [Choix_Eleve]
désigne le contrôle.
9. Précisez les propriétés de l’action Fermer de la deuxième ligne : le type d’objet à ren-
seigner en bas d’écran est un Formulaire et le nom de l’objet est Frm_Choix_Eleve.

178 Access® 2007 et VBA


Access Livre Page 179 Mercredi, 27. f vrier 2008 7:28 07

Figure 6.12
La macro doit avoir la structure décrite à la figure 6.12.
6
Chapitre

Macro incorporée
du contrôle OK de
la boîte de dialogue
modale.

10. Fermez la macro et enregistrez les modifications.


11. Testez le programme : à l’ouverture de la boîte de dialogue modale, sélectionnez un
élève et cliquez sur « OK », l’état s’ouvre automatiquement et n’affiche que l’élève
sélectionné : l’impression peut être lancée. Remarque : la boîte de dialogue se ferme
automatiquement, dès que le paramètre de choix de l’élève a été renvoyé à l’état.

Exercices

Les états 179


Access Livre Page 180 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 181 Mercredi, 27. f vrier 2008 7:28 07

Les macros
7
Chapitre

1. Mise en œuvre des macros..... 182


Déjà abordées rapidement, les macros d’Access
2. Le passage des macros permettent l’automatisation d’actions successives,
à Visual Basic........................ 189
Problèmes et exercices
éventuellement sous condition. Fondamentalement
1. Macro insérée dans une zone différentes de celles d’Excel, les macros Access
de liste.................................. 194
2. Macro d’envoi de messages
n’enregistrent pas les gestes faits par l’utilisateur,
électroniques......................... 199 mais doivent au contraire être « composées » par
l’entrée d’actions et la mise en place de paramètres
à ces actions. Les macros Access ne sont pas
traduites immédiatement en langage Visual Basic :
il faut mettre en œuvre un utilitaire spécifique pour
effectuer cette traduction. Les macros n’en restent
pas moins un excellent moyen de passer graduel-
lement d’une automatisation partielle à une
utilisation du code de programmation.

181
Access Livre Page 182 Mercredi, 27. f vrier 2008 7:28 07

(1) Mise en œuvre des macros


Les quelques macros qui ont été vues dans les chapitres précédents, uniquement destinées
à parachever un exercice particulier, ont été chaque fois incorporées dans le formulaire ou
l’état, plus précisément sous la propriété de l’événement à partir duquel elles étaient lancées.
À présent, notre étude va porter sur la conception de macros enregistrées comme telles et
non incorporées.

1.1 CRÉATION DE MACRO

La première succession d’événements programmés que nous allons écrire consiste à affi-
cher une boîte de message puis ouvrir la table CODE_POSTAL de la base du même nom
et enfin d’exporter cette table vers un nouveau fichier Excel.
1. Dans l’onglet Créer, cliquez sur le triangle placé dans l’icône Macro, à droite, et sélec-
tionnez Macro (les deux autres éléments, que nous verrons plus loin, accèdent directement
à Visual Basic).
2. Une nouvelle fenêtre s’ouvre, similaire à celle de la figure 7.1.

Figure 7.1
Grille de saisie
des macros.

Commentaire de la grille de saisie :


• En haut d’écran, un ruban dont on étudiera le détail dans les pages qui viennent.
• Dans le corps du document, une liste de lignes pouvant contenir des Actions qui se
dérouleront successivement.
• En bas, et synchronisés avec la ligne active, les arguments de l’action sélectionnée.
Ces arguments varient suivant le type d’action choisi.
• Dans la partie de droite, chaque action peut recevoir un commentaire : nous ne sau-
rions que trop recommander la saisie de textes permettant de documenter l’application
en cours d’élaboration.

182 Access® 2007 et VBA


Access Livre Page 183 Mercredi, 27. f vrier 2008 7:28 07

L’ouverture de la zone de liste déroulante de l’action permet de lire une trentaine d’actions
possibles, mais si l’on clique sur le bouton du ruban Afficher toutes les actions, la palette
complète comprend alors 70 types d’actions programmables.
7
Chapitre

1. À la première ligne, sélectionnez l’action BoîteMsg.


2. Dans la partie inférieure de l’écran, renseignez le message par « La table des codes pos-
taux va s’ouvrir » ; conservez la propriété Bip à Oui ; choisissez le Type comme Point
d’exclamation ; indiquez le Titre : « Ma première macro ».
3. À la deuxième ligne, sélectionnez l’action OuvrirTable.
4. Parmi les arguments, sélectionnez la table « CODE_POSTAL » comme Nom de la
table.
5. Précisez l’argument Affichage en Feuille de données et l’argument Mode données en
Lecture seule.
6. Sur une troisième ligne, insérez l’action TransférerFeuilleCalcul.
7. L’argument Type de transfert doit être positionné à Exportation (au lieu de Importation
par défaut).
8. L’argument Type de feuille de calcul doit être positionné à Excel Workbook (pour une
exportation vers un fichier Excel 2007).
9. Le nom de la table à exporter est « CODE_POSTAL » (on remarquera qu’Access ne
propose pas de zone de liste déroulante).
10. Le chemin complet et le nom du fichier doivent tous être indiqués pour une exporta-
tion valide ; on entrera un chemin du type C:\Users\Utilisateur1\Desktop\CODE_
POSTAL.XLSX 1.
11. Les deux derniers arguments de l’action TransférerFeuilleCalcul peuvent être laissés en
l’état.
12. Sur une quatrième et dernière ligne insérez une nouvelle BoîteMsg avec pour Message,
« Le fichier a été exporté vers Excel », pour Type, Aucun et Titre, Ma première macro.
13. Fermez la macro et enregistrez-la sous le nom « Mcr_Visu_Codes »2.
Testez votre macro, apparue dans le volet de navigation : la boîte de message s’ouvre puis,
après un clic sur OK, laisse la place à la table en mode feuille de données et lecture seule.
L’exportation se réalise sans même qu’aucun effet visuel n’en découle et le message de bon
envoi s’affiche pour terminer.

1.2 ASSOCIATION D’UNE MACRO À UN BOUTON

La macro qui a été créée dans le paragraphe précédent peut être lancée depuis le volet de
navigation, mais il est fréquent que les macros soient associées à un formulaire et un bouton
donnés.
1. Dans le menu « Créer », cliquez sur l’icône Création de formulaires (une grille vierge
de formulaire apparaît).
2. Cliquez sur l’icône Bouton de commande du ruban et dessinez un carré en bas d’écran.

1. Ce chemin, qui s’apparente à une structure de fichiers Windows Vista, permet de copier les données sur le bureau de l’utilisateur appelé
Utilisateur1 dans un fichier Excel 2007.
2. Certains programmeurs préfixent leurs macros par Mac_xxx.

Les macros 183


Access Livre Page 184 Mercredi, 27. f vrier 2008 7:28 07

3. Dans la première étape de l’assistant, sélectionnez l’action Exécuter une macro parmi
les options de la catégorie Divers.
4. Dans la deuxième étape, choisissez la macro Mcr_Visu_Codes.
5. Choisissez l’apparence que vous préférez dans la troisième étape.
6. Nommez le bouton « Visu_codes » dans la quatrième et dernière étape.
7. Testez ce bouton en passant en mode formulaire : les quatre opérations programmées
plus haut se déroulent de la même manière.

1.3 UTILISATION DE VARIABLES DANS LES MACROS

Avec Access 2007, il est désormais possible de faire jouer des variables dans les macros, ce
qui élargit considérablement la portée de cet outil par rapport aux versions antérieures qui
en étaient dépourvues. Une variable est une donnée (de type alphanumérique mais non
de type date ou autres) conservée en mémoire jusqu’à ce qu’une commande précise de
macro ne la supprime. Le principe d’Access veut qu’on affecte simplement une valeur à
une variable pour qu’elle soit créée et utilisable.
On se propose ici de créer une macro qui :
• Ouvre une boîte de message pour demander à l’utilisateur un nom de ville.
• Recherche dans la table des codes postaux le code correspondant à la ville demandée.
• Affiche une boîte de message réponse.
Dans la mesure où il existe plusieurs étapes à cette opération (entrée de la demande,
recherche et affichage de la réponse), il est impossible de la réaliser sans faire appel à des
informations stockées quelque part (valeur demandée et valeur de réponse) : le support de
stockage aurait pu être un formulaire ou un état mais, dans le cas présent, toute l’opéra-
tion doit se dérouler sans aucun support sinon la macro elle-même ; dès lors, seules des
variables peuvent répondre à cette attente.
1. Dans le menu « Créer », cliquez sur Macro.
2. Sur la première ligne, choisissez l’action DéfinirVarTemp qui crée une variable et lui
affecte une valeur.
3. Dans les arguments, nommez la variable « VilleRecherche ».
4. Dans les arguments, saisissez en Expression la formule : « BEntrée("De quelle ville
voulez-vous connaître le code postal ?")  ». La fonction BEntrée crée une boîte
de dialogue qui permet à l’utilisateur de saisir la valeur de la variable. Le texte entre
guillemets est le texte qui apparaîtra dans la boîte de dialogue.
5. La deuxième ligne utilise la fonction RechDom, déjà étudiée, pour déterminer la
valeur d’une deuxième variable : choisissez l’action DéfinirVarTemp une nouvelle fois
sur cette ligne.
6. Dans les arguments, nommez la variable « CodeTrouve ».
7. Dans les arguments, saisissez en Expression la formule : « RechDom("[CODE]";"CODE_
POSTAL";"[VILLE]='" & [VarTemp]![VilleRecherche] & "'")  ». On prendra
garde à la syntaxe de cette formule relativement complexe et fréquemment retrouvée.
En premier lieu, la formule ne commence pas par le signe égal (=). Les trois parties de
la fonction RechDom sont cernées par des guillemets ; le premier argument désigne la
colonne de la recherche et est cerné par des crochets ; le deuxième argument désigne

184 Access® 2007 et VBA


Access Livre Page 185 Mercredi, 27. f vrier 2008 7:28 07

la table ciblée et ne nécessite pas de crochets ; le troisième argument, qui désigne les
conditions de la recherche, concatène (signe & ou perluète) plusieurs parties :
7
Chapitre

• le champ VILLE est cité entre crochets et guillemets mais une apostrophe (quote sim-
ple) est insérée en outre avant le dernier guillemet ; cette apostrophe sert à citer la varia-
ble décrite après comme une chaîne de caractère ;
• la variable VilleRecherche qui avait été initialisée dans la ligne précédente est désignée
par le mot-clé VarTemp entre crochets, suivi d’un point d’exclamation et du nom de
variable encore une fois entre crochets ;
• une dernière partie comprend une apostrophe entre deux guillemets pour fermer la
chaîne de caractères ouverte après VILLE. En admettant que la valeur de la variable soit
PARIS, la formule s’écrirait RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='PARIS') .
8. Sur une troisième ligne de macro, sélectionnez l’action BoîteMsg.
9. Parmi les arguments, entrez pour message la formule « ="Le code de " & [Var-
Temp]![VilleRecherche] & " est " & [VarTemp]![CodeTrouve]  ». Ici, le message
doit être précédé du signe = pour que la concaténation soit effective (un texte littéral
apparaîtrait si le signe = était omis).
10. Une quatrième et dernière ligne supprime les variables et leur contenu (mesure indis-
pensable pour éviter des problèmes en cas de réutilisation des variables) : insérez
l’action SupprimerToutesVarTemp qui ne comprend aucun argument.
Au total, la macro, qu’on enregistra sous le nom « Mcr_Recherche_Code », aura l’aspect
de la figure 7.2.

Figure 7.2
Macro de recherche
de code postal en
mode création.

L’exécution de la macro provoque le scénario suivant :


Étape 1 : une boîte de dialogue demande à l’utilisateur de nommer la ville dont le code
postal est recherché, comme il apparaît à la figure 7.3.

Figure 7.3
Première étape
de la macro de
recherche de code
postal.

Les macros 185


Access Livre Page 186 Mercredi, 27. f vrier 2008 7:28 07

Étape 2 : une deuxième boîte de dialogue donne la réponse à l’utilisateur, comme indiqué
sur la figure 7.4. On notera que la recherche proprement dite n’a pas donné lieu à un affi-
chage particulier.

Figure 7.4
Deuxième étape
de la macro de
recherche de code
postal.

1.4 LES MACROS CONDITIONNELLES

Dans l’application précédente, le programme ne prévoit pas le cas où la ville entrée dans la
boîte de dialogue initiale n’existe pas. Si par exemple, et à la suite d’une faute d’orthogra-
phe, la ville de PAROS est demandée, à la place de PARIS, le programme répond simple-
ment « Le code de PAROS est » sans plus de commentaire.
Pour éviter ce problème, on peut écrire une macro conditionnelle, qui prévoira cette éven-
tualité.
1. Ouvrez à nouveau, si nécessaire, la macro en mode création.
2. Dans le ruban, cliquez sur le bouton « Conditions » : une colonne Condition apparaît
dans le corps de la macro, à gauche des Actions.
3. Faites un clic droit dans la marge de la troisième ligne et sélectionnez Insérer des
lignes : une ligne blanche se crée en dessous de la deuxième définition de variable.
4. Dans la colonne Condition de la nouvelle ligne, insérez la formule : « EstNull([Var-
Temp]![CodeTrouve]) » qui signifie littéralement « Si la variable CodeTrouve est
vide » (autrement dit : si la recherche n’a pas abouti).
5. Dans la colonne Action de la même ligne, sélectionnez l’action BoîteMsg avec pour
argument Message : « Cette ville n’est pas répertoriée dans la table », pour argument
Type : le point d’exclamation et pour argument Titre : Recherche de code postal.
Cette nouvelle ligne de programme, qui « contourne » la trajectoire directe de la macro
initiale, n’est pas suffisante. Si les modifications se limitent à cette seule ligne, le pro-
gramme va effectivement renvoyer le message erreur si ce dernier s’applique, mais il va
continuer en donnant tout de même une réponse écourtée et inexacte (testez ce cas de
figure). Il faut donc non seulement renvoyer le message erreur mais aussi obliger le pro-
gramme à s’arrêter en cas d’erreur.
6. Insérez une nouvelle ligne en dessous du message erreur.
7. Saisissez trois points dans la colonne Condition de la nouvelle ligne : cette syntaxe
indique à Access que la condition de la ligne précédente continue à s’appliquer.
8. Sélectionnez l’action SupprimerToutesVarTemp.
9. Insérez une nouvelle ligne en dessous.
10. Saisissez trois points dans la colonne Condition.

186 Access® 2007 et VBA


Access Livre Page 187 Mercredi, 27. f vrier 2008 7:28 07

11. Sélectionnez l’action ArrêtMacro dans la colonne Action.


Dans cette nouvelle rédaction, la macro implique bien deux voies possibles (voir figure
7
Chapitre

7.5) :
• Soit la variable est vide et donc le programme renvoie un message erreur, s’arrête et
détruit les variables en cours ;
• Soit la variable n’est pas vide, les trois lignes du milieu ne sont pas exécutées, la réponse
est affichée puis le programme détruit les variables.

Figure 7.5
Macro
conditionnelle.

1.5 LES ENCHAÎNEMENTS DE MACROS

Les macros peuvent être chaînées entre elles, de manière conditionnelle ou non ; on peut
alors mettre en place des programmes complets, réutilisables en divers endroits de l’appli-
cation.
Afin d’illustrer cette fonctionnalité, nous emploierons de nouveau les macros Mcr_Visu_
Codes et Mcr_Recherche_Code développées précédemment.
1. Dans le menu « Créer », cliquez sur le bouton Macro.
2. Sur la première ligne, définissez une variable nommée « Choix » et dont l’expression
est la formule : BEntrée("Tapez 1 pour visualiser les codes, 2 pour en rechercher un
précis"). Le choix entre l’option 1 et l’option 2 orienteront le programme vers l’une ou
l’autre des deux macros déjà créées.
3. Cliquez sur le bouton Conditions.
4. Sur la deuxième ligne, insérez la condition [VarTemp]![Choix]=1.
5. Sur la même deuxième ligne, sélectionnez l’action ExécuterMacro et citez Mcr_Visu_
Codes dans l’argument du Nom de macro.
6. Sur la troisième ligne, insérez la condition [VarTemp]![Choix]=2.
7. Sélectionnez l’action ExécuterMacro et citez Mcr_Recherche_Code dans l’argument du
Nom de macro 1.
8. Enregistrez la nouvelle macro sous le nom « Mcr_Choix » (voir figure 7.6).

Figure 7.6
Macro appelant
d’autres macros.

1. On notera que l’action ExécuterMacro comporte un argument de répétition. Il est possible, avec cette option, d’insérer une notion de
boucle dans les programmes.

Les macros 187


Access Livre Page 188 Mercredi, 27. f vrier 2008 7:28 07

1.6 LA GESTION DES ERREURS DANS LES MACROS

Une procédure particulière est prévue pour gérer les erreurs système qui peuvent interve-
nir dans les macros. Dans le programme de recherche d’un code postal, une erreur inter-
vient à coup sûr (et provisoirement) si le nom de la ville recherchée comporte une
apostrophe. Avant de réparer ce problème, tentez par exemple de rechercher le code postal
de CAP D’AIL (qui se trouve bien dans la liste) avec la macro Mcr_Recherche_Code : le
programme renvoie le message erreur de la figure 7.7.

Figure 7.7
Message erreur dû
à une mauvaise
syntaxe SQL.

Afin d’éviter l’affichage de ce message, incompréhensible pour l’utilisateur, nous modifions la


macro Mcr_Recherche_Code de la manière suivante :
1. Ouvrez la macro en mode création.
2. Cliquez dans le ruban sur le bouton Noms de macro : le corps de la macro compte
désormais 5 colonnes.
3. Insérez une nouvelle première ligne.
4. Sélectionnez l’action SurErreur avec pour argument Atteindre : Nom Macro et pour
argument Nom de Macro : Gestion_Erreurs. On notera que ce nom de macro ne res-
pecte pas le suffixe habituel « Mcr_ » donné jusqu’à maintenant. En effet, ce nom de
macro restera complètement interne à la macro en cours et ne donnera pas lieu à enre-
gistrement en tant que tel. L’action SurErreur a été volontairement posée en début de
programme pour intercepter toutes les erreurs qui suivront.
5. En bas de macro (9e ligne), saisissez « Gestion_Erreurs » dans la première colonne des
Noms de macro.
6. Dans la colonne Action, sélectionnez BoîteMsg avec pour argument Message : « Le
nom de la ville ne doit pas comporter d’apostrophe ». La macro a, au final, les pro-
priétés indiquées à la figure 7.8.

Figure 7.8
Macro avec gestion
des erreurs.

188 Access® 2007 et VBA


Access Livre Page 189 Mercredi, 27. f vrier 2008 7:28 07

Le programme, désormais, intercepte l’erreur avant qu’elle ne renvoie le message de la


figure 7.7 et « détourne » le programme vers la gestion d’erreurs située en bas.
7
Chapitre

Note
En fait, l’erreur est due à une imperfection de la syntaxe de la fonction RechDom() dans la troisième
ligne du programme. La syntaxe actuelle est RechDom("[CODE]";"CODE_POSTAL";"[VILLE]='" &
[VarTemp]![VilleRecherche] & "'"). Dans cette tournure, et pour simplifier les explications, on a
employé des apostrophes pour cerner le nom de la ville recherchée dans la requête SQL. Or, si la
ville recherchée, justement, comprend elle aussi une apostrophe, il s’ensuit forcément une erreur car
SQL ne sait plus où se trouve la chaîne de caractères recherchée. Dans l’absolu, il faut remplacer
chaque apostrophe par un double guillemet ("") pour solutionner le problème. La formule devient
alors RechDom("[CODE]";"CODE_POSTAL";"[VILLE]= """ & [VarTemp]![VilleRecherche] & """").

(2) Le passage des macros à Visual Basic


Avant d’étudier les rudiments de Visual Basic, nous abordons ici un moyen très convivial
de glisser du monde des macros à la programmation VBA proprement dite. Access est
doté, en effet, d’un utilitaire qui permet de traduire les macros dans le langage commun à
toutes les applications Office, Visual Basic pour Applications.

2.1 LA CONVERSION DES MACROS EN VISUAL BASIC

La procédure de conversion que nous allons étudier s’avère d’une simplicité extrême et
peut être utilisée massivement dans un premier temps, avant que le langage VBA ne soit
complètement assimilé. Dans de nombreux cas, il sera judicieux de passer par cette voie
lorsque des syntaxes seront méconnues ; on gagnera par là un temps précieux.
1. Fermez tous les onglets Access actifs et mettez en surbrillance la macro Mcr_Visu_
Codes (sans la démarrer ou l’ouvrir en mode création !).
2. Cliquez dans le menu sur « Outils de base de données ».
3. Cliquez sur le bouton du ruban « Convertir les macros en Visual Basic ».
4. Le programme de conversion passe par une boîte message proposant d’ajouter une
gestion des erreurs et des commentaires au programme (voir figure 7.9) : conservez
les deux cases à cocher dans leur état et cliquez sur « Convertir ».

Figure 7.9
Options de la
conversion des
macros en Visual
Basic.

5. Immédiatement, le code qui avait été conçu sous forme graphique devient un « texte
pur » ouvert dans la fenêtre bien particulière de Visual Basic. La conversion ne comporte
pas plus de difficultés !

Les macros 189


Access Livre Page 190 Mercredi, 27. f vrier 2008 7:28 07

6. Lorsque la boîte message « Conversion terminée » est fermée, l’interface est celle de
Visual Basic : fermez le programme en cliquant sur la croix supérieure droite (ou
Fichier > Fermer et retournez à Microsoft Office Access).

2.2 LA PRÉSENTATION DU PROGRAMME VISUAL BASIC

Dans le volet de navigation est apparu un module, nommé « Macro convertie – Mcr_
Visu_Codes ». Ce module nous servira de guide de découverte, mais ne devrait pas être
inséré, en l’état, dans une application. Généralement, on donnera aux modules des noms
plus courts et sans espaces. Un simple clic sur le module provoque tout à la fois le démar-
rage du programme VBA et l’ouverture à la page du module sélectionné. Il est également
possible de cliquer sur l’icône Visual Basic dans le menu « Outils de base de données ».
L’agencement général de Visual Basic est décrit à la figure 7.10. Pour afficher les propriétés
de l’objet, sélectionner le menu « Affichage > Fenêtre Propriétés ».

Figure 7.10.
Fenêtre d’ouverture
de Visual Basic.

La fenêtre n’est plus celle d’Access, mais celle de Microsoft Visual Basic. Un bouton en
haut à gauche permet de retourner à Access, qui reste actif en permanence. Cette interface
est la même pour Access, Excel, Word et tous les produits de la gamme Office.
Dans la partie supérieure gauche de l’écran apparaît une sous-fenêtre des projets ; il peut
exister un certain nombre de projets préchargés qui correspondent à des assistants
(ACWZTOOL) ou compléments spécifiques : généralement, ils ne peuvent pas être
ouverts. En dessous, dans la même zone, se trouvent les éléments du fichier Access ouvert.
Au premier démarrage de VB, vous ne verrez probablement que des modules comme
sous-éléments du fichier, mais rapidement, la structure sera celle montrée sur la figure
7.10 avec :
• des Microsoft Office Access Objets de classe (et des formulaires en dessous) ;
• des modules.
Il est donc possible d’insérer du code :
• soit dans les formulaires, ceux-là même qui ont été étudiés précédemment, et dont le
code se référera à tous les événements pouvant survenir dans ces formulaires ;
• soit dans des modules séparés : le code sera alors appelé par une syntaxe spécifique.
Un double-clic dans l’un de ces éléments permet de le visualiser dans la partie droite de
l’écran.

190 Access® 2007 et VBA


Access Livre Page 191 Mercredi, 27. f vrier 2008 7:28 07

Dans la partie inférieure gauche sont affichées les propriétés de l’objet actif. Ici, on peut
lire (et modifier le cas échéant) le nom du module.
7
Chapitre

Les deux pavés de gauche (projets et propriétés) peuvent être supprimés de l’affichage ou
remis en place par des options du menu général Affichage.
Le pavé de droite contient le code Visual Basic proprement dit comme il apparaît à la
figure 7.11. Nous allons le détailler.

Figure 7.11
Code Visual Basic
de la macro
convertie « Mcr_
Visu_Codes ».

• La première ligne de code Option Compare Database est une ligne particulière, systé-
matiquement ajoutée dans Access pour indiquer que les options d’ordre de tri seront
ceux sélectionnés dans les paramètres régionaux. Cette partie, terminée par un trait,
pourrait comprendre d’autres options générales 1.
• Les quatre lignes suivantes commencent chacune par une apostrophe (') ; le texte qui se
trouve à droite se colore en vert : il s’agit de commentaires et ces lignes ne seront pas
exécutées par le programme. La conversion de la macro les a générées automatiquement.
• Le texte du module proprement dit commence par le mot-clé Function et se termine
par le mot-clé End Function (ils sont en bleu) ; entre ces deux limites, nous sommes
dans une fonction, soit un ensemble de lignes de code constituant un programme qui
pourra être exécuté.
• Le mot-clé Function est suivi par le nom de fonction Mcr_Visu_Codes() : ce nom est
directement issu de la macro originelle et devrait être modifié ; les parenthèses qui sui-
vent, et qui pourraient contenir des paramètres sont obligatoires. La fonction (Function)
déclarée ici possède des propriétés bien particulières que nous verrons plus loin ; elle
peut être remplacée par une simple procédure (déclarée par les mots-clés Sub et End Sub).
• Le code proprement dit, qui sera exécuté, est écrit en noir.
La première ligne ne contient qu’une simple commande Beep, qui effectue un bip sonore.
La deuxième ligne contient une commande de Boîte de message (MsgBox), suivie de ses
paramètres. On verra bientôt que Visual Basic aide l’utilisateur à rédiger son code et énu-
mère les paramètres à entrer au fur et à mesure de la saisie. Ces paramètres sont séparés
par des virgules ; ici ils comprennent, par ordre, le message affiché dans la boîte elle-
même, le type de boîte de message (vbExclamation) et le titre de la boîte.

1. Option Explicit, par exemple et qu’on recommande, oblige le programmeur à déclarer toutes ses variables.

Les macros 191


Access Livre Page 192 Mercredi, 27. f vrier 2008 7:28 07

Le texte de la troisième ligne se retrouve souvent en programmation :


• L’expression DoCmd lance une commande Access. Cette expression ne peut pas être utili-
sée seule : elle est toujours suivie d’un point et d’un autre objet membre de la classe
DoCmd 1.
• Dans le cas présent, DoCmd est suivi de l’objet OpenTable (ouvrir la table). De la même
manière, on pourra manipuler d’autres éléments Access avec l’action OpenForm (ouvrir
un formulaire) ou OpenReport (ouvrir un état).
• Le premier argument de la commande, entre guillemets, est le nom de la table à ouvrir
(pas de virgule entre la commande et le nom de table).
• Le deuxième argument est la manière d’ouvrir la table, acViewNormal signifiant mode
feuille de données, par opposition à acViewDesign (mode création).
• Le dernier argument précise une ouverture en lecture seule (acReadOnly au lieu de
acEdit).
Pour bien vérifier que tous ces arguments sont directement modifiables dans le code,
procédez de la manière suivante :
1. Dans la fonction étudiée, cliquez dans le texte tout de suite après l’expression Open-
Table.
2. Appuyez sur la touche BackSpace (marche arrière) pour faire disparaître l’expression
jusque et y compris le point séparateur.
3. Tapez de nouveau un seul point : vous voyez que Visual Basic vous propose tous les
objets possibles par ordre alphabétique (AddMenu, ApplyFilter…).
4. Redescendez jusqu’à l’expression OpenTable, sélectionnez-la et utilisez la touche de
tabulation, l’expression est reprise dans le texte.
5. Procédez de la même manière en supprimant l’argument acViewNormal et la virgule
qui le précède puis retapez la virgule : VB propose plusieurs modes de visualisation
(acViewLayout, acViewNormal, etc.).
6. Enfin, faites de la même manière pour le dernier argument acReadOnly.
Il est clair, dès lors, que la frappe directe de code VB n’est pas aussi ardue que les non-
initiés se l’imaginent. Un bon moyen de démarrer consiste, justement, à générer du code en
utilisant les macros, à le réviser et à l’augmenter. Grâce à cette démarche, on ira graduellement
vers une rédaction directe du code.
La fonction créée comprend, comme on l’a prévu au moment de la conversion de la
macro, une gestion des erreurs. Cette structure demande une explication particulière.
• La première ligne de programme comporte le code On Error GoTo Mcr_Visu_Codes_
Err ; placé au tout début, ce code prévoit l’hypothèse d’une erreur. Dans cette éventua-
lité, le pointeur de programme sera renvoyé au label Mcr_Visu_Codes_Err à la dixième
ligne et sautera la totalité des lignes entre celle qui a provoqué l’erreur et ce qu’on appel-
lera la récupération de l’erreur. Le mot-clé GoTo constitue un branchement sur une
étiquette de ligne.
• L’étiquette de ligne est signalée par le mot-clé employé dans le renvoi GoTo suivi du
signe deux-points (:).

1. Avec la touche F2 dans Visual Basic ou en cliquant sur Affichage > Explorateur d’objets, on accède à la bibliothèque des objets constituant le
modèle objet VB et grâce auquel on retrouvera tous les outils nécessaires à la rédaction du code.

192 Access® 2007 et VBA


Access Livre Page 193 Mercredi, 27. f vrier 2008 7:28 07

• S’il survient une erreur dans le programme, le contrôle programme passe donc directe-
ment à l’étiquette de ligne Mcr_Visu_Codes_Err et poursuit en lisant la ligne suivante :
la commande MsgBox Error$ ouvre une boîte de message décrivant l’erreur détectée.
7
Chapitre

• La ligne suivante se sert de la syntaxe Resume pour « oublier » l’erreur et aller vers une
nouvelle étiquette de ligne nommée Mcr_Visu_Codes_Exit.
• Enfin, la ligne de programme Exit, située sous l’étiquette, permet de sortir de la fonc-
tion.
Cette gestion des erreurs peut paraître lourde et complexe, mais s’avère indispensable dans
le code. D’une part, elle est complètement générée sans l’intervention du programmeur
mais elle a, d’autre part, l’immense avantage d’éviter à l’utilisateur de recevoir des messa-
ges incompréhensibles. En admettant que toute la structure de gestion d’erreur soit
supprimée, le message affiché par Access serait celui de la figure 7.12.

Figure 7.12
Message Access en
cas d’absence de
gestion d’erreurs.

Dans ce message, doté d’un numéro d’erreur inutile pour l’utilisateur final, il est possible
de cliquer sur le bouton Débogage et d’accéder directement au code VB. Si une application
complète et achevée doit être livrée à des utilisateurs, un tel message est donc à prohiber
absolument !

Résumé
Les macros d’Access, contrairement à celles d’Excel, s’écrivent en enregistrant des actions
à réaliser, dotées de paramètres. Les manipulations s’effectuent dans un environnement
graphique prévoyant tous les cas de figure possibles. Les macros d’Access 2007 permettent
l’utilisation de variables, qui étendent considérablement leur champ d’action, et autorisent
les conditions et les boucles de programmes.
Toute macro peut être très facilement convertie en code afin d’être réutilisée sous l’envi-
ronnement Visual Basic. Ce dernier, totalement intégré à Access, permet la mise au point
de programmes beaucoup plus élaborés et sera donc préféré, à terme, à l’utilisation des
macros.
Les programmes VBA sont intégrés dans des fonctions (Function) ou des procédures
(Sub). La rédaction du code en est facilitée par l’interface graphique qui propose, au fur et
à mesure de la saisie, l’insertion de tous les mots-clés et paramètres du modèle objet de
VBA. La conversion des macros en code crée automatiquement une gestion des erreurs
qui évite aux utilisateurs d’accéder aux programmes eux-mêmes.

Les macros 193


Access Livre Page 194 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
Les exercices proposent de créer des macros dans la base ECOLE_INTERNATIONALE.
On transformera ensuite ces macros en code Visual Basic sur lequel on fera quelques
ajouts et mises au point.

EXERCICE 1 MACRO INSÉRÉE DANS UNE ZONE DE LISTE

• Énoncé 1. À partir d’un formulaire vierge, créez une zone de liste (simple) à choix unique, pré-
sentant tous les élèves ; un clic sur l’un des items de la liste doit ouvrir une boîte de
message présentant la moyenne de l’élève.
2. La macro, incorporée dans le formulaire sera ensuite convertie en code VB. On
ajoutera une nouvelle boîte de message interrogative demandant la matière à cal-
culer pour donner finalement la seule moyenne de l’élève désigné dans cette seule
matière.
3. Cette boîte de dialogue rappellera le nom et le prénom de l’étudiant suivi de sa
note.

* Solution 1. Création du formulaire, de la macro et génération du code VB


L’exercice reprend tous les éléments déjà vus dans les chapitres précédents :
1. Dans le menu « Créer », cliquez sur Création de formulaires (pour obtenir un formu-
laire vierge).
2. Cliquez sur le bouton Zone de liste (Contrôle de formulaire).
3. Dessinez un large rectangle dans le corps du formulaire.
4. À l’étape 1 de l’assistant Zone de liste, conservez l’option par défaut de recherche dans
une table.
5. À l’étape 2, sélectionnez la table « ELEVE ».
6. À l’étape 3, insérez les trois champs « ID_ELEVE », « NOM_ELEVE » et « PRENOM_
ELEVE » dans le pavé des champs sélectionnés.
7. Sautez l’étape 4 des tris à ajouter.
8. Conservez les options par défaut de l’étape 5 (colonne clé cachée).
9. Dans la dernière étape, nommez l’étiquette « Liste des élèves ».
10. Enregistrez votre formulaire sous le nom « Frm_Liste_Eleves ».
Vous devez obtenir un résultat similaire à la figure 7.13.

194 Access® 2007 et VBA


Access Livre Page 195 Mercredi, 27. f vrier 2008 7:28 07

Figure 7.13
Zone de liste
7
Chapitre

de l’exercice 1.

1. Dans la feuille de propriétés de la zone de liste, modifiez la propriété Nom par Choix_
Eleve au lieu de Liste0.
2. Vérifiez que la propriété Sélection multiple est bien à Aucun (c’est l’option par défaut) :
l’utilisateur ne pourra donc pas « toper » plusieurs élèves simultanément.
3. À la ligne de la propriété SurClic, cliquez sur le bouton aux trois points de suspension
à droite.
4. Sélectionnez Générateur de macro : l’interface des macros s’ouvre.
5. Sélectionnez l’action BoîteMsg.
6. Dans l’argument Message, insérez la formule = MoyDom("[NOTATION]";"NOTE";"ID_
ELEVE =" & [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve]) que nous
allons décomposer :
• La fonction MoyDom() est une fonction de regroupement de domaine qui calcule
une moyenne pour un champ d’une table à préciser dans les paramètres.
• Le premier paramètre est celui du champ NOTATION, cité entre guillemets et crochets.
• Le deuxième paramètre est celui de la table NOTE, citée entre guillemets.
• Le troisième paramètre pose la condition de calcul : l’ID de l’élève sur lequel porte le
calcul doit être celui qui correspond à la valeur prise par le contrôle Zone de liste.
• ID_ELEVE = est cité entre guillemets pour respecter la syntaxe de la fonction.
• La deuxième partie de l’équation, concaténée avec la première par le signe & n’est
pas citée entre guillemets afin qu’Access ne le prenne pas pour une valeur littérale,
mais traduise la valeur.
• La valeur du contrôle de Zone de liste est renvoyée par la formule [Formulai-
res]![Frm_Liste_Eleves]![Choix_Eleve] qui précise respectivement et séparés
Exercices

par des points d’exclamation le type de source (formulaire), le nom du document


source et le nom du contrôle source.
7. Modifiez l’argument Bip par Non.
8. Pour l’argument Type, choisissez Information.

Les macros 195


Access Livre Page 196 Mercredi, 27. f vrier 2008 7:28 07

9. Pour l’argument Titre, entrez RESULTATS.


10. Fermez les fenêtres de la macro pour réaliser les tests.
11. Testez votre macro : la boîte message doit afficher un simple chiffre, doté de beaucoup
de décimales.
12. On améliorera donc le résultat final en utilisant la formule suivante : ="Moyenne
générale : " & Format(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formu-
laires]![Frm_Liste_Eleves]![Choix_Eleve]);"Fixe") (voir figure 7.14).
• Le libellé Moyenne générale a été ajouté en début de formule, cité entre guillemets.
• La fonction Format() a servi à calculer un arrondi à deux chiffres après la décimale ; ici,
elle est de la forme Format(<expression> ; "Fixe").

Figure 7.14
Premier message
renvoyé dans
l’exercice 1.

La macro est incorporée dans le formulaire Frm_Liste_Eleves ; elle n’est donc pas conver-
tissable en l’état en code Visual Basic. Il faut donc l’enregistrer au préalable :
1. Retournez en mode création dans la macro et cliquez sur le bouton Enregistrer Sous.
2. Renommez le libellé proposé par défaut Frm_Liste_Eleves par « Mcr_Liste_Eleves » et
cliquez « OK », puis fermez la fenêtre de la macro : à la propriété SurClic du contrôle de
Zone de liste n’apparaît plus le terme Macro incorporée, mais le terme Mcr_Liste_Eleves.
3. On remarque que la macro a été enregistrée comme telle et apparaît dans le volet de
navigation ; restez sur la propriété SurClic de la zone de liste.
4. À présent, il est possible d’accéder au bouton Convertir les macros de formulaire en
code Visual Basic dans l’onglet Outils de base de données : activez-le.
5. Acceptez la gestion d’erreurs et les commentaires, la macro est immédiatement traduite.
6. La propriété SurClic de la Zone de liste Choix_Eleve n’est plus nommée Mcr_Liste_
Eleves mais Procédure événementielle. Un clic sur le bouton aux trois points de suspension
permet un accès direct à VB.
Désormais, le code est bien implémenté sous le formulaire :
• La seule ligne de programme proprement dit contient le code MsgBox "Moyenne géné-
rale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_Liste_
Eleves!Choix_Eleve), "Fixed"), vbInformation, "RESULTATS" qui correspond très
exactement à ce qui avait été entré sous forme de macro.
• La procédure commence par les mots-clés Private Sub : le mot Private indique que la
procédure qui suit ne sera accessible que dans le module où elle est placée ; on touche
ici à la notion de portée des fonctions et procédures, applicable aussi aux variables. Le
mot Sub (auquel correspond un End Sub en fin de procédure) initialise une procédure
(en lieu et place d’une fonction).

196 Access® 2007 et VBA


Access Livre Page 197 Mercredi, 27. f vrier 2008 7:28 07

2. Création de la boîte de message demandant la matière


Pour réaliser la deuxième partie de l’exercice, il faut à présent mettre en œuvre une nou-
7
Chapitre

velle boîte de message, saisie cette fois directement dans VB, et deux variables. En effet, le
programme doit demander à l’utilisateur une matière (ANGLAIS ou MATHEMATIQUES
par exemple), retrouver le numéro correspondant à cette matière, tenir compte de
l’élève sélectionné, et donner le résultat correct au moyen d’une formule qui précise la
recherche en fonction du numéro d’élève et du numéro de matière.
On déclare deux variables dans le programme nommées VARLIBMATIERE initialisée
comme une chaîne de caractères et VARNOMATIERE initialisée comme une valeur entière.
1. Au-dessus de la ligne MsgBox existante (mais après le OnError), écrivez : Dim VARLI-
BMATIERE As String. Cette ligne déclare une variable en tant que chaîne de caractères.
2. En dessous, écrivez : Dim VARNOMATIERE As Integer. Cette ligne déclare une variable
en tant que valeur entière.
3. En dessous, saisissez : VARLIBMATIERE = InputBox("Indiquez la matière recher-
chée", "Calcul de moyenne"). Cette ligne, dont la fonction InputBox() est l’équi-
valent de la fonction BEntrée() étudiée dans les macros, ouvre une boîte de message
interrogative et passe à la variable VALIBMATIERE, la valeur saisie par l’utilisateur.
4. La formule suivante, insérée ensuite, permet de retrouver le numéro de la matière
recherchée : VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_
MATIERE=' " & VARLIBMATIERE & " ' ")1. La fonction DLookup(), équivalente en
VB de la fonction RechDom(), recherche le numéro de matière correspondant à la
matière citée en toutes lettres.
5. Insérez une ligne plus bas et provisoirement une ligne MsgBox VARNOMATIERE qui nous
permettra de tester le programme arrivé à ce stade.
Au total, le programme est le suivant (provisoirement).
Private Sub Choix_Eleve_Click()
On Error GoTo Choix_Eleve_Click_Err
Dim VARLIBMATIERE As String
Dim VARNOMATIERE As Integer
VARLIBMATIERE = InputBox("Indiquez la matière recherchée",
➥"Calcul de moyenne")
VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='"
➥& VARLIBMATIERE & "'")
MsgBox VARNOMATIERE
MsgBox "Moyenne générale : " & Format(DAvg("[NOTATION]", "NOTE",
➥_ "ID_ELEVE =" & Forms!Frm_Liste_Eleves!Choix_Eleve),"Fixed"),
➥_vbInformation, "RESULTATS"
Choix_Eleve_Click_Exit:
Exit Sub
Choix_Eleve_Click_Err:
MsgBox Error$
Resume Choix_Eleve_Click_Exit
End Sub
À ce stade, testez le programme : cliquez sur un élève de la liste, une boîte message
Exercices

demande la matière recherchée ; si vous choisissez MATHEMATIQUES, par exemple, le


programme renvoie la réponse 2 ; la moyenne calculée ensuite est inexacte puisqu’il s’agit

1. L’enchaînement des guillemets s’écrit avec la même syntaxe que celle étudiée dans le cours concernant les macros. Les apostrophes (quotes
simples américaines), destinées à faire comprendre la démarche du programmeur, doivent être remplacées par des doubles guillemets pour
faire reconnaître les chaînes de caractères contenant elles-mêmes des apostrophes.

Les macros 197


Access Livre Page 198 Mercredi, 27. f vrier 2008 7:28 07

encore de la moyenne générale. Si cette partie fonctionne correctement, vous pouvez


poursuivre le travail.
1. Supprimez le MsgBox renvoyant le numéro de matière, devenu inutile.
2. Modifiez la formule de résultat final de la manière suivante : MsgBox "Moyenne géné-
rale : " & Format(DAvg("[NOTATION]", "NOTE", "ID_ELEVE =" & Forms!Frm_
Liste_Eleves!Choix_Eleve & " AND ID_MATIERE = " & VARNOMATIERE), "Fixed"),
vbInformation, "RESULTATS".
On a ajouté une deuxième condition dans la fonction DAvg(), qui concatène l’opérateur
AND et pose la deuxième équation ID_MATIERE = VARNOMATIERE.

3. Présentation du nom et du prénom dans la boîte de dialogue


Afin de parachever cet exercice et approfondir les propriétés des Zones de liste, il faut amé-
liorer la qualité du renvoi de valeur de la dernière boîte de message.
Le nom et le prénom de l’élève sélectionnés ne sont pas intégrés, pour le moment, dans le
programme ; seul le numéro de l’élève est récupéré parce que la colonne liée de la Zone de
liste renvoie la valeur de ce numéro au moment du clic ; c’est la valeur de Forms!Frm_
Liste_Eleves!Choix_Eleve. La fonction Column() de VB va nous permettre de récupérer
nom et prénom de l’élève.
1. En haut de programme, déclarez deux nouvelles variables de chaînes de caractères Dim
VARNOM as String, Dim VARPRENOM as String .
2. En bas de programme (avant le MsgBox final), insérez le code VARNOM = Me.Choix_
Eleve.Column(1).
3. Juste en dessous, saisissez MsgBox VARNOM et testez le programme : la boîte de message
renvoie effectivement le nom de l’élève.
L’expression utilisée nécessite plusieurs explications :
• Pour la première fois, on emploie l’objet Me. Me, suivi d’un point et d’autres objets
dépendants, désigne le formulaire en cours : on aurait pu écrire Forms!Frm_Liste_
Eleves mais cette formule est beaucoup moins rapide d’accès dans le programme et…
plus longue à saisir !
• Me.Choix_Eleve désigne la zone de liste nommée Choix_Eleve dans le formulaire en cours.
• Me.Choix_Eleve.Column désigne une colonne dans la zone de liste citée du formulaire en
cours. Cette expression nécessite un paramètre de numéro de colonne entre parenthèses.
• La numérotation des colonnes commence à 0. Dans la zone de liste présente, la colonne
0 est celle de l’ID_ELEVE, la colonne n˚ 1 est celle de NOM_ELEVE et la colonne n˚ 2
celle de PRENOM_ELEVE.
Le programme final devient :
Private Sub Choix_Eleve_Click()
On Error GoTo Choix_Eleve_Click_Err
Dim VARLIBMATIERE As String
Dim VARNOMATIERE As Integer
Dim VARNOM As String
Dim VARPRENOM As String
VARLIBMATIERE = InputBox("Indiquez la matière recherchée", _
"Calcul de moyenne")
VARNOMATIERE = DLookup("ID_MATIERE", "MATIERE", "NOM_MATIERE='" _
& VARLIBMATIERE & "'")
VARNOM = Me.Choix_Eleve.Column(1)

198 Access® 2007 et VBA


Access Livre Page 199 Mercredi, 27. f vrier 2008 7:28 07

VARPRENOM = Me.Choix_Eleve.Column(2)
MsgBox "La moyenne en " & VARLIBMATIERE & " de " & VARPRENOM & " " _
& VARNOM & " est de : " & Format(DAvg("[NOTATION]", "NOTE",
7
Chapitre

➥_ "ID_ELEVE =" & Forms!Frm_Liste_Eleves!Choix_Eleve & _


" AND ID_MATIERE = " & VARNOMATIERE), "Fixed"), vbInformation,_
"RESULTATS"
Choix_Eleve_Click_Exit:
Exit Sub
Choix_Eleve_Click_Err:
MsgBox Error$
Resume Choix_Eleve_Click_Exit
End Sub
La boîte de message s’apparente au libellé de la figure 7.15.

Figure 7.15
Dernier message
renvoyé dans
l’exercice 1.

EXERCICE 2 MACRO D’ENVOI DE MESSAGES ÉLECTRONIQUES

• Énoncé Créez un formulaire listant les numéros, prénoms et noms des élèves. Un bouton doit y
exécuter une macro qui envoie un message électronique à chacun d’entre eux en lui indi-
quant quelle est sa moyenne. On imaginera que l’adresse internet des élèves est systéma-
tiquement de la forme <prénom>.<nom>@pearson.net. Au courrier dont le texte sera
simplement « Votre moyenne générale est de …. », on joindra le détail des notes sous
format Excel. Traduisez ensuite les macros générées en code Visual Basic.

* Solution 1. Création de la requête à la source du formulaire


La première démarche consiste à créer une requête qui appelle les quatre champs nécessai-
res ID_ELEVE, PRENOM_ELEVE, NOM_ELEVE et la moyenne générale de chacun
d’entre eux ; cette requête servira à l’incrémentation du formulaire à partir duquel sera
lancée la macro.
1. Dans le menu « Créer », cliquez sur « Création de requête ».
2. Insérez les tables « ELEVE » et « NOTE ».
3. Placez les champs « ID_ELEVE », « PRENOM_ELEVE », « NOM_ELEVE »,
« NOTATION » parmi les champs sélectionnés.
4. Cliquez sur le bouton « ∑ Totaux ».
Exercices

5. Conservez l’opération de regroupement aux trois premiers champs et sélectionnez


l’opération Moyenne pour le champ NOTATION.
6. Enregistrez la requête sous le nom « Req_EnvoiMail ».
La requête, dont le code SQL est SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE,
ELEVE.PRENOM_ELEVE, Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM ELEVE INNER

Les macros 199


Access Livre Page 200 Mercredi, 27. f vrier 2008 7:28 07

JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE GROUP BY ELEVE.ID_ELEVE,


ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE; doit avoir la structure graphique de la figure 7.16.

Figure 7.16
Structure de la
première requête
de l’exercice 2.

2. Création du formulaire
Deuxième étape : construire le formulaire à la base de l’envoi des courriers électroniques.
1. Dans le volet de navigation, mettez la requête Req_EnvoiMail en surbrillance (sans
l’ouvrir).
2. Dans le menu « Créer », cliquez sur le bouton « Plusieurs éléments » (qui crée auto-
matiquement un formulaire continu).
3. Enregistrez le formulaire sous le nom « Frm_EnvoiMail ».
4. Modifiez les libellés et formats pour obtenir un résultat sensiblement voisin de la
figure 7.17.

Figure 7.17
Présentation du
formulaire de
l’exercice 2.

200 Access® 2007 et VBA


Access Livre Page 201 Mercredi, 27. f vrier 2008 7:28 07

3. Création de la requête de calcul des notes par élève


Troisième étape : créer la requête qui générera le « carnet de notes » de chaque élève, car-
7
Chapitre

net envoyé sous format Excel.


1. Dans le menu « Créer », cliquez sur le bouton « Création de requête ».
2. Sélectionnez les tables « NOTE » et « MATIERE ».
3. Insérez les champs « ID_ELEVE », « NOM_MATIERE », « NOTATION », « DATE_
NOTE » parmi les champs sélectionnés.
4. Indiquez un ordre croissant à la colonne MATIERE.
5. Insérez le critère suivant dans la colonne ID_ELEVE : [Formulaires]![Frm_Envoi-
Mail]![ID_ELEVE]. Ce critère réservera les résultats de la requête au seul élève actif
dans le formulaire d’envoi.
6. Enregistrez la requête sous le nom « Req_EnvoiNotes ».
La requête, dont le code SQL est SELECT NOTE.ID_ELEVE, MATIERE.NOM_MATIERE,
NOTE.NOTATION, NOTE.DATE_NOTE FROM MATIERE INNER JOIN [NOTE] ON MATIERE.ID_
MATIERE = NOTE.ID_MATIERE WHERE (((NOTE.ID_ELEVE)=[Formulaires]![Frm_
EnvoiMail]![ID_ELEVE])) ORDER BY MATIERE.NOM_MATIERE; doit avoir la structure
graphique de la figure 7.18.

Figure 7.18
Structure de la
deuxième requête
de l’exercice 2.

4. Création de l’envoi des courriers


Quatrième étape : créer la macro d’envoi des courriers.
1. Dans le menu « Créer », cliquez sur « Macro ».
2. Sélectionnez l’action EnvoyerObjet.
3. Sélectionnez Requête pour le premier argument de TypeObjet de l’action Envoyer-
Objet.
4. Choisissez Req_EnvoiNotes dans la liste des requêtes disponibles dans l’argument Nom
d’objet.
Exercices

5. Prenez le format Excel désiré dans l’argument Format de sortie, Excel 2003 ou Classeur
Excel (pour Excel 2007).
6. Dans l’argument À , écrivez la formule =[Formulaires]![Frm_EnvoiMail]![PRENOM_
ELEVE] & "." & [Formulaires]![Frm_EnvoiMail]![NOM_ELEVE] & "@pear-
son.net". Cette formule concatène le prénom, le nom et l’adresse de destination du

Les macros 201


Access Livre Page 202 Mercredi, 27. f vrier 2008 7:28 07

mail. Les références citées font allusion au premier enregistrement en cours dans le
formulaire ; il faudra plus tard réitérer l’opération pour le deuxième et ainsi de suite,
jusqu’à la fin du fichier.
7. Dans l’argument Objet, une simple mention « Vos résultats »1 suffira.
8. L’argument Texte du message peut être plus élaboré : saisissez la formule ="Bonjour,"
& Car(13) & Car(10) & "Votre moyenne générale est de " & Format(Moy-
Dom("[NOTATION]";"NOTE";"ID_ELEVE =" & [Formulaires]![Frm_Envoi-
Mail]![ID_ELEVE]);"Fixe"). Dans cette formule, la détermination de la moyenne
générale est effectuée avec les mêmes paramètres (Format() et MoyDom()) que ceux
du premier exercice. On y a ajouté la formule Car(13) & Car(10) qui génère un saut
de ligne 2. La formule de politesse « Bonjour, » sera donc suivie d’un passage à la ligne
avant le libellé suivant.
9. L’argument Modifier le message, enfin, sera conservé à Oui pour vérifier la qualité des
résultats.
10. Sauvegardez cette macro sous le nom « Mcr_EnvoiMail ».
Pour commencer à tester la macro, il faut que le formulaire Frm_EnvoiMail soit ouvert
et qu’il soit positionné au début de la liste des élèves, il renverra les coordonnées du
premier élève de la liste. L’action EnvoyerObjet de la macro ouvre une session MAPI
Windows (Mail Application Program Interface) qui émule l’outil de messagerie choisi par
défaut (Outlook Express, Outlook ou autres). Le message obtenu est similaire à celui de la
figure 7.19.

Figure 7.19
Mail automatique
envoyé par Access.

Quand la macro sera fonctionnelle, il restera à prévoir le glissement d’un élève au suivant
et l’envoi en chaîne de chacun des mails.
1. Modifiez l’argument Modifier le message de l’action EnvoyerObjet dans la macro
Mcr_EnvoiMail : positionnez-le à Non afin que l’exécution se réalise en bloc 3.
2. Ajoutez une deuxième action AtteindreEnregistrement à la macro Mcr_EnvoiMail.
3. L’argument Type d’Objet est Formulaire.
4. L’argument Nom d’objet est Frm_EnvoiMail.

1. Dans la mesure où il ne s’agit pas d’une formule, le libellé ne nécessite pas de signe égal au début suivi d’une chaîne de caractères entre
guillemets.
2. L’équivalent Visual Basic de Car(13) & Car(10) est vbCrLF (Carriage Return Line Feed) que nous verrons plus loin.
3. Il est recommandé, pour cet exercice, de déconnecter provisoirement la machine de son accès Internet : il sera ainsi plus facile de supprimer
les messages restés dans la Boîte d’envoi (de toute façon, tous les messages seraient signalés avec une adresse invalide).

202 Access® 2007 et VBA


Access Livre Page 203 Mercredi, 27. f vrier 2008 7:28 07

5.
6.
L’argument Enregistrement est Suivant.
Enregistrez les modifications et fermez cette macro.
7
Chapitre

7. Dans le menu « Créer », cliquez sur le bouton « Macro ».


8. Dans la nouvelle macro ouverte, sélectionnez l’action ExécuterMacro.
9. L’argument Nom de macro doit être Mcr_EnvoiMail.
10. L’argument Nombre de répétitions est la formule =CpteDom("[ID_
ELEVE]";"ELEVE")-1, qui compte le nombre d’élèves de la table et retire 1 (le premier
enregistrement déjà traité).
11. Enregistrez la macro sous le nom « Mcr_EnvoiGroupe ».
12. Ouvrez, si nécessaire, le formulaire Frm_EnvoiMail en mode création.
13. Dans l’en-tête de formulaire, insérez un bouton de commande.
14. À l’étape 1 de l’assistant Bouton de commande, choisissez Divers dans le pavé des
Catégories et Exécuter une macro dans le pavé des Actions.
15. Sélectionnez la macro Mcr_EnvoiGroupe dans la deuxième étape.
16. Choisissez l’option Texte dans la troisième étape, avec pour libellé Lancer un envoi
groupé.
17. Nommez le bouton « Envoi » dans la dernière étape.

Attention
Les tests, à partir de cet instant, portent sur les 26 enregistrements de la table et ne peuvent être
interrompus. Le plus souvent, l’envoi automatique de mails depuis Access génère dans l’outil de
messagerie une fenêtre d’alerte prévenant qu’un programme externe tente d’accéder à la messa-
gerie : il est nécessaire alors de modifier les options de la messagerie (Centre de gestion de la
confidentialité dans Outlook par exemple) afin d’autoriser les envois automatiques.

La traduction en code Visual basic de la macro Mcr_EnvoiGroupe donne le résultat affiché


à la figure 7.20.

Figure 7.20
Code de la macro
d’envoi groupé.
Exercices

Les macros 203


Access Livre Page 204 Mercredi, 27. f vrier 2008 7:28 07

La traduction en code Visual basic de la macro Mcr_EnvoiMail donne le résultat affiché à


la figure 7.21.

Figure 7.21
Code de la macro
d’envoi d’un mail.

Pour mettre en place d’une boucle de répétition des envois, deux macros ont été nécessaires.
En fait, et dans un code Visual Basic bien monté, il est plus judicieux de réunir ces deux
morceaux de code en un seul sous la tournure suivante :
Function Mcr_EnvoiGroupe()
On Error GoTo Mcr_EnvoiGroupe_Err
Dim i As Integer
For i = 1 To DCount("[ID_ELEVE]", "ELEVE")
DoCmd.SendObject acQuery, "Req_EnvoiNotes",
➥"ExcelWorkbook(*.xlsx)",
➥Forms!Frm_EnvoiMail!PRENOM_ELEVE & "." &
➥Forms!Frm_EnvoiMail!NOM_ELEVE & "@pearson.net",
➥"", "", "Vos résultats" ,
➥"Bonjour," & Chr(13) & Chr(10) & "Votre moyenne générale
➥est de " & Format(DAvg("[NOTATION]",
➥"NOTE", "ID_ELEVE =" & Forms!Frm_EnvoiMail!ID_ELEVE),
➥"Fixed"), False, ""
DoCmd.GoToRecord acForm, "Frm_EnvoiMail", acNext
Next
Mcr_EnvoiGroupe_Exit:
Exit Function
Mcr_EnvoiGroupe_Err:
MsgBox Error$
Resume Mcr_EnvoiGroupe_Exit
End Function
L’expression For i = 1 To DCount("[ID_ELEVE]", "ELEVE") démarre une boucle qui
tournera depuis la valeur 1 jusqu’au nombre total d’élèves de la table. Elle est fermée par
l’expression Next située avant la gestion d’erreurs 1. Entre ces deux lignes, la totalité du
code de la macro Mcr_EnvoiMail peut être récupérée.

1. Il n’est pas possible, ici, d’expliquer longuement le fonctionnement des boucles. Pour plus de détails, se référer aux chapitres sur VBA dans
le livre Excel 2007 du même auteur dans la même collection.

204 Access® 2007 et VBA


Access Livre Page 205 Mercredi, 27. f vrier 2008 7:28 07

Le langage VBA sous


8
Chapitre

Access

1. Le lancement de requêtes SQL


L’utilisation du code VBA donne à Access des per-
sous VBA ............................... 206 formances et des capacités très supérieures à celles
2. L’utilisation de la notion
de RecordSet......................... 208 qui sont disponibles sous l’interface graphique,
3. L’automation ......................... 215
tant dans l’affichage des données que dans leur
Problèmes et exercices
1. Un programme de notation .... 219 traitement. Ce chapitre présente l’exécution
2. Travail sur jeu de requêtes SQL écrites avec le programme VBA,
d’enregistrements .................. 224
3. Une automation puis une méthode pour charger des données en
Access/Word........................ 231
mémoire afin de les traiter sans même les afficher.
Enfin, nous étudierons les rudiments de l’automa-
tion, permettant d’exécuter des applications Office
depuis Access.

205
Access Livre Page 206 Mercredi, 27. f vrier 2008 7:28 07

(1) Le lancement de requêtes SQL sous VBA


La commande DoCmd.RunSQL de VBA exécute une requête SQL écrite dans le langage que
nous avons étudié en même temps que les requêtes elles-mêmes. Cette commande est
rarement utile quand il s’agit de requêtes Sélection (utilisant le mot-clé SELECT du lan-
gage SQL), mais elle devient très efficace lorsqu’il s’agit d’exécuter des requêtes SQL telles
que INSERT, UPDATE ou DELETE. Voici un exemple d’action de cette commande pour
insérer puis supprimer un enregistrement de la table CODES_POSTAUX. Les premières
actions génèrent le code SQL de la requête à partir de l’interface graphique d’ACCESS.
1. Ouvrez la base de données « CODES_POSTAUX ».
2. Créez une nouvelle requête d’insertion (Créer, puis Création de requête, ne sélection-
ner aucune table, puis choisir Ajout dans le ruban et sélectionner la table CODES_
POSTAUX) pour ajouter un enregistrement à la table CODES_POSTAUX dont le
code est 99999 et la ville MONCLOCHER ; la requête, dont le code SQL est INSERT
INTO CODE_POSTAL ( CODE, VILLE ) SELECT "99999" AS CODE, "MONCLOCHER" AS
VILLE; se retrouve dans la structure graphique de la figure 8.1. La table CODE_POS-
TAL n’est pas présente dans la fenêtre supérieure (afin d’éviter une insertion d’autant
de lignes que n’en compte la table elle-même) 1.

Figure 8.1
Requête d’insertion.

On peut ensuite sélectionner le code SQL généré et l’insérer dans un programme Visual
Basic.
3. Cliquez sur le mode d’affichage SQL de la requête et copiez son texte (Ctrl + C).
4. Accédez à Visual Basic au moyen de la combinaison des touches Alt + F11.
5. Dans la fenêtre des projets, cliquez du bouton droit sur Modules et Sélectionnez
« Insertion > module ».
6. Dans la fenêtre des propriétés (si elle n’est pas présente sélectionner Affichage > Fenê-
tre Propriétés ou F4), en bas à gauche, renommez le module Module1 par « Essais ».
7. Entrez le début de code suivant :
Sub Insertion_CodePostal()
DoCmd.RunSQL "
End Sub

1. La syntaxe INSERT INTO CODE_POSTAL ( CODE, VILLE ) VALUES ("99999","MONCLOCHER"); est également valide.

206 Access® 2007 et VBA


Access Livre Page 207 Mercredi, 27. f vrier 2008 7:28 07

La structure de la procédure Insertion_CodePostal() est en place. Il faut maintenant


modifier son contenu pour y écrire le code de la requête SQL précédemment copiée.
8
Chapitre

8. Collez (Ctrl + V) le texte du presse-papier entre les guillemets de la commande


RunSQL.
9. Doublez les guillemets qui cernent déjà les chaînes 99999 et MONCLOCHER.
10. Veillez à ce que la chaîne SQL tout entière soit également entre guillemets de sorte
d’obtenir le code suivant :
Sub Insertion_CodePostal()
DoCmd.RunSQL "INSERT INTO CODE_POSTAL ( CODE, VILLE ) _
SELECT ""99999"" AS CODE, ""MONCLOCHER"" AS VILLE;"
End Sub
11. Exécutez le code en appuyant sur F5 (ou en cliquant sur le triangle vert de la barre
d’icônes, ou en sélectionnant l’option de menu Exécution > Exécuter Sub/User-
Form).
12. Access renvoie un message d’avertissement, prévenant qu’un enregistrement va être
ajouté : validez-le.
13. Si le code est réexécuté une seconde fois, Access donnera le même message d’avertis-
sement, mais refusera dans une deuxième fenêtre de réaliser l’insertion en raison de
l’existence d’un doublon parmi les codes postaux.
Afin de supprimer cet enregistrement fantaisiste, nous allons créer une nouvelle procé-
dure Visual Basic faisant appel à un procédé voisin. Il est possible, dès lors que la syntaxe
SQL est bien assimilée, d’écrire directement le code suivant, à la suite de la procédure
précédente :
Sub Suppression_CodePostal()
Dim strSQL As String
strSQL = "DELETE FROM CODE_POSTAL WHERE CODE = ""99999"""
DoCmd.RunSQL strSQL
End Sub
Dans cette deuxième présentation, la démarche met en œuvre une variable de type chaîne
de caractères. On affecte à la variable strSQL (pour String SQL) le texte de la requête SQL,
puis on cite la variable après la commande RunSQL. Cette présentation est particulière-
ment utile lorsque la requête contient de nombreux paramètres (on peut alors activer le
mode débogage pour vérifier la valeur des variables) et lorsqu’elle est longue (on découpe
alors en autant de variables qu’il existe, par exemple, de lignes de requête : une variable
pour la ligne INSERT, une pour la ligne FROM, une pour la ligne WHERE, etc.).
Ce code est particulièrement intéressant car il permet au programmeur de ne pas obliga-
toirement afficher des données pour procéder à des manipulations sur la base. Cette orga-
nisation s’adapte surtout aux environnements client/serveur, dans lesquels il n’est pas
toujours nécessaire (et même déconseillé) de charger des masses de données importantes
sur le poste client. On peut imaginer, par exemple, un simple formulaire dépourvu de
toute source de données natives, qui charge le minimum d’informations indispensables à
l’utilisateur, procède à tous les contrôles de forme et génère une seule commande de mise
à jour (Insert, Update, Delete). Ce processus s’avère évidemment très lointain de la démar-
che conventionnelle d’Access où tout formulaire charge toutes les données de plusieurs tables
gérées en monoposte.

Le langage VBA sous Access 207


Access Livre Page 208 Mercredi, 27. f vrier 2008 7:28 07

(2) L’utilisation de la notion de RecordSet


Lorsqu’un formulaire est ouvert avec une source de données (propriété RecordSource du
formulaire), il charge dans le même temps un jeu d’enregistrements, RecordSet en améri-
cain. Le jeu d’enregistrements se constitue des enregistrements chargés, avec leur ordon-
nancement et leurs colonnes, provenant d’une table ou d’une requête. Ils sont « montés »
en mémoire afin de les afficher plus rapidement.
Ce chargement en mémoire s’effectue également via l’interface de programmation nom-
mée DAO (Data Access Objects). Dès lors, le programmeur peut « jouer » avec ces enregis-
trements, les afficher ou les mettre à jour comme il l’entend, sans qu’aucune interface
homme/machine n’intervienne.
On a adjoint à DAO, depuis sa création, une autre interface, ADO (ActiveX Data Objects).
Les deux interfaces de programmation sont dotées chacune d’objets RecordSet dont la
manipulation diffère légèrement. On déclarera donc un RecordSet en précisant toujours
l’interface utilisée.
De plus, DAO et ADO ne sont pas nécessairement chargés sur la machine, il est nécessaire
de s’en assurer en faisant les vérifications suivantes :
1. Accédez à Visual Basic en utilisant la combinaison des touches Alt + F11.
2. Dans le menu général, cliquez sur « Outils > Références ».
3. Cochez les options (si elles ne le sont pas déjà) Microsoft Office 12.0 Access Data Engine
Library (DAO) et Microsoft ActiveX Data Objects 6.0 Library (ADO) comme le montre
la figure 8.2.

Figure 8.2
Paramétrage des
interfaces chargées
sous Visual Basic
pour Access.

2.1 CHARGEMENT DES RECORDSET

Au lieu d’ouvrir un formulaire affichant les codes postaux, nous allons les charger en
mémoire et les afficher grâce à un programme que nous nous proposons d’écrire. La première
procédure s’appellera Lecture_Recordset().

208 Access® 2007 et VBA


Access Livre Page 209 Mercredi, 27. f vrier 2008 7:28 07

1. Saisissez le code suivant dans un module Visual Basic : Sub Lecture_RecordSet() ;


VB insère automatiquement un End Sub avant lequel sera saisi le code.
8
Chapitre

2. Entrez la déclaration Dim db as DAO.Database ; cette ligne déclare une variable


nommée db de type objet, l’objet étant une base de données connectée sous l’interface
DAO.
3. Entrez la déclaration Dim rst as DAO.RecordSet ; cette ligne déclare une variable
nommée rst de type objet, l’objet étant un jeu d’enregistrements. Ces deux lignes de
déclarations sont obligatoires (contrairement aux autres variables VB qui sont le plus
souvent facultatives).
4. Saisissez Set db = Application.CurrentDb  ; le mot-clé SET attribue une référence
d’objet à la variable qui avait été déclarée auparavant. Ici, db fera référence désormais
à la base de données courante de l’application en cours (en l’occurrence la base Access
CODES_POSTAUX).
5. Entrez Set rst = db.OpenRecordSet("CODE_POSTAL")  : la variable rst fera réfé-
rence au jeu d’enregistrements constitué par la table CODE_POSTAL. On notera que
la table est citée entre guillemets ; on aurait tout aussi bien pu citer entre guillemets
une requête SQL SELECT tout entière ou bien une variable string contenant le texte
de la requête. Le mot-clé OpenRecordSet ouvre le jeu d’enregistrements, c’est-à-dire
qu’il le charge en mémoire vive 1.
6. Saisissez le code suivant, qui permettra un affichage en boucle jusqu’à ce que l’utilisateur
ne l’interrompe.
Dim i as integer
i = 1
Do While i = 1
i = MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _
"Visualisation du RecordSet")
rst.MoveNext
Loop
Rst.Close
Set rst = Nothing
Set db = Nothing
La valeur 1 est tout d’abord attribuée à la variable i.
La ligne suivante démarre une boucle qui réitérera les lignes suivantes (jusqu’au Loop),
jusqu’à ce que la valeur i ne soit plus égale à 1.
La variable variable i, à la troisième ligne, prend la valeur renvoyée par une boîte de mes-
sage dotée de deux boutons : OK et Annuler. Si l’utilisateur clique sur OK, la valeur ren-
voyée par la boîte de message à i est 1 ; si l’utilisateur clique sur Annuler, la boîte renvoie la
valeur 2 et le programme sort de la boucle.
Le contenu de la boîte (prompt) est constitué des deux colonnes de la table CODE_POS-
TAL, exprimées volontairement de manières différentes :
• L’expression rst.Fields(0).value renvoie la valeur du premier champ de la table.
Attention ! la numérotation commence à 0 et non à 1. rst fait référence au RecordSet,
Fields désigne le champ et Value sa propriété de contenu.

1. La commande OpenRecordSet() comprend également un paramètres de mode d’ouverture du recordset qui n’a pas été précisé. Si la source
est une table non liée (présente dans la base), par défaut l’ouverture se fait en mode table ; si la source est une requête ou une table liée, par
défaut l’ouverture se fait en mode Dynaset. Il existe deux autres modes d’ouverture (SnapShot ou Instantané et ForwardOnly) qui gèrent le
curseur différemment.

Le langage VBA sous Access 209


Access Livre Page 210 Mercredi, 27. f vrier 2008 7:28 07

• L’expression rst("VILLE") désigne directement le contenu du champ VILLE pour


l’enregistrement en cours. Les deux notations sont équivalentes, mais la première sera
choisie de préférence si l’indice de colonne (ici 0) est précisé avec des variables.
• L’expression rst.MoveNext, enfin, déplace le curseur d’une position vers l’avant, notion
que nous verrons dans le paragraphe suivant.
• La commande rst.Close ferme le jeu d’enregistrements. Elle est indispensable dans un
code bien écrit, de même que l’annulation des références des deux lignes suivantes (Set
rst = Nothing et Set db = Nothing).
Le code écrit donne globalement la rédaction suivante :
Sub Lecture_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL")
i = 1
Do While i = 1
i= MsgBox(rst.Fields(0).Value & " " & rst("VILLE"), vbOKCancel, _
"Visualisation du RecordSet")
rst.MoveNext
Loop
Rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Lors de l’exécution, on verra s’afficher successivement tous les codes postaux et les villes
associées jusqu’à ce que l’utilisateur clique sur Annuler.

2.2 DÉCOMPTE DES ENREGISTREMENTS DANS UN RECORDSET ET DÉPLACEMENTS

La notion de curseur doit être finement appréhendée car elle est primordiale dans les jeux
d’enregistrements. A priori et en premier lieu, il est quasi indispensable d’insérer un ordre
précis dans la requête à la base d’un jeu d’enregistrements (une clause ORDER BY dans
SQL) : l’ordre des enregistrements est totalement imprévisible dans la table. Il faut donc
en prescrire un afin d’être sûr des résultats escomptés en cas de mises à jour.
Au moment de l’ouverture, le curseur se trouve en début de jeu d’enregistrements 1.
L’enregistrement lu est le premier et la commande rst.MovePrevious (aller à l’enregistre-
ment précédent) génère un message erreur. La commande MoveNext positionne le curseur
à l’enregistrement suivant, la commande MoveLast le positionne immédiatement sur le
dernier.
Ces commandes peuvent être combinées avec les propriétés BOF (Beginning Of File) et EOF
(End Of File) dont il faudra appréhender les subtilités. Lorsque le jeu d’enregistrements
est ouvert, le curseur est positionné sur le premier enregistrement, mais la propriété
rst.BOF est positionnée à FALSE (faux) ; ainsi, dans l’exemple du paragraphe précédent, si
la condition suivante est posée :
If Not rst.BOF Then

1. Mais il n’est pas inutile d’insérer une commande MoveFirst pour s’en assurer dans tous les cas de figure.

210 Access® 2007 et VBA


Access Livre Page 211 Mercredi, 27. f vrier 2008 7:28 07

rst.MovePrevious
End If
8
Chapitre

Le programme renverra assurément une erreur.


De la même manière, lorsque le curseur arrive sur le dernier enregistrement, la propriété
EOF est positionnée à FALSE et ce n’est qu’après une commande MoveNext que la pro-
priété passera à TRUE (vrai), trop tard pour éviter un message erreur. Ces propriétés ne
seront donc utilisées qu’à bon escient, par exemple dans le cadre du décompte des enre-
gistrements d’un jeu.
Au moment où un RecordSet est chargé, le système, en effet, ne connaît pas le nombre
d’enregistrements qu’il contient : la propriété RecordCount n’est pas opérationnelle. Il est
nécessaire de balayer tous les enregistrements du jeu pour en connaître la taille. Ci-après,
un exemple de code qui compare deux décomptes d’enregistrements avant et après
balayage du jeu 1 :
Sub Decompte_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)
MsgBox "Décompte avant balayage : " & rst.RecordCount, , "Décompte 1"
If Not rst.EOF Then
rst.MoveLast
End If
MsgBox "Décompte après balayage : " & rst.RecordCount, , "Décompte 2"
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
La première boîte de message, avant balayage, ne décompte qu’un seul enregistrement
alors que la seconde en compte 8 009.

2.3 RECHERCHE DES ENREGISTREMENTS DANS UN RECORDSET

Les méthodes FindFirst, FindLast, FindNext, FindPrevious et NoMatch sont les outils
de base des recherches dans un jeu d’enregistrements. On se propose, ici, d’afficher au fur
et à mesure les préfectures qui commencent par ST. Le programme suivant va ouvrir un
jeu d’enregistrements contenant tous les codes postaux puis balayer le recordset en s’arrêtant
chaque fois qu’une occurrence est trouvée.
Sub Recherche_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)
rst.FindFirst "CODE LIKE '*000' AND VILLE LIKE 'ST*'"
While Not rst.NoMatch
MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures commençant par ST"
rst.FindNext "CODE LIKE '*000' AND VILLE LIKE 'ST*'"
Wend

1. Ici, l’ouverture en mode Dynaset (le plus fréquent) a été précisé pour éviter une ouverture en mode table, dont la gestion de curseur est
différente.

Le langage VBA sous Access 211


Access Livre Page 212 Mercredi, 27. f vrier 2008 7:28 07

rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
On prêtera une attention particulière à la tournure de la boucle et son ordonnancement :
• Le RecordSet est ouvert et le curseur se trouve positionné au premier enregistrement.
• Une première ligne de code lance une recherche : le curseur se positionne sur le premier
enregistrement concordant (ST BRIEUC).
• La boucle démarre avec une condition de concordance (Not et NoMatch équivalent à
« Match »). La propriété NoMatch étant positionnée à FALSE, l’expression Not
Nomatch équivaut à TRUE : l’enregistrement en cours s’affiche.
• Une nouvelle recherche est lancée (FindNext).
• Et ainsi de suite jusqu’à la fin du jeu d’enregistrements.
Cette structure est rendue obligatoire par la logique : si la première ligne de code compre-
nant le FindFisrt est supprimée, l’affichage commence par celui du code 01000 de BOURG
EN BRESSE (qui ne répond pas aux critères demandés) et se poursuit par les quatre autres
(respectant les critères).
Dans cet exemple, c’est volontairement que le RecordSet initial contenait tous les enregis-
trements de la table et qu’une recherche sélective y était appliquée. Naturellement, une
autre solution consiste à ne sélectionner dans le jeu d’enregistrements que les enregis-
trements respectant les critères pour, ensuite, les afficher tous. Ci-après le code de cette
seconde formulation, utilisant la propriété EOF :
Sub Affichage_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL +
WHERE CODE LIKE '*000' AND VILLE LIKE 'ST*'")
While Not rst.EOF
MsgBox rst.Fields(0) & " " & rst.Fields(1), , "Préfectures+ commençant
➥par ST"
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub

2.4 MODIFICATION DES ENREGISTREMENTS D’UN RECORDSET

Jusqu’à présent, les enregistrements d’un RecordSet ont été simplement lus sans aucune
modification. S’il est nécessaire de modifier des données, il faut prendre en compte le fait
que les données sont chargées en mémoire vive et que les modifications ne vont toucher que
ces données en mémoire et non celles qui sont enregistrées sur le disque. Il faut donc
procéder en deux étapes : modifier les données dans le RecordSet puis appliquer ces modi-
fications aux données écrites sur le disque.
Cette problématique touche également la manière dont le jeu d’enregistrements a été
ouvert. En environnement multi-utilisateurs, il faut empêcher un utilisateur de modifier

212 Access® 2007 et VBA


Access Livre Page 213 Mercredi, 27. f vrier 2008 7:28 07

des données déjà en cours de modification par un autre. On précisera donc le mode
d’ouverture dans l’action OpenRecordSet (paramètre que nous n’avons pas encore étudié)
en indiquant quel type de verrou (lock) est posé sur les données ; trois cas de figure sont
8
Chapitre

envisageables :
• La méthode OpenRecordSet est paramétrée avec le verrou dbReadOnly (valeur VB : 4)
et le jeu d’enregistrements n’est pas modifiable.
• L’ouverture du jeu est opérée avec le type de verrou dbPessimistic (valeur VB : 2) et tou-
tes les données de la base concernées sont verrouillées dès la commande d’ouverture
jusqu’à la commande de fermeture : aucun autre utilisateur ne peut y faire de mises à
jour. C’est l’option par défaut prise par Access si aucun paramètre n’est précisé.
• L’ouverture du jeu est opérée avec le type de verrou dbOptimistic (valeur VB : 3) et les
données concernées ne sont verrouillées que lorsque la première mise à jour (Update) a
été effectuée.
Le programme ci-après ouvre la table CODE_POSTAL en mode ReadOnly (le dernier
paramètre de la méthode OpenRecordSet est à 4), positionne le curseur au niveau du code
75001 et modifie le libellé PARIS par PARIS 1er. La mise à jour éventuelle est conditionnée
par la propriété UpDatable (possibilité de modification) du jeu d’enregistrements.
Sub Modification_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset, , 4)
rst.FindFirst "CODE = '75001' "
If rst.Updatable = True Then
rst.Edit
rst("VILLE") = "PARIS 1er"
rst.Update
Else
MsgBox "La table ne peut pas être mise à jour", , "Contrôle d’accès"
End If
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Comme le paramètre 4 de la cinquième ligne de programme n’ouvre le jeu d’enregistre-
ment qu’en lecture seule, le message erreur programmé constitue le choix logique de la
procédure. Si, en revanche, le paramètre 2 ou 3 (ou aucun) vient en remplacement, le
RecordSet est modifiable (UpDatable) et l’exécution s’opère de la manière suivante :
• la commande rst.Edit copie l’enregistrement en cours dans une mémoire tampon ;
• la ligne rst("VILLE") = "PARIS 1er" affecte la valeur Paris 1er au champ VILLE de
l’enregistrement stocké dans la mémoire tampon.
L’enregistrement sur le disque, à ce stade, n’est donc pas réalisé. C’est la commande
rst.Update de la ligne suivante qui met à jour la table.

2.5 AJOUT ET SUPPRESSION D’ENREGISTREMENTS

L’ajout d’enregistrements respecte une syntaxe voisine de la modification. On prendra


garde au fait que le contrôle de valeur des données s’opère de la même manière que si

Le langage VBA sous Access 213


Access Livre Page 214 Mercredi, 27. f vrier 2008 7:28 07

l’insertion était faite manuellement, à la différence près que le programme s’interrompt en


cas d’insertion non valide. Dans l’exemple suivant, on cherchera à insérer un code 123456
qui ne respecte pas la longueur maximum de code postal, ce qui occasionnera une erreur
d’exécution.
Sub Insertion_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("CODE_POSTAL", dbOpenDynaset)
rst.AddNew
rst("Code") = "123456"
rst("VILLE") = "VILLE-ERREUR"
rst.Update
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Quand le code est exécuté pas à pas (F8), on peut vérifier que l’interruption du pro-
gramme intervient non pas au moment du rst.Update final , mais dès la ligne
rst("Code") = "123456"  : le contrôle est réalisé dès l’affectation de la valeur à la
mémoire tampon car le RecordSet contient déjà les caractéristiques des champs de
la table.
En revanche, il est clair que le programme ne peut pas contrôler immédiatement l’exis-
tence de doublons : si le code postal à insérer existe déjà dans la table source, la procédure
sera interrompue au moment du rst.Update et non avant. De la même manière, il ne
peut pas exister de contrôle sur la valeur de clés étrangères : si une valeur de clé étrangère
inexistante dans la table mère est insérée dans une table liée par une contrainte d’intégrité
référentielle, le message erreur n’interviendra qu’au moment du rst.Update. Plus grave:
s’il n’existe pas de contrainte d’intégrité référentielle, une insertion erronée aura lieu.
La suppression d’enregistrements via un RecordSet, enfin, est relativement peu employée.
Il est plus cohérent et plus direct d’exécuter sous VB une requête SQL comportant la syn-
taxe DELETE. On trouvera, ci-après, un exemple dans lequel sont supprimés tous les enre-
gistrements dans lesquels la ville commence par XYZ.
Sub Suppression_RecordSet()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM CODE_POSTAL WHERE VILLE LIKE 'XYZ*'")
While Not rst.EOF
rst.Delete
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Le programme, évidemment, n’effectuera aucune suppression car il n’existe aucune ville
répondant au critère précisé. On notera surtout qu’ici la commande rst.Update est inter-
dite : la suppression est immédiate.

214 Access® 2007 et VBA


Access Livre Page 215 Mercredi, 27. f vrier 2008 7:28 07

(3) L’automation
8
Chapitre

Comme tous les produits de la gamme Office, Access comprend, via VBA, tous les outils
pour pratiquer l’automation, en d’autres termes la manipulation « à distance » d’autres
applications simultanément à Access.
Nous avons déjà étudié, dans le chapitre 3, comment importer des données Excel vers
Access et comment exporter des données Access vers Excel. Dans l’exemple qui suit, nous
allons mettre en œuvre un procédé qui démarre à distance Excel, crée un tableau, insère
des valeurs à partir d’un recordset et referme le fichier Excel. Il s’agit là d’un nouveau pro-
cédé d’exportation qui possède de nombreux avantages car il autorise tous les paramétrages
imaginables.
Avant de commencer cette partie, il est nécessaire de vérifier que la bibliothèque nécessaire
est chargée. Cliquez dans VBA sur « Outils > Références » et cochez, le cas échéant, la
bibliothèque Microsoft Excel 12.0 Object Library comme le montre la figure 8.3.

Figure 8.3
Chargement de la
bibliothèque des
objets Excel.

Décomposons le programme d’échange Access/Excel ligne par ligne.


1. Dans un module déjà créé, créez une procédure : Sub Echange_xlsx_accdb().
2. Entrez la déclaration Dim prog_xlsx As Excel.Application  : cette déclaration pré-
pare un objet application Excel. Il ne s’agit que d’une simple déclaration dont les effets
immédiats sont nuls.
3. Entrez la déclaration Dim fic_xlsx As Excel.Workbook  : cette déclaration prépare
un objet fichier Excel. Il ne s’agira pas du fichier lui-même, mais d’une référence à
l’objet.
4. Entrez les déclarations déjà connues, aptes à gérer un jeu d’enregistrements, Dim db
as DAO.Database et Dim rst As DAO.Recordset.
5. Une dernière déclaration Dim i as Integer définit un compteur.
6. La ligne Set db = Application.CurrentDb affecte pour référence à l’objet db la base
de données active.

Le langage VBA sous Access 215


Access Livre Page 216 Mercredi, 27. f vrier 2008 7:28 07

7. La ligne Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL


WHERE CODE LIKE '*000' ") crée un jeu d’enregistrements contenant les codes
postaux et villes de toutes les préfectures.
8. L’ouverture du jeu d’enregistrements est suivi des deux commandes rst.MoveLast et
rst.MoveFirst. Ces dernières sont destinées à balayer le jeu et assurer que son
décompte sera exact.
9. La onzième ligne de programme démarre à distance Excel : Set prog_xlsx = New
Excel.Application. L’objet étant déclaré au préalable, cette commande équivaut
exactement aux gestes de l’utilisateur qui cliquerait sur Démarrer > Program-
mes > Microsoft Excel.
10. La ligne suivante rend l’application visible prog_xlsx.Visible = True. En effet, lors-
que la ligne précédente est exécutée, une session Excel démarre (on peut le vérifier en
consultant les processus en cours dans le Gestionnaire des tâches Windows), mais tout
ce qui va suivre pourrait être exécuté en tâche de fond, sans visualisation graphique.
11. Set fic_xlsx = prog_xlsx.Workbooks.Add . équivaut à la manipulation
Fichier > Nouveau dans Excel. À partir de cet instant, l’application Excel est « pilotée
à distance » : tous les objets seront référencés à partir du « préfixe » fic_xlsx pour désigner
cet objet et non pas un autre fichier ouvert simultanément par exemple.
12. La commande fic_xlsx.Sheets(1).Name = "Préfectures" donne au premier
onglet du classeur Excel le nouveau nom de « Préfectures » en lieu et place de Feuil1,
créé par défaut. La syntaxe Sheets(1).Name = « xxxx », bien connue des program-
meurs sous Excel, est simplement préfixée par la référence à l’objet créé dans le même
programme.
13. Les commandes fic_xlsx.Sheets(1).Range("A1").Value = "CODE" et fic_
xlsx.Sheets.Range("B1").Value = "PREFECTURE" attribuent aux cellules A1 et B1
les noms des colonnes. Ici l’objet Range d’Excel qui désigne une cellule a été utilisé.
Remarque : la notation doit comprendre la référence au classeur, puis celle de la
feuille 1, puis celle de la cellule, et enfin les coordonnées cartésiennes de la cellule.
14. La ligne For i = 2 To rst.RecordCount démarre une boucle avec pour valeur de i le
chiffre 2 correspondant à la deuxième ligne du tableau Excel (la première est occupée
par les noms de colonnes). Les lignes de commandes suivantes, et jusqu’à la ligne
Next, seront réitérées autant de fois qu’il y a d’enregistrements dans le RecordSet.
15. fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE") attribue à la ligne i du
tableur la valeur du champ CODE dans l’enregistrement en cours. Ici, on a choisi la
syntaxe Cells(x,y) d’Excel et non celle de Range() car la référence numérique se conjugue
avec la variable i.
16. fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE") fait la même opération
avec la deuxième colonne.
17. Le curseur est avancé d’une position par la commande suivante rst.MoveNext.
18. La 21e ligne de programme ne comprend qu’un simple Next qui ferme la boucle
ouverte au point 14.
19. Le fichier Excel est enregistré automatiquement par la commande fic_xlsx.SaveAs
"C:\PREFECTURES.XLSX" qui est copié ici à la racine du disque dur.
20. Le fichier Excel (et non l’application) est fermé par la commande fic_xlsx.Close.

1. Sheets(1) désigne la première feuille du classeur qu’on aurait aussi pu appeler Sheets ("Préfectures").

216 Access® 2007 et VBA


Access Livre Page 217 Mercredi, 27. f vrier 2008 7:28 07

21. L’application Excel est fermée par la commande prog_xlsx.Quit.


22. La référence à l’objet Excel est supprimée par la commande Set prog_
8
Chapitre

xlsx = Nothing.
23. Les trois dernières lignes de programme ferment les références au RecordSet, comme
on l’a déjà vu précédemment.
Au total, le programme s’écrit donc :
Sub Echange_xlsx_accdb()
Dim prog_xlsx As Excel.Application
Dim fic_xlsx As Excel.Workbook
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT CODE, VILLE FROM CODE_POSTAL WHERE
➥CODE LIKE '*000'")
rst.MoveLast
rst.MoveFirst

Set prog_xlsx = New Excel.Application


prog_xlsx.Visible = True
Set fic_xlsx = prog_xlsx.Workbooks.Add
fic_xlsx.Sheets(1).Name = "Préfectures"
fic_xlsx.Sheets(1).Range("A1").Value = "CODE"
fic_xlsx.Sheets(1).Range("B1").Value = "PREFECTURE"
For i = 2 To rst.RecordCount
fic_xlsx.Sheets(1).Cells(i, 1).Value = rst("CODE")
fic_xlsx.Sheets(1).Cells(i, 2).Value = rst("VILLE")
rst.MoveNext
Next

fic_xlsx.SaveAs "C:\PREFECTURES.XLSX"
fic_xlsx.Close
prog_xlsx.Quit
Set prog_xlsx = Nothing

rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Plusieurs commentaires ne sont pas inutiles pour achever cette approche de l’échange de
données :
• Il existe également une méthode CopyFromRecordSet qui transfère directement des
données selon une procédure sensiblement équivalente à celle qui vient d’être dévelop-
pée. Cette méthode livre « en bloc » les données, et donc de manière un peu hâtive,
alors que le procédé qui vient d’être montré a l’avantage de pouvoir supporter de
multiples paramètres.
• De la même manière que l’échange de données est possible, toutes les opérations de
pilotage à distance (formatage, mise en place de calculs, etc.) sont imaginables.
• La propriété Visible de l’application destination peut être supprimée de sorte que les
opérations se déroulent en tâche de fond et le fichier Excel se constitue à l’insu même de
l’utilisateur.

Le langage VBA sous Access 217


Access Livre Page 218 Mercredi, 27. f vrier 2008 7:28 07

Résumé
L’utilisation de Visual Basic permet la mise au point de programmes complets, passant par
tous les systèmes d’entrées/sorties (MsgBox(), InputBox()), toutes les gestions de variables
et organisations en boucle (While…Loop, Until…Loop, For…Next) qu’un langage de
programmation fournit classiquement.
VB supporte également l’exécution de commandes SQL programmées (DoCmd.RunSQL)
et non pas seulement lancées via l’interface graphique d’Access. Les mises à jour, inser-
tions ou suppressions de données sont dès lors contrôlées et automatisées dans des procé-
dures dont le programmeur a la totale maîtrise.
Détachée des formulaires, la notion de RecordSet recouvre le chargement en mémoire vive
de données extraites des tables Access et leur manipulation avant recopie éventuelle sur le
disque. Une syntaxe particulière s’y attache, qui prévoit l’utilisation d’un curseur parcourant
les données.
Dans Access, enfin, et comme dans tout programme Office, toutes les fonctionnalités
d’automation permettent au programmeur de piloter à distance d’autres applications ins-
tallées sur la machine client. Ainsi, les échanges Excel/Access, par exemple, peuvent-ils être
gérés depuis Access en utilisant le langage objet qu’est VBA.

218 Access® 2007 et VBA


Access Livre Page 219 Mercredi, 27. f vrier 2008 7:28 07

Problèmes et exercices
8
Chapitre

EXERCICE 1 UN PROGRAMME DE NOTATION

• Énoncé On se propose de créer un formulaire qui permettra aux professeurs de noter les élèves
de la base de données ECOLE_INTERNATIONALE. Dans la mesure où il y a plusieurs
matières (donc plusieurs professeurs), le programme sera installé en réseau. En consé-
quence, le formulaire ne sera basé sur aucune source de données ; la démarche de notation
sera la suivante :
• Le professeur ouvre une zone de liste déroulante et choisit sa matière.
• Une zone de liste, en dessous, s’affiche et montre la liste des élèves ayant déjà eu une
note pour cette matière (elle se réactualise à chaque choix de matière).
• Le professeur peut sélectionner un et un seul élève.
• Au moment du choix, s’affichent à l’écran une zone de texte avec la date du jour
(modifiable), une zone de texte rappelant le nom de l’élève choisi (non modifiable),
une zone de texte vide pour entrer la note, un bouton pour valider la note et un bouton
pour annuler l’opération.
Aux différences près de présentation, le formulaire doit avoir la structure de la figure 8.4
au moment de la validation d’une note.

Figure 8.4
Formulaire de
notation des élèves.
Exercices

Le langage VBA sous Access 219


Access Livre Page 220 Mercredi, 27. f vrier 2008 7:28 07

* Solution L’exercice met en œuvre toutes les connaissances acquises sur les formulaires et y ajoute le
lancement d’une requête SQL. Les assistants seront invalidés ; on utilisera de préfé-
rence le code VBA et non pas les macros.

1. Dessin des deux contrôles d’affichage des matières et des élèves


1. Dans le menu « Créer », cliquez sur « Création de formulaires ».
2. Enregistrez tout de suite le formulaire sous le nom « Frm_InsertionNotes ».
3. Dans le ruban du menu Création, décochez le bouton de l’icône (forme de baguette
magique) Utiliser les assistants contrôles.
4. Dans le ruban du menu Création, cliquez sur le bouton « Zone de liste déroulante » et
dessinez un rectangle en haut de formulaire. Si les assistants ont été invalidés, la zone
est immédiatement créée avec des valeurs par défaut ; dans le cas contraire, cliquez sur
Annuler pour obtenir le même résultat.
5. Les propriétés de la zone de liste déroulante sont directement entrées comme suit :
Nom du contrôle : Choix_Matiere (au lieu de Modifiable0).
Nombre de colonnes : 2.
Largeur colonnes : 0;5.
Contenu : SELECT MATIERE.ID_MATIERE, MATIERE.NOM_MATIERE FROM MATIERE
ORDER BY MATIERE.NOM_MATIERE; .
Toutes les autres propriétés sont a priori correctes (non compris la présentation).
6. Dans le menu Création, cliquez sur le bouton « Zone de liste » et dessinez un large
rectangle en dessous du premier contrôle.
7. Les propriétés de la zone de liste sont directement entrées comme suit :
Nom du contrôle : Choix_Eleve (au lieu de Liste2).
Nombre de colonnes : 3.
Largeur colonnes : 0;3;3.
Contenu : SELECT DISTINCT ELEVE.ID_ELEVE , ELEVE.PRENOM_ELEVE, ELEVE.NOM_
ELEVE, NOTE.ID_MATIERE FROM ELEVE INNER JOIN [NOTE] ON ELEVE.ID_
ELEVE = NOTE.ID_ELEVE WHERE (((NOTE.ID_MATIERE)=[Formulaires]![Frm_
InsertionNotes]![Choix_Matiere])) ORDER BY ELEVE.NOM_ELEVE; .
Toutes les autres propriétés sont a priori correctes (non compris la présentation).
8. Revenez à la zone de liste déroulante et cliquez sur le bouton aux trois points de sus-
pension à droite de la propriété Après MAJ.
9. Sélectionnez Générateur de code (et non plus générateur de macro).
10. VB a créé une procédure Choix_Matiere_AfterUpdate(). Ajoutez-y la simple ligne
de code Me.Choix_Matiere.Requery où Me désigne le formulaire en cours et Choix_
Matiere le contrôle de zone de liste. La méthode Requery relance la requête du
contenu de la zone et actualise les résultats.
Enregistrez et testez dès maintenant votre formulaire qui doit déjà fonctionner pour les
deux contrôles créés. La requête du contenu de la zone de liste étant un peu complexe

220 Access® 2007 et VBA


Access Livre Page 221 Mercredi, 27. f vrier 2008 7:28 07

(présence d’un DISTINCT après le SELECT !), elle est reproduite graphiquement sur la
figure 8.5.
8
Chapitre

Figure 8.5
Requête d’affichage
unique des élèves
de l’exercice 1.

2. Dessin des contrôles de la séquence de saisie des notes


1. Cliquez sur le bouton « Zone de texte » et dessinez un nouveau contrôle dans la partie
droite du formulaire. Ce contrôle est destiné à afficher le nom de l’élève en cours de
notation. Nommez-le « Eleve_encours ». La valeur de cette zone et sa visibilité seront
gérées plus loin grâce à du code VBA.
2. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à entrer la note
de l’élève. Nommez-le « Note_encours », donnez-lui un Format fixe et un nombre de
décimales de 2. Cette zone sera un contrôle de saisie pour l’utilisateur.
3. Cliquez sur le bouton « Zone de texte » et dessinez un contrôle destiné à afficher (et
éventuellement modifier) la date du jour. Le nom du contrôle est « Date_encours » ; la
valeur par défaut de la zone est =Date().
4. Cliquez sur le bouton « Bouton de commande » et dessinez ce contrôle dans le formu-
laire en bas à droite. Renommez la légende et le nom du contrôle par « Validation »
(deux modifications). Sous ce bouton se trouvera le code Visual Basic qui lance la
commande SQL d’insertion de la note.
5. Cliquez à nouveau sur le bouton « Bouton de commande » et dessinez ce contrôle
dans le formulaire en bas à droite. Renommez la légende et le nom du contrôle par
« Annulation » (deux modifications).

3. Création du code Visual Basic


À l’ouverture du formulaire, les boutons et zones de texte de saisie des notes doivent être
invisibles :
Dans la feuille de propriétés du formulaire lui-même (et non pas d’un autre contrôle),
cliquez sur le bouton aux trois points de suspension de la propriété Sur Ouverture et sélec-
Exercices

tionnez le générateur de code pour y entrer les commandes suivantes, incluses dans une
procédure nommée Form_Open :
Me.Eleve_encours.Visible = False
Me.Note_encours.Visible = False
Me.Date_encours.Visible = False

Le langage VBA sous Access 221


Access Livre Page 222 Mercredi, 27. f vrier 2008 7:28 07

Lors du clic sur un élève, les événements suivants doivent survenir :


• les contrôles relatifs à la saisie doivent devenir visibles ;
• le nom de l’élève choisi doit apparaître dans le champ correspondant.
En conséquence :
1. Dans la feuille de propriétés du contrôle Choix_Eleve, entrez le code suivant dans la
propriété SurClic :
Me.Eleve_encours.Visible = True
Me.Note_encours.Visible = True
Me.Date_encours.Visible = True
Me.Eleve_encours.Value = Me.Choix_Eleve.Column(2)
Me.Date_encours.Value = Date
Le code entré précédemment pourra avantageusement être copié/collé en inversant
simplement les valeurs booléennes des propriétés. Grâce au code de la quatrième
ligne, le contrôle Eleve_encours prend la valeur du nom de l’élève et le contrôle
Date_encours prend la valeur de la date en cours. On notera que lors de l’ouverture,
la propriété de valeur par défaut de ce contrôle est fixée à la date en cours mais que par
la suite, il est nécessaire de le repositionner.
Lors du clic sur le bouton de validation, les événements suivants doivent survenir :
• vérifications de la validité de la saisie ;
• insertion de la note dans la table adéquate ;
• disparition des contrôles de la saisie.
Le code inséré sous la procédure Validation_Click() (propriété SurClic du bouton Vali-
dation) est le suivant :
If Not IsNumeric(Me.Note_encours) Then
MsgBox "Vous devez entrer une note valide", , "Contrôle de saisie"
Exit Sub
End If
If Not IsDate(Me.Date_encours) Then
MsgBox "La date doit être renseignée", , "Contrôle de saisie"
Exit Sub
End If
If Me.Note_encours < 0 Or Me.Note_encours > 20 Then
MsgBox "La note doit être comprise entre 0 et 20", , "Contrôle de saisie"
Exit Sub
End If
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO [NOTE] (ID_ELEVE,ID_MATIERE,NOTATION,
➥DATE_NOTE) SELECT " & Me.Choix_Eleve & "," & Me.Choix_Matiere & ",
➥" & Replace(Me.Note_encours, ",", ".") & ",#" & Me.Date_encours & "#;"
Me.Eleve_encours.Visible = False
Me.Note_encours.Visible = False
Me.Note_encours = ""
Me.Date_encours.Visible = False
Me.Date_encours.Value = Date
DoCmd.SetWarnings True
Ce code mérite les commentaires suivants :
• Les vérifications de validité couvrent le minimum envisageable : la condition If Not
IsNumeric() assure que l’insertion SQL ne comprendra pas un champ vide (chaîne

222 Access® 2007 et VBA


Access Livre Page 223 Mercredi, 27. f vrier 2008 7:28 07

vide), ou une valeur Null, ou une chaîne de caractères (auquel cas le programme ren-
verrait un message erreur). La condition If Not IsDate() applique les mêmes règles
au champ date. La troisième vérification vise la validité de la note elle-même.
8
Chapitre

• La commande DoCmd.SetWarnings False évite que le programme n’affiche le message


« Vous allez insérer un enregistrement » ; elle est annulée en fin de procédure.
• La chaîne de caractères de la commande SQL étant très longue, elle est libellée sur plu-
sieurs lignes mais vous devrez la saisir sur une seule ligne. D’une manière plus générale,
on peut insérer des signes soulignés (underscore) en fin de ligne pour permettre un
changement de ligne sans que Visual Basic n’interprète la ligne suivante comme une
nouvelle commande ; mais cette règle n’est pas valide lorsque le texte coupé est une chaîne
littérale entre guillemets.
• Les expressions Me.Choix_Eleve et Me.Choix_Matiere renvoient des valeurs numéri-
ques (les ID) ; en conséquence, il est inutile de les cerner par des apostrophes ou des
doubles guillemets.
• La note entrée dans le contrôle Note_encours peut comporter des décimales ; or, le lan-
gage SQL exige que les valeurs numériques soient présentées au format anglo-saxon
avec le point comme séparateur de décimales. C’est la raison pour laquelle la fonction
Replace est utilisée, qui remplace toutes les virgules par des points dans la chaîne de
caractères désignée.
• La date, dans SQL, doit être cernée par des signes dièse (#).
• Les trois contrôles relatifs à la saisie redeviennent invisibles après la validation de la
note ; le contrôle de date reprend la valeur du jour en cours et le contrôle de note prend
la valeur d’une chaîne vide. Cette précaution assure que l’élève suivant « n’hérite pas »
de la note du précédent.
Le code inséré sous la procédure Annulation_Click() (propriété SurClic du bouton Annu-
lation) reprend la fin du code entré pour la validation, soit :
Me.Eleve_encours.Visible = False
Me.Note_encours.Visible = False
Me.Note_encours = ""
Me.Date_encours.Visible = False
Me.Date_encours.Value = Date
Le bouton de sortie de formulaire pourra être réalisé avec l’assistant de bouton de com-
mande (plus rapide) :
1. Le formulaire étant en mode création, cliquez sur l’icône Utiliser les assistants contrôle
(représentée par une baguette magique).
2. Cliquez sur l’icône Bouton.
3. Dessinez un carré en bas à droite.
4. Dans la première étape de l’assistant, choisissez les options « Opérations sur formu-
laires » et « Fermer un formulaire ».
Exercices

5. Cliquez directement sur Terminer.


L’aspect général du formulaire (sélecteur d’enregistrements, boutons de déplacements,
barres de défilement, etc.) ne sera pas négligé.

Le langage VBA sous Access 223


Access Livre Page 224 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 2 TRAVAIL SUR JEU D’ENREGISTREMENTS

• Énoncé On considère que les élèves natifs d’un pays étranger et qui suivent un cours de langue
dans leur langue maternelle sont avantagés par rapport aux autres. Il convient donc de
créer une procédure automatique pour retirer deux points aux notes déjà données par les
professeurs ; cette procédure fait appel à la notion de RecordSet.

* Solution 1. Modification de la structure de la table


En premier lieu, ce travail sur les notes nécessite une modification de structure de la table
des notes. En effet, la nouvelle procédure modifiera certaines notes, sélectivement : si, par
erreur, elle est appliquée deux fois sur la même série, le handicap des élèves concernés ne
sera plus de deux points, mais de quatre ! Il faut donc insérer un champ NOTEPONDEREE qui
stockera la note réévaluée alors que la colonne des notes initiales restera vierge de toute
modification.
1. Insérez manuellement un champ NOTEPONDEREE dans la table NOTE.
2. Reprenez les caractéristiques du champ NOTATION pour en déterminer les propriétés.
3. Créez un nouveau module dans le projet ECOLE_INTERNATIONALE en effectuant un clic
droit sur les modules dans Visual Basic Editor puis Insertion. L’accès à Visual Basic est
obtenu par Alt-F11 ou Outils de base de données > Visual Basic.
4. Nommez le module « Pondération ».
Il existe, comme toujours en informatique, un grand nombre de solutions au problème
posé. Nous en indiquerons deux, faisant appel à des procédés différents et se distinguant
surtout par la vitesse d’exécution. La première méthode met simultanément en œuvre
deux jeux d’enregistrements (ce qui renforcera les notions acquises dans le cours ) ; la
seconde comporte la notion nouvelle de variable tableau. Nous verrons alors que la seconde
méthode « tourne » à peu près quatre fois plus vite que la première.

2. Version avec deux jeux d’enregistrements


Le problème le plus immédiat de cet énoncé réside dans le fait que la nationalité des élèves
est indiquée dans la table ELEVE par des caractères alphabétiques alors que les matières
sont identifiées par des ID numériques ; de plus, plusieurs pays pratiquent la même langue
(UK et USA par exemple). Il faut donc constituer, d’une manière ou d’une autre un
« tableau d’équivalence » pour envisager ensuite la pondération automatique.
La première idée, ici, consiste à procéder de la manière suivante :
• On charge un jeu d’enregistrements contenant toutes les notes.
• On charge un jeu d’enregistrements contenant les ID et les pays des élèves (les autres
champs sont inutiles).
• On vient lire le premier enregistrement des notes et d’abord l’ID de l’élève.
• Dans le jeu des élèves, on recherche la nationalité.
• On traduit dans une simple énumération de cas les nationalités en ID de matière.
• On compare l’ID matière de l’enregistrement en cours avec celui obtenu après la traduction
de la ligne précédente.

224 Access® 2007 et VBA


Access Livre Page 225 Mercredi, 27. f vrier 2008 7:28 07

• S’il y a identité entre les deux ID de matières, on applique une soustraction et on écrit
la note pondérée (update).
8
Chapitre

• On passe à l’enregistrement suivant du jeu de notes.


• Et ainsi de suite jusqu’à la fin du fichier des notes.
La partie déclarative comprend les alinéas suivants :
Sub Calcul_DeuxRecordSets()
Dim vardebut As Date
Dim db As DAO.Database
Dim rst_eleves As DAO.Recordset
Dim rst_notes As DAO.Recordset
Dim varmatiere As Integer
vardebut = Timer
Set db = Application.CurrentDb
Set rst_eleves = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM
➥ELEVE", dbOpenDynaset)
Set rst_notes = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,
➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset)
rst_notes.MoveFirst
La variable vardebut déclarée comme une date entre dans le calcul du temps de réalisa-
tion du programme tout entier. Un peu plus bas, la ligne vardebut = Timer attribue à la
variable le nombre de secondes écoulées depuis le jour en cours à 00:00h.
Il est déclaré deux jeux d’enregistrements : rst_eleves et rst_notes ; le premier contient
les ID des élèves et leur pays, le second contient les quatre seules colonnes de la table NOTE
qui seront utiles : ID_ELEVE, ID_MATIERE, NOTATION et NOTEPONDEREE.
Le début de la boucle de lecture de toutes les notes s’écrit ainsi :
While Not rst_notes.EOF
rst_eleves.FindFirst "ID_ELEVE =" & rst_notes(0)
Select Case rst_eleves.Fields(1)
Case "FR", "B"
varmatiere = 3
Case "D"
varmatiere = 5
Case "UK", "USA", "IR"
varmatiere = 6
Case "I"
varmatiere = 7
Case Else
varmatiere = 0
End Select
Chaque fois que sera lu un nouvel enregistrement :
• La méthode FindFirst fait avancer le curseur du recordset des élèves jusqu’à la ligne où
se trouve l’ID de l’élève qui a été noté. L’expression rst_notes(0) fait référence à la
première colonne de l’enregistrement en cours, qui contient l’ID_ELEVE.
Exercices

• Le curseur du recordset des élèves étant bien positionné, le pays de celui-ci peut être
récupéré grâce à l’expression rst_eleves.Fields(1).
• La tournure conditionnelle If…ElseIf…EndIf est remplacée par l’emploi de la syntaxe
Select Case, plus adaptée. La première ligne donne une valeur à comparer après

Le langage VBA sous Access 225


Access Livre Page 226 Mercredi, 27. f vrier 2008 7:28 07

l’expression Select Case ; chaque valeur de comparaison est précédée d’un simple


Case et l’énumération s’achève avec un End Select.
• Les cas de figure regroupent les pays à la langue identique (France et Belgique, par
exemple). Pour chacun d’entre eux, la variable varmatiere prend une valeur numérique
correspondant à la table MATIERE.
À l’issue de ces lignes, le programme connaît l’ID de l’élève étudié pour un enregistrement
de la table des notes et sa langue d’origine, traduite en code matière.
Le traitement de la note s’opère alors grâce aux lignes suivantes :
If varmatiere = rst_notes(1) Then
rst_notes.Edit
If rst_notes(2).Value < 2 Then
rst_notes(3).Value = 0
Else
rst_notes(3).Value = rst_notes(2).Value - 2
End If
rst_notes.Update
End If
rst_eleves.MoveFirst
rst_notes.MoveNext
Wend
Si la matière dans la table des notes coïncide avec la nationalité de l’élève, alors il est néces-
saire de passer en mode modification (rst_notes.Edit). Deux cas de figure se présen-
tent : soit la note est inférieure à deux et la note pondérée sera égale à 0 (il n’est pas prévu
d’avoir une note négative !), soit elle est supérieure et peut donc se voir pondérée. C’est la
condition posée par la formulation If rst_notes(2).Value < 2 dont la référence rst_
notes(2) correspond à la note actuelle non pondérée.
La commande rst_notes.update lance la mise à jour de la colonne rst_notes(3) qui corres-
pond à la note pondérée ; elle n’a lieu que lorsque les conditions précédentes sont réunies.
La commande rst_eleves.MoveFirst oblige le curseur du jeu élèves à retourner en début
de fichier (pour qu’un prochain rst_eleves.FindFirst puisse balayer la totalité des
enregistrements).
La commande rst_notes.MoveNext fait passer le programme à l’enregistrement suivant
du jeu notes avant que le mot-clé Wend ferme la boucle.
Le programme s’écrit enfin ainsi pour fermer l’ensemble des objets :
rst_notes.Close
rst_eleves.Close
Set rst_notes = Nothing
Set rst_eleves = Nothing
Set db = Nothing
MsgBox Format(Timer - vardebut, "Fixed")
End Sub
En entier, le programme est le suivant :
Sub Calcul_DeuxRecordSets()
Dim vardebut As Date
Dim db As DAO.Database
Dim rst_eleves As DAO.Recordset
Dim rst_notes As DAO.Recordset
Dim varmatiere As Integer
vardebut = Timer
Set db = Application.CurrentDb

226 Access® 2007 et VBA


Access Livre Page 227 Mercredi, 27. f vrier 2008 7:28 07

Set rst_eleves = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM


➥ELEVE", dbOpenDynaset)
Set rst_notes = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,
8
Chapitre

➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE] ", dbOpenDynaset)


rst_notes.MoveFirst
While Not rst_notes.EOF
rst_eleves.FindFirst "ID_ELEVE =" & rst_notes(0)
Select Case rst_eleves.Fields(1)
Case "FR", "B"
varmatiere = 3
Case "D"
varmatiere = 5
Case "UK", "USA", "IR"
varmatiere = 6
Case "I"
varmatiere = 7
Case Else
varmatiere = 0
End Select
If varmatiere = rst_notes(1) Then
rst_notes.Edit
If rst_notes(2).Value < 2 Then
rst_notes(3).Value = 0
Else
rst_notes(3).Value = rst_notes(2).Value - 2
End If
rst_notes.Update
End If
rst_eleves.MoveFirst
rst_notes.MoveNext
Wend
rst_notes.Close
rst_eleves.Close
Set rst_notes = Nothing
Set rst_eleves = Nothing
Set db = Nothing
MsgBox Format(Timer - vardebut, "Fixed")
End Sub
Comme l’indique la boîte de message finale, et avec une machine courante du marché, le
programme demande 2,10 secondes pour lire et traiter les 19 000 enregistrements de la
table NOTATION. Si ce traitement peut paraître rapide à certains, il s’avère pourtant rela-
tivement lent : si le fichier contient non pas des milliers mais des millions d’enregistrements,
il pourra être considéré comme non performant.
Le problème provient du fait que, pour chacun des enregistrements de la table des notes,
le curseur du recordset des élèves reparcourt toute ou partie de la table des élèves et rééva-
lue à chaque fois le pays d’origine alphabétique en code ID matière. Il y a, dans cette partie
du programme, une grande économie de temps processeur à gagner.

3. Version avec un tableau


Exercices

La deuxième formulation de la réponse pourrait donc emprunter une autre voie en imagi-
nant la solution suivante :
• On charge un jeu d’enregistrements contenant tous les élèves.
• Pour chacun des élèves lus, on traduit sa nationalité en code équivalent à un ID matière
et on stocke l’ID de l’élève et son ID matière dans une variable tableau. Une variable

Le langage VBA sous Access 227


Access Livre Page 228 Mercredi, 27. f vrier 2008 7:28 07

tableau est, comme son nom l’indique, une variable qui peut contenir plusieurs colon-
nes de valeurs pour un même indice. L’indice de cette variable sera l’ID de l’élève et la
seule colonne de la variable tableau contiendra l’ID matière.
• Ce traitement étant terminé, on a en mémoire vive tous les élèves et leurs équivalents
nationalité (avec une vitesse d’accès beaucoup plus rapide que celle d’un recordset).
On peut donc fermer le premier recordset.
• On charge un autre jeu d’enregistrements contenant toutes les notes.
• Pour chacune des notes lues, si l’ID matière du recordset correspond à celui de la
variable tableau, alors on applique une soustraction et on écrit la note pondérée
(update).
• On passe à l’enregistrement suivant du jeu de notes.
• Et ainsi de suite jusqu’à la fin du fichier des notes.
L’avantage de cette deuxième formulation tient surtout au fait que la translation entre les
nationalités alphabétiques et les ID matière numériques n’est opérée qu’une seule fois : le
temps de traitement descend à 0,54 seconde, soit quatre fois moins que dans la procédure
précédente. Le code en est le suivant :
Sub Calcul_VariableTableau()
Dim vardebut As Date
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim vartableau(99, 0) As Integer
Dim i As Integer
vardebut = Timer
Set db = Application.CurrentDb
Set rst = db.OpenRecordset("SELECT ID_ELEVE, PAYS_ELEVE FROM ELEVE",
➥dbOpenDynaset)
rst.MoveFirst
While Not rst.EOF
i = rst(0).Value
Select Case rst(1).Value
Case "FR", "B"
vartableau(i, 0) = 3
Case "D"
vartableau(i, 0) = 5
Case "UK", "USA", "IR"
vartableau(i, 0) = 6
Case "I"
vartableau(i, 0) = 7
Case Else
vartableau(i, 0) = 0
End Select
rst.MoveNext
Wend
rst.Close
Set rst = db.OpenRecordset("SELECT NOTE.ID_ELEVE, NOTE.ID_MATIERE,
➥NOTE.NOTATION, NOTE.NOTEPONDEREE FROM [NOTE]", dbOpenDynaset)
rst.MoveFirst
While Not rst.EOF
If vartableau(rst(0).Value, 0) = rst(1).Value Then
rst.Edit

228 Access® 2007 et VBA


Access Livre Page 229 Mercredi, 27. f vrier 2008 7:28 07

If rst(2).Value < 2 Then


rst(3).Value = 0
Else
8
Chapitre

rst(3).Value = rst(2).Value - 2
End If
rst.Update
End If
rst.MoveNext
Wend
rst.Close
Set rst = Nothing
Set db = Nothing
MsgBox Format(Timer - vardebut, "Fixed")
End Sub
À la quatrième ligne, la variable tableau est déclarée par la syntaxe Dim vartableau(99,
0) As Integer. Cette variable pourra contenir 100 lignes (99 lignes plus la ligne 0) et une
colonne (la colonne 0). Le programme prend l’indice de ligne pour y stocker l’ID de l’élève
et la seule colonne disponible pour y stocker l’équivalent ID matière.
Un seul RecordSet est ouvert : pendant la première partie du programme, il contient les
ID des élèves et leur nationalité. Une boucle (While Not rst.EOF) fait lire tous les enre-
gistrements ; pour chacun d’eux, la variable tableau est chargée des deux valeurs ID_
ELEVE en indice et équivalent matière en première colonne. La détermination des équiva-
lents matière est effectuée avec la syntaxe Select Case de la même manière que dans la
première solution.
Lorsque toutes les équivalences sont chargées en mémoire dans la variable tableau, le
même RecordSet est repris pour lire toutes les notes. Chaque fois que le numéro de
matière contenu dans la variable tableau coïncide avec l’ID_MATIERE du RecordSet, la
note pondérée est mise à jour.

4. Version SQL
L’énoncé de l’exercice exigeait l’activation d’un ou plusieurs jeux d’enregistrements pour
opérer la pondération des notes des élèves. C’est la raison pour laquelle les deux solutions
proposées se réfèrent à ce procédé. Il existe une troisième solution, ni plus ni moins per-
formante que la deuxième, et qui utilise uniquement SQL pour faire la même opération.
Pour la mettre en œuvre, Vous devez créer une table EQUIVALENCE, dont le contenu est
présenté à la figure 8.6. Cette table ne contient que deux colonnes, reprenant les champs
ID_MATIERE et PAYS_ELEVE, et établissant les équivalences.

Figure 8.6
Table d’équivalence
de l’exercice 2.
Exercices

Le langage VBA sous Access 229


Access Livre Page 230 Mercredi, 27. f vrier 2008 7:28 07

Dès lors, la requête mise à jour, dont la structure graphique est présentée à la figure 8.7,
permet de faire la même opération en une seule fois. Elle est construite en sélectionnant
dans l’onglet Créer, l’icône Création de requête. Choisissez ensuite les tables NOTE,
ELEVE, EQUIVALENCE et MATIERE, puis dans le ruban, sélectionnez Mise à jour. Par
un glisser/déposer, mettez en relation le champ PAYS_ELEVE des tables ELEVE et EQUI-
VALENCE.
Dans la zone Champ de la première colonne choisissez NOTEPONDEREE de la table
NOTE. Dans la zone Mise à jour inscrivez VraiFaux([NOTATION]<2 ;0 ;[NOTA-
TION]–2).

Figure 8.7
Requête de
l’exercice 2.

Exécutée sous le code Visual Basic suivant, elle demande 0,50 seconde :
Le code SQL de cette requête est :
UPDATE ((EQUIVALENCE INNER JOIN ELEVE ON EQUIVALENCE.PAYS_
ELEVE = ELEVE.PAYS_ELEVE) INNER JOIN MATIERE ON EQUIVALENCE.ID_
MATIERE = MATIERE.ID_MATIERE) INNER JOIN [NOTE] ON (MATIERE.ID_
MATIERE = NOTE.ID_MATIERE) AND (ELEVE.ID_ELEVE = NOTE.ID_ELEVE) SET
[NOTE].NOTEPONDEREE = IIf([NOTATION]<2,0,[NOTATION]–2);
Voici le nouveau programme VB qui effectue ce traitement :
Sub Calcul_ReqSQL()
Dim vardebut As Date
vardebut = Timer
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE ((EQUIVALENCE INNER JOIN ELEVE _ ON EQUIVA-
LENCE.PAYS_ELEVE = ELEVE.PAYS_ELEVE) INNER JOIN MATIERE _ON EQUIVA-
LENCE.ID_MATIERE = MATIERE.ID_MATIERE) INNER JOIN [NOTE] _ON
(MATIERE.ID_MATIERE = NOTE.ID_MATIERE) AND (ELEVE.ID_ELEVE _ = NOTE.ID_
ELEVE) SET [NOTE].NOTEPONDEREE =If([NOTATION] <2,0,[NOTATION]-2);"
MsgBox Format(Timer - vardebut, "Fixed")
DoCmd.SetWarnings True
End Sub

230 Access® 2007 et VBA


Access Livre Page 231 Mercredi, 27. f vrier 2008 7:28 07

EXERCICE 3 UNE AUTOMATION ACCESS/WORD


8
Chapitre

• Énoncé Mettez en place un formulaire présentant la liste des élèves et leur moyenne. Lors d’un
double-clic sur l’un des items de la liste, le programme rédige, à distance, une courte let-
tre sous Word qui annonce le passage à la classe supérieure ou le redoublement suivant
que la moyenne est supérieure ou non à 10.

* Solution Il ne s’agit pas, ici, de faire un mailing à partir de Word en utilisant le fichier d’Access ; au
contraire, l’utilisation de Word est occasionnelle et ne touche qu’un seul élément ; l’utili-
sateur est positionné sur son application Access et n’accède à Word que provisoirement.
Cet exemple peut être appliqué dans un grand nombre de cas de figures.

Attention
Pour réaliser cet exercice, il est nécessaire que la bibliothèque Microsoft Word 12.0 Library soit
chargée dans Outils > Références de Visual Basic Editor. Pour réaliser le chargement de cette
nouvelle bibliothèque, procédez de la même manière que pour celle concernant Excel décrite
dans le paragraphe 3 du cours de ce même chapitre.

1. Dans le menu « Créer », cliquez sur « Création de formulaires ».


2. Enregistrez tout de suite le nouvel élément sous le nom « Frm_EnvoiLettre ».
3. Les assistants de création de contrôles étant désactivés, dessinez une zone de liste dans
le formulaire vierge.
4. Les propriétés de la zone de liste à modifier sont les suivantes :
• Nom : « Choix_Eleve » ( à la place de Liste0).
• Nombre colonnes : « 10 ».
• Largeurs colonnes : « 0 cm;3 cm;3 cm;5 cm;5 cm;2 cm;3 cm;1 cm;1 cm;1,5 cm ».
• Largeur : « 24,5 cm ».
• Hauteur : « 10 cm ».
• Contenu : SELECT ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE,
ELEVE.ADRESSE1_ELEVE, ELEVE.ADRESSE2_ELEVE, ELEVE.CODEPOSTAL_ELEVE,
ELEVE.VILLE_ELEVE, ELEVE.PAYS_ELEVE, ELEVE.SEXE_ELEVE, Avg(NOTE.NOTA-
TION) AS MoyenneDeNOTATION
FROM ELEVE INNER JOIN [NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE
GROUP BY ELEVE.ID_ELEVE, ELEVE.NOM_ELEVE, ELEVE.PRENOM_ELEVE ELEVE.
Exercices

ADRESSE1_ELEVE, ELEVE.ADRESSE2_ELEVE, ELEVE.CODEPOSTAL_ELEVE, ELEVE.VILLE_


ELEVE, ELEVE.PAYS_ELEVE, ELEVE.SEXE_ELEVE;

Le langage VBA sous Access 231


Access Livre Page 232 Mercredi, 27. f vrier 2008 7:28 07

La requête, dotée d’un regroupement (GROUP BY), est présentée graphiquement à la


figure 8.8.

Figure 8.8
Requête de
l’exercice 3.

5. À la ligne de propriété Sur double-clic, cliquez sur le bouton aux trois points de sus-
pension puis Générateur de code, et entrez le code suivant :
Private Sub Choix_Eleve_DblClick(Cancel As Integer)
Dim docword As Object
Dim Civilite As String
If Me.Choix_Eleve.Column(8) = "M" Then
Civilite = "Monsieur"
Else
Civilite = "Mademoiselle"
End If
Set docword = CreateObject("Word.Application")
docword.Visible = True
docword.Documents.Add
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(8)
docword.Selection.TypeText Text:="Paris, le "
docword.Selection.TypeText Text:=CStr(Date)
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Civilite & _
" " & Me.Choix_Eleve.Column(1) & _
" " & Me.Choix_Eleve.Column(2)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(3)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(4)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(5) _
& " " & Me.Choix_Eleve.Column(6)
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:=Me.Choix_Eleve.Column(7)
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(0)
docword.Selection.TypeText Text:=Civilite & ","
docword.Selection.TypeParagraph

232 Access® 2007 et VBA


Access Livre Page 233 Mercredi, 27. f vrier 2008 7:28 07

If Me.Choix_Eleve.Column(9) < 10 Then


docword.Selection.TypeText Text:="Votre moyenne étant de " _
& Format(Me.Choix_Eleve.Column(9), "Fixed") & _
8
Chapitre

", nous avons le regret de vous informer que vous devez redoubler"
Else
docword.Selection.TypeText Text:="Votre moyenne étant de " _
& Format(Me.Choix_Eleve.Column(9), "Fixed") & _
", nous avons le plaisir de vous accepter en classe supérieure"
End If
docword.Selection.TypeParagraph
docword.Selection.TypeText Text:="Veuillez agréer, " & Civilite & _
", l’expression de nos salutations distinguées"
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.TypeParagraph
docword.Selection.ParagraphFormat.LeftIndent = CentimetersToPoints(8)
docword.Selection.TypeText Text:="La Direction"
Set docword = Nothing
End Sub
Dans ce code, les particularités suivantes sont à souligner :
• La méthode CreateObject a été choisie ici, contrairement à l’exemple présenté dans la
partie théorique de ce chapitre qui faisait appel à la syntaxe Set prog_xlsx = New
Excel.Application. Dans la pratique, les deux tournures ont les mêmes propriétés.
• L’objet Me.Choix_Eleve.Column(numéro de colonne) est systématiquement sélec-
tionné pour récupérer dans Word toutes les coordonnées utiles. On rappelle que la
numérotation commence à 0. La colonne liée, numérotée 0 et contenant l’ID de l’élève
est masquée.
• Les syntaxes faisant allusion au document Word comportent toutes un vocabulaire spé-
cifique à Word qu’il est possible d’approfondir en utilisant les macros de Word et
l’explorateur d’objets. Elles sont toutes préfixées par l’expression docword.Selection
désignant le document en cours et piloté à distance.
Il suffit désormais de passer en mode formulaire pour voir la liste des élèves. Un double-
clic sur l’un d’entre eux génère automatiquement, sous Word, un courrier qui lui est
adressé et qui l’informe de sa note.
Exercices

Le langage VBA sous Access 233


Access Livre Page 234 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 235 Mercredi, 27. f vrier 2008 7:28 07

La finalisation, monter une


9
Chapitre

application

1. Le démarrage
Lorsque tous les éléments sont réunis, tables,
d’une application .................. 236 requêtes, formulaires et états, il devient possible
2. La gestion des utilisateurs ....... 237
3. Le volet de navigation ............ 238 de monter une véritable application à destination
4. La gestion des rubans ............ 239 de futurs utilisateurs. La problématique essentielle,
dès lors, porte sur les points suivants :
l’ergonomie ;
la gestion des utilisateurs ;
la sécurité.
Les aspects ergonomiques ont déjà été largement
abordés dans le montage des formulaires. Il s’agira
donc, dans ce dernier chapitre, d’aborder la partie
concernant leur « pourtour » : le volet de naviga-
tion, la barre de menus et les rubans. La sécurité
concernera essentiellement les précautions à pren-
dre pour éviter que l’utilisateur ne puisse accéder à
certains éléments, soit pour des raisons de confi-
dentialité, soit pour des raisons de prudence.

235
Access Livre Page 236 Mercredi, 27. f vrier 2008 7:28 07

(1) Le démarrage d’une application


Lors du démarrage d’une base Access, si aucun paramétrage n’est effectué, tous les objets
de la base sont lisibles et modifiables à volonté. Une fenêtre spécifique gère les conditions
générales d’exploitation de la base :
1. Démarrez la base de données « ECOLE_INTERNATIONALE » des exercices.
2. Cliquez sur le bouton « Office ».
3. Cliquez sur le bouton « Options Access ».
4. Dans le pavé de gauche, sélectionnez Base de données active pour accéder à la fenêtre
de la figure 9.1.

Figure 9.1
Fenêtre de
démarrage.

Paramétrer une application revient à sélectionner ou non chacune des options proposées
dans la fenêtre de démarrage. Une fois sélectionnées, ces options deviennent opérationnelles
après fermeture et ouverture de la base. Voici une description du rôle de chaque option :
• Le titre de l’application indiqué apparaîtra dans la barre supérieure (sans ne plus faire
allusion à Microsoft Access !)
• L’icône choisie pour l’application sera constamment appliquée dans les formulaires et
les barres de menu
• Le formulaire désigné dans la zone Afficher le formulaire s’ouvrira automatiquement au
démarrage. Très souvent, le formulaire choisi sera celui d’identification de l’utilisateur
(comme dans la base Northwind). Il est possible d’intercaler du code dans ce premier
formulaire pour ouvrir d’autres formulaires ou procéder à des opérations spécifiques.
• Les Options de la fenêtre Document ont une grande importance ergonomique : soit
Access ouvrira plusieurs documents avec autant d’onglets (mode Access 2007), soit les
fenêtres se superposeront (mode Access 2003).

236 Access® 2007 et VBA


Access Livre Page 237 Mercredi, 27. f vrier 2008 7:28 07

• Les touches spéciales (Alt + F11 par exemple) doivent être désactivées si le programmeur
ne veut pas que les utilisateurs accèdent à des parties sensibles de l’application.
9
Chapitre

• Le compactage automatique à la sortie de l’application n’est pas indispensable : il ralen-


tit notablement les procédures de fermeture et ne se justifie que si les volumes de don-
nées manipulées s’avèrent très importants. En revanche, il est recommandé de pratiquer
manuellement ce compactage en fin de développement et périodiquement grâce à
l’option Bouton Office > Gérer > Compacter la base de données. Le gain de place disque
peut être considérable.
• Les options concernant le volet de navigation, les barres de menus et les rubans seront
étudiées plus loin. Ici, elles seront simplement invalidées ou mises en place. L’option
Autoriser les menus contextuels par défaut doit être désactivée si le programmeur veut
interdire le clic sur le bouton droit de la souris (dangereux à certaines occasions).
• La partie concernant la correction automatique de nom ne gère pas, contrairement à ce
que l’on pourrait croire, l’orthographe, mais les erreurs de noms des objets d’Access.
Elle pourra être conservée en standard. Il sera parfois utile, en revanche, d’invalider la
correction automatique dans le chapitre Vérifications des Options d’Access. En effet,
la saisie du mot « FRANCE » en majuscules, par exemple, est automatiquement modi-
fiée par l’orthographe « France » en minuscules, ce qui peut induire des difficultés dans
la rédaction d’une table des pays.
La plupart des options citées ici sont invalidées lorsque l’application est démarrée en
conservant le doigt sur la touche Majuscule pendant le démarrage : on accède alors à la
base comme son programmeur 1.

(2) La gestion des utilisateurs


Jusqu’à Access 2003, le programme contenait des options permettant de gérer les accès des
utilisateurs avec un mot de passe par utilisateur. Access 2007 a complètement supprimé
cette notion 2. Il n’est plus possible que de créer un mot de passe général à un fichier
« .accdb » (option Outils de base de données > Chiffrer avec mot de passe). La gestion des
utilisateurs est donc totalement reportée sur les programmes développés, leur code Visual
Basic et leurs formulaires.
Pour reprendre l’exemple de la base Northwind, étudiée au début de cet ouvrage, il existe
une table « Employés » et une table « Privilèges » qui gèrent quelques droits particuliers
des utilisateurs compte tenu de leur position hiérarchique. Il n’existe pas, en revanche, de
menu particulier pour telle ou telle catégorie d’employés.
L’insertion d’un formulaire modal d’identification au démarrage de l’application a pour
principal avantage, ici, de créer et d’incrémenter une variable publique qui pourra être
utilisée comme valeur par défaut dans tous les formulaires et états. C’est la démarche qui
a été choisie par les concepteurs de la base Northwind.
Pour une gestion plus fine des droits des utilisateurs, il n’est donc envisageable que de
créer une base de données SQL Server à laquelle sera connectée la base Access. En effet,

1. Cette fonctionnalité est elle-même supprimable au moyen de la propriété AllowBypassKey de la base grâce à Visual Basic.
2. La gestion des utilisateurs est encore utilisable pour les fichiers « .mdb » fonctionnant en mode de compatibilité sous Access 2007.

La finalisation, monter une application 237


Access Livre Page 238 Mercredi, 27. f vrier 2008 7:28 07

SQL Server gère parfaitement les droits des utilisateurs, table par table, fonctionnalité par
fonctionnalité.
Quant aux menus, il sera excessivement lourd de les faire varier selon la catégorie d’utili-
sateur. On se contentera, le plus souvent de code Visual Basic ou autres macros qui
bloqueront telle ou telle option si les privilèges requis ne sont pas atteints par l’utilisateur
en cours.
On mesure là l’une des limites du programme Access.

(3) Le volet de navigation


Le volet de navigation peut être choisi comme menu général d’une application : on y
trouve tous les éléments formulaires qui fondent la base de données pour l’interface utili-
sateur.
Si tous les exercices des chapitres précédents ont été réalisés, la base de données ECOLE
INTERNATIONALE comprend sept formulaires qui peuvent servir de menu général à
l’application. La démarche de mise en place sera la suivante :
1. Faites un clic droit sur le premier élément : « Frm_ChoixEleve ».
2. Cliquez sur « Ajouter à un groupe > Nouveau groupe ».
3. En haut, nommez le nouveau groupe « ECOLE » (au lieu de Personnalisé1).
4. Inscrivez les autres formulaires dans ce nouveau groupe par un clic droit sur chaque
élément puis en cliquant sur ECOLE. On doit obtenir les éléments suivants :
• Choix d’un élève.
• Envoi lettre de fin d’année.
• Envoi mail des résultats.
• Notation des élèves
• Liste des élèves.
• Moyennes des élèves 1.
• Visualisation des élèves.
5. Faites un clic droit sur chacun des éléments listés ci-dessus puis cliquez sur Renommer
le raccourci 2 : mettez un nom bien orthographié comme dans la liste (et non plus les
noms techniques de formulaires tel Frm_ChoixEleve).
6. Cliquez du bouton droit sur tous les éléments que vous ne voulez pas faire apparaître
et sélectionnez l’option Masquer dans ce groupe. Pour opérer plus rapidement, vous
pouvez faire un clic droit sur un groupe d’éléments (Tables par exemple) et sélectionner
Masquer 3.

1. Les sous-formulaires de ce formulaire n’ont pas besoin d’être libellés.


2. Les éléments ne peuvent être renommés que s’ils sont inscrits à un groupe. Il est vivement recommandé, dans les options de navigation,
d’opter pour le double-clic sur les éléments de navigation : les actions sur les noms de raccourcis sont en effet très difficiles à réaliser lorsque le
simple clic est choisi. On peut, le cas échéant, retourner au simple clic ensuite.
3. Pour rendre à nouveau visibles les éléments masqués, accédez aux Options de navigation par le menu du démarrage (voir paragraphe
précédent) ou en faisant un clic droit sur la barre supérieure du volet de navigation, et cochez à nouveau les éléments masqués.

238 Access® 2007 et VBA


Access Livre Page 239 Mercredi, 27. f vrier 2008 7:28 07

Il est envisageable de créer autant de groupes personnalisés que de besoin (maximum 10)
pour s’adapter aux utilisateurs.
9
Chapitre

À l’issue de ces manipulations, la limitation des menus prendra le dessin de la figure 9.2.

Figure 9.2
Volet de navigation
personnalisé.

Ces mises au point réalisées, l’utilisateur peut encore personnaliser « son » volet de navi-
gation. Pour empêcher une telle démarche, le passage par les macros ou la programmation
sera nécessaire. Il suffira de créer la macro Mcr_VerrouillageVolet présentée à la figure
9.3 et, le cas échéant, de la traduire en code Visual Basic (voir chapitre 7).

Figure 9.3
Macro destinée à
verrouiller le volet
de navigation.

La macro (ou le code) sera lancée avec l’application, par exemple sur l’action Sur ouverture
d’un formulaire de démarrage.

(4) La gestion des rubans


Les menus et des rubans sont gérés de manière toute à fait nouvelle avec Access 2007. Si
une application avait été développée sous Access 2003 avec des barres de menus person-
nalisées, celles-ci sont récupérées sous Access 2007, mais dans un menu « Compléments »
peu esthétique et qui laisse toute sa place aux rubans dans lesquels de nombreuses fonc-
tionnalités peuvent être considérées comme « dangereuses » par le programmeur. Il devient
dès lors nécessaire de les concevoir à nouveau complètement.
Avant même de débuter la construction d’un ruban, il est nécessaire de créer les macros ou
le code Visual Basic aptes à ouvrir les formulaires auxquels on veut associer un bouton de
ruban.
1. Dans le menu « Créer », cliquez sur « Macros ».
2. Dans la colonne Action, sélectionnez Ouvrir formulaire.
3. Dans le Nom du formulaire, entrez « Frm_EnvoiMail ».

La finalisation, monter une application 239


Access Livre Page 240 Mercredi, 27. f vrier 2008 7:28 07

4. Enregistrez la macro sous le nom « Mcr_Ouv_EnvoiMail ».


5. Réitérez la même opération pour obtenir une macro nommée « Mcr_Ouv_EnvoiLettre »,
destinée à ouvrir le formulaire d’envoi d’une lettre personnalisée.
Ces deux macros, qui pourraient être traduites en langage Visual Basic, seront invoquées
lors de la création des boutons du ruban.
Alors qu’Access 2003 disposait d’un assistant graphique très rapide pour mettre en place
des barres de menu, Access 2007 n’en dispose plus, alors que la conception, totalement
nouvelle, se fonde sur XML (eXtensible Markup Language). Il est souhaitable, dès lors, de
disposer d’un éditeur XML pour rédiger ses menus et rubans, bien qu’un simple éditeur
de texte puisse suffire.
XML est un langage utilisant des balises pour décrire des structures de données. Une balise
se signale par les signes < et >. Généralement, il existe une balise ouvrante, notée <rib-
bon> par exemple et une balise fermante notée </ribbon>. Les balises peuvent être dotées
d’attributs du type <balise attribut1 ="valeur1" attribut2 = "valeur2">.
Dans un fichier texte ou XML, entrez le code suivant :
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<tabs>
<tab id="tabMenuGeneral" label="Menu Général">
</tab>
</tabs>
</ribbon>
</customUI>
La première balise <customUI> (Customized User Interface ou Interface utilisateur person-
nalisée) est fermée en fin de fichier par la même balise démarrée avec une barre de fraction
(</ribbon>). Elle fait appel à une adresse constante.
La deuxième balise <ribbon> porte l’attribut startFromScratch positionné à vrai. Cette
commande va supprimer le ruban standard et le remplacer par le ruban personnalisé. Si
cet attribut est omis (ou positionné à faux), le menu personnalisé s’ajoutera au menu
standard.
La troisième balise <tabs> vise les onglets supérieurs des rubans.
Il n’a été créé ici qu’un seul onglet <tab> nommé tabMenuGeneral et dont le libellé visible
sera « Menu Général ».
Ce texte pourrait être conservé au format XML et chargé séparément au moment du
démarrage d’Access, mais nous n’étudierons que la faculté d’Access de stocker ce code
dans une table spécifique.
1. Dans le menu « Créer », cliquez sur « Création de table ».
2. Nommez le premier champ « RibbonName » 1 (type texte de longueur 255).
3. Nommez le second et dernier champ « RibbonXml » (type mémo).
4. Enregistrez la table sous le nom exact « USysRibbons » sans clé primaire (répondez
« Non » à la demande de création de la clé).

1. Les noms cités sont obligatoires.

240 Access® 2007 et VBA


Access Livre Page 241 Mercredi, 27. f vrier 2008 7:28 07

5. USysRibbons étant une table système, elle est normalement non visible : pour la faire
apparaître, dans les Options Access, cliquez sur « Base de données active > Options
de navigation et cochez la case Afficher les objets système.
9
Chapitre

6. Ouvrez la table « USysRibbons ».


7. Au premier enregistrement, champ RibbonName, entrez le libellé « Ruban1 ».
8. Dans le deuxième champ, faites un copier/coller du code XML indiqué plus haut afin
d’obtenir le résultat présenté à la figure 9.4, puis fermez la table 1.

Figure 9.4
Code XML inséré
dans la table
USysRibbons.

9. Cliquez sur les Options Access.


10. Sélectionnez la rubrique Base de données active.
11. Dans la zone Options de la barre d’outils et du ruban, écrivez « Ruban1 » pour renseigner
le nom du ruban (la zone de liste déroulante n’est pas opérationnelle).
12. Fermez la base, puis ouvrez-la à nouveau : il n’y a plus que l’onglet Menu Général.
Rappel : on peut outrepasser ce démarrage en gardant le doigt sur la touche « Maj »
pendant l’ouverture de la base.
Nous nous proposons à présent de créer un simple ruban, comme présenté à la figure 9.5,
dans lequel apparaîtront :
• Un groupe nommé Gestion des courriers et dans lequel sont placés deux boutons
d’envoi mail et envoi courrier.
• Un groupe nommé Application et contenant un bouton de fermeture de la base.

Figure 9.5
Ruban personnalisé.

Il faut donc ouvrir une nouvelle fois la base de données en gardant le doigt sur la touche
« Maj » (pour avoir le ruban complet), puis affecter le champ RibbonXml de la table

1. On prendra garde à parfaitement orthographier le fichier XML, qui est sensible à la casse (caractères minuscules et majuscules). Toute
erreur renverra un problème au démarrage.

La finalisation, monter une application 241


Access Livre Page 242 Mercredi, 27. f vrier 2008 7:28 07

USysRibbons avec le code XML suivant, qui pourra être saisi au préalable dans un éditeur
de texte :
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<tabs>
<tab id="tabMenuGeneral" label="Menu Général">
<group id="grpEnvois" label = "Gestion des courriers">
<button id="btnMail"
label = "Envoi mail"
size = "large"
imageMso = "CreateEmail"
screentip = "Envoi mails moyennes"
supertip = "Envoi mail groupé des moyennes"
onAction = "Mcr_Ouv_EnvoiMail" />
<button id="btnLettre"
label = "Envoi courrier"
size = "large"
imageMso = "EnvelopesAndLabelsDialog"
screentip = "Envoi lettres moyennes"
supertip = "Envoi courrier"
onAction = "Mcr_Ouv_EnvoiLettre" />
</group>
<group id="grpApplication" label = "Application">
<button idMso="FileCloseDatabase" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
La balise <group> crée des pavés dans le ruban : le premier groupe s’appelle grpEnvois et
le second grpApplication. Elle est chaque fois fermée par </group>. Chaque pavé est doté
des attributs id (nom unique) et label (étiquette).
La balise <button> crée des boutons dotés des propriétés suivantes :
• Une identité qui peut être soit personnalisée, c’est-à-dire dotée d’un attribut nommé
(id = « xxx »), soit standard et nommée idMso 1. La fermeture de la base, en bas du
code, en est un exemple.
• Un label, qui s’affichera sur le bouton.
• Une taille, qui peut être normal ou large.
• Une image 2.
• Une bulle d’aide ou screentip.
• Une sous-bulle d’aide (au texte plus long) ou supertip.
• Une propriété onAction, qui lance le code ou la macro nommée dans l’attribut.
La fermeture puis l’ouverture de la base font apparaître le nouveau ruban.

1. Les noms des idMso peuvent être retrouvés dans les options Access, page Personnaliser, en survolant les options des menus.
2. Le choix et les noms des images peuvent être connus de la manière suivante : depuis le « Download Center » de Microsoft, téléchargez
(gratuitement) le 2007 Office System Add-In: Icons Gallery. Après installation, un fichier nommé Excel Office2007IconsGallery.xlsm pourra être
ouvert sous Excel (dans le ruban Développeur d’Excel).

242 Access® 2007 et VBA


Access Livre Page 243 Mercredi, 27. f vrier 2008 7:28 07

Il existe de nombreuses autres présentations des éléments qui peuvent apparaître dans un
ruban (séparateurs, zones de liste déroulante, menus déroulants) ; il serait trop long de les
énumérer ici.
9
Chapitre

Résumé
Par défaut, le programme Access met à disposition de l’utilisateur tous les éléments d’une
base de données : tables, formulaires et autres. Cette liberté peut être conservée dans le
cadre d’une organisation où l’utilisateur et le programmeur ne font qu’un. Dès que la base
de données est mise à disposition de plusieurs personnes, il devient indispensable de gérer
les accès à tous ces éléments. Cette nécessité naît non seulement d’impératifs d’intégrité
des données, mais également d’un besoin d’ergonomie à destination d’utilisateurs non
avertis.
Access donne la possibilité d’organiser le volet de navigation pour ne plus faire apparaître
que les éléments achevés et protégés du système tout entier, les formulaires en particulier.
D’une certaine manière, il peut donc devenir une forme de menu, à l’image de la barre
horizontale des anciennes versions.
Mais le volet de navigation n’est pas obligatoire et peut être remplacé (ou augmenté) par
une gestion complète des rubans. Dépourvu de concepteur graphique, le gestionnaire de
ruban d’Access 2007 exige l’écriture en code XML d’une arborescence d’onglets (tabs),
de pavés (groups) et de boutons (buttons). Ceux-ci peuvent employer tout ou partie des
éléments standards des menus Access.

La finalisation, monter une application 243


Access Livre Page 244 Mercredi, 27. f vrier 2008 7:28 07
Access Livre Page 245 Mercredi, 27. f vrier 2008 7:28 07

Index

Symboles Bouton Curseur 210


de commande 183
& 185 de déplacement 155
.accdb 3, 23 D
Branchement 192
.csv 77 DAO 208
.dsn 72 Date() 119
.laccdb 23 C DéfinirVarTemp (action) 184
.mdb 3, 23 Case à cocher 139 Delete 97
Champ 47 Délimitée (structure de fichier)
A Champ-père 158 69
Clé Démarrage, paramètres 236
Acrobat 169 étrangère 51, 94 Diagramme
Actions (macros) 182 primaire 40, 54 d’activité 32
ActiveX (contrôle) 143 Coller 66 d’état 32
ADO 208 par ajout 66 Dim (VB) 197
Afficher le sélecteur 155 Colonne liée 135 Distinct 88
Ajout Column (VB) 198, 232 Distinctes, valeurs 107
copier par 66 Coma Separated Values 77 Diviseur d’enregistrements 136
formulaire 128 Comme 87, 104 DoCmd 192
Alias 89, 96 Commit transaction 100 Domaine 149
And 88 Compactage 237 Données externes 69
Apercu avant impression 168 Compte() 149 Doublon 94
ArrêtMacro (action) 187 CompteDom() 150
As 89 Concaténation 185
Assistant Masque de saisie 35 E
Conditions 186
Attache 71 Continu (formulaire) 127 Edit (VB) 213
Automation Contrainte référentielle 50, 80 Enregistrement, ligne 18
Excel 215 Contrôle 22, 125 En-tête
Word 231 ActiveX 143 de formulaire 124
Bouton de commande 137 de ligne ou colonne 114
B Cadre d’objet dépendant Entier Long 76
138 Entrée de données (formulaire)
Balise 240 Case à cocher 139 129
Barre Etiquette 133 EnvoyerObjet (action) 201
de synchronisation 32 Onglet 141 EOF 210
de défilement 155 zone de liste 135 Et 88
Begin transaction 99 déroulante 133 États 12, 167
Bentrée 184 zone de texte 131 Etiquette 133
BOF 210 Conversion (en Visual Basic) de ligne 192
Boîte de dialogue modale 174 189 Excel 67
BoîteMsg (action) 185 Copier 66 automation 215

Index 245
Access Livre Page 246 Mercredi, 27. f vrier 2008 7:28 07

ExécuterMacro (action) 187 L Processus 32


ExtracChaîne() 91 Produit cartésien 94
Label 192 Projet 191
Largeurs colonnes 56 Propriété (de formulaire) 126
F Lecture seule 154
Facture, créer 27 Légende 48
Liaisons de données 71 R
Fen
indépendante 174 Lien hypertexte 143 RechDom() 184
Modale 174 Like 87 RecordCount 211
Feuille (de données) 16 Limiter à liste 56, 133 RecordSet 208
Fields 209 Longueur fixe (structure de fichier) 69 Rectangle (contrôle formulaire) 136
Filtre 15, 87, 103 Réel Double 76
Find 211, 225 M Regroupement 91, 108, 170, 175
Fonction 90 Regrouper et trier 171
Macro 12, 164, 178, 181 Relation 38
Compte() 149 conditionnelle 186
CompteDom() 150 de plusieurs à plusieurs 42
incorporée 137 de un à plusieurs 42
Date() 119 Mail 201
de domaine 149 icône 34
Mailing 172 réflexive 45, 61
ExtracChaîne() 91 Masque de saisie 18, 63
Format() 196 Réorganiser (onglet) 153
Me 222 Requête
Gauche() 90 Merise 38
MoyDom() 195 ajout 95, 118
Mise à jour en cascade 51 création 100
RechDom() 184 Mise en forme conditionnelle 169 définition de données 101
Round() 112 Mise en page 168 mise à jour 98
SommeDom() 150 Modèle physique 38 paramétrée 89
VB 191 Module 12, 190, 206 Sélection 12, 84
VraiFaux() 90, 148 Move 210 suppression 97, 120
Format() 196 MoyDom() 195 Round() 112
Formulaire 12 MsgBox 191 Ruban 11, 21, 239
ajout 128 MySQL 4, 72 RunSql 206
continu 127
entrée de données 129
unique 127 N S
Non-correspondance 95 Select Case 226
G Not 88, 105 Sélecteur 125
Null interdit 48 afficher 155
Gauche() 90 Sélection
Générateur étendue (zone de liste déroulante)
d’expressions 90, 140
O
136
de code 220 Objet graphique 142 multiple (zone de liste
GoTo 192 ODBC 71 déroulante) 135
Graphique 142 Onglet 141 simple (zone de liste déroulante)
Groupe d’options 139 OpenRecordSet 210 136
Opération 91, 108 Séparateur 70
I Options Access (bouton) 236 SetWarnings 222
Or 87 SommeDom() 150
Icône 236 Ou 87, 105 Source de données (formulaire) 129
Identifiant 40 Où 87, 103 Sous-formulaire 144, 155
Importation de données 66 SQL Server 4, 72, 238
Index 48 Structure de fichier 69
P
Intégrité référentielle 50 Sub (VB) 191
IsDate 222 Paramètres Suppression en cascade 45, 52, 97
IsNumeric 222 d’importation 70 SurClic (propriété) 196, 222
de démarrage 236 SurErreur (action) 188
Pas 88, 105
J PDF 169
Jeu d’enregistrements 208 Pièce (jointe) 18 T
Jointure 93, 108 Pied de formulaire 125 Table 12
droite ou gauche 94 Points-virgules 78 création 46

246 Access® 2007 et VBA


Access Livre Page 247 Mercredi, 27. f vrier 2008 7:28 07

Tableau 227 Unique (formulaire) 127 W


croisé dynamique 113 Update (VB) 214
Where 87
Tabulaire, mode 153 USysRibbon 240
Temps, notion de 44
Titre de l’application 236 X
V
Totaux (icône) 91 XML 4, 240
Tracé d’enregistrement 70 Valeurs distinctes 88, 107
Transaction 98 Variable tableau 227
TransférerFeuilleCalcul (action) 183 VarTemp 185 Z
Tri 15, 86, 103 VBA 205 Zone
vbCrLF 202 de liste 135, 194
Verrouillage volet 239 déroulante 39, 56, 76, 133,
U Volet de navigation 4, 12, 238 153, 161
UML (Unified Modeling Language) 31 VraiFaux() 90, 148 de texte 131, 221

Index 247
Informatique

Access 2007
Microsoft®

Synthèse ®

de cours
&
exercices
et VBA
corrigés
L'auteur : Ce livre, qui porte sur la dernière version d’Access, présente toutes
Bernard Minot est professeur associé les étapes de la conception de bases de données de taille moyenne.
en informatique à l’université Paris-Est.
Il explique également comment réaliser des interfaces graphiques
Il y enseigne l’utilisation des tableurs,
l’audit informatique et la gestion des de saisie et de visualisation.
bases de données sous Oracle. Il est
également auditeur informatique dans Les premiers chapitres traitent de la modélisation des données, de
le cabinet qu’il dirige. la conception de tables grâce à l’interface graphique d’Access,
et de l’échange de données avec d’autres applications, telles
qu’Excel. Les chapitres suivants présentent les requêtes SQL,
les formulaires et les états, ainsi que les macros et la program-
Dans la même collection :
mation en langage VBA.
• Excel et VBA, B. Minot
• Le langage C, J.-M. Léry Le livre comprend de nombreux exemples et exercices dont les don-
• Le langage C++, M. Vasiliu
nées peuvent être récupérées sur le site www.pearsoneducation.fr.
• Java 5 et 6, R. Chevallier
Les exercices sont tous intégralement corrigés.
• UML 2, deuxième édition, B. Charroux et al
• Création de bases de données, Ce livre s’adresse en premier lieu aux étudiants de premier cycle,
N. Larrousse aux étudiants en IUT et en BTS. Il sera également utile aux PME
• SQL, F. Brouard, C. Soutou
désirant créer leurs propres bases de données.
• LaTeX, J.-C. Charpentier, D. Bitouzé
• Algorithmique, applications en C,
J.-M. Léry
La collection Synthex informatique propose de découvrir les
• Algorithmique en C++, J.-M. Léry
fondements théoriques et les applications pratiques des principales
• Algorithmique en Java 5, J.-M. Léry
• Mathématiques discrètes appliquées à
disciplines de science informatique. À partir d’une synthèse de
l’informatique, R. Haggarty cours rigoureuse et d’exercices aux corrigés détaillés, le lecteur,
• Architecture de l’ordinateur, E. Lazard étudiant ou professionnel, est conduit au cœur de la discipline,
• Systèmes d’exploitation, B. Lamiroy et al et acquiert une compréhension rapide et un raisonnement solide.
• Linux, J.-M. Léry
• Architecture des réseaux, D. Seret, D.
Dromard
• XML, G. Chagnon, F. Nolot

ISBN : 978-2-7440-4014-6
Pearson Education France
47 bis, rue des Vinaigriers
75010 Paris
Tél. : 01 72 74 90 00
Fax : 01 42 05 22 17
www.pearson.fr

Você também pode gostar