Vous êtes sur la page 1sur 153

https://kupdf.

net/download/access-2007-et-vba_5b09d868e2b6f52a6bec82c9_pdf#

Access 2007 Et VBA

Access 2007 Et VBA


January 27, 2017 | Author: Mohamed Rédha Mazighi | Category: N/A
253p

Short Description
Download Access 2007 Et VBA...

Description
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

Chapitre 1

Les objets d’Access

Chapitre 2

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


37

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

65 83

Chapitre 3

Chapitre 4

Les requêtes

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
programmation. 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 relationnelle. 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 structures é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 jargon du
métier) afin de choisir à bon escient celui qui sera le plus pertinent pour l’utilisateur. 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éprogrammé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égligeables. 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 sousmenus que l’utilisateur connaissait depuis toujours.
Avec la base de données, cette évolution 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
toutes 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 produits Office peuvent
désormais partager des données sur un site SharePoint sous Windows 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 entreprise. 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 indispensable 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’information.

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 : suffisamment 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 Development), 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… complexité. 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 automatique 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 également
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éralement 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 enseignement sur la mise en
pratique des tableurs et des bases de données, ainsi que sur l’audit informatique.

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


1

Chapitre

Les objets d’Access

1. Les éléments essentiels de la base............................... 10 Problèmes et exercices 1. Créer un


client et une commande .................... 25 2. Pratiquer un réassort................ 28 3. Analyser les
processus et les états ............................... 31 4. Analyser les données ............... 33 5. Retoucher
un formulaire en mode création .................... 35

En vue de simplifier la terminologie, on parle génériquement de la « base de données Access »


pour désigner l’ensemble du logiciel. En fait, Access n’est pas qu’une simple base de données,
mais plus exactement un ensemble d’objets beaucoup plus large et dont le cœur est constitué
par une base de données. Ce premier chapitre commence 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 existante. 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).

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 > Microsoft 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

Chapitre

L’accueil dans la base de données se visualise comme à la figure 1.2. Figure 1.2 Principaux
éléments de l’organisation d’Access.

Barre de menu

Volet de navigation

1.1 LA

Ruban

Barre d’outils d’accès rapide

Formulaire d’accueil

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 comporte 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ètement 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 applications 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 peuvent ê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’affichage 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 formulaire 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 totalisations 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 formulaires 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

Chapitre

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 supérieure
comme par le passé. Le volet de navigation comprend la mention « Les Comptoirs » 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 ordonnancements 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 personnalisé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 automatiquement 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

Chapitre

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 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
conservant 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 « Commande 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

Chapitre

2. Cliquez sur « Imprimer ». 3. Choisissez « Aperçu avant impression 1 ». 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 paramé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 parfaitement « 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 relations é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 enregistrement 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 probablement
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écisé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

Chapitre

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 ». 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 programmeur. Souvent, cette ouverture correspond à une démarche bien
précise : l’utilisateur, 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éalablement 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 formulaire 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 validation 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

Chapitre

1.4 LA

BARRE DE MENUS ET LES RUBANS 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 caractè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 à modifier 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 programmeur 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 doubleclic,
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 formulaire, 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 diffé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

Chapitre

La table « Clients » s’ouvre avec l’apparence de la figure 1.10. Figure 1.10 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 «
Northwind.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

Chapitre

Problèmes et exercices 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 seulement 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’application 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

• Énoncé

Dans cet exercice, vous devez vous placer en tant qu’utilisateur de la base Northwind, c’est-à-
dire un professionnel de la vente.

UN CLIENT ET UNE COMMANDE

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.

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.

Exercices

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 ».

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

Chapitre

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. 4.
Dans l’onglet « Détail commande » et la zone de liste déroulante « Produit », choisissez 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 commande » 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. • 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 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 ;

Exercices

En premier lieu, les différents acteurs doivent être en place et, au moins :
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, reconstitué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 • Énoncé

* Solution

28

PRATIQUER

UN RÉASSORT

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.

1. 1. 2. 3. 4.

Réalisation d’une commande client avec un article épuisé Cliquez dans le volet de navigation sur
« Liste commande ». Cliquez sur « Ajouter une nouvelle commande ». Choisissez le client créé
dans l’exercice 1. 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
commande 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

Access® 2007 et VBA

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

Chapitre

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. 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.

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.

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.

Exercices

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’approbateur, ni date
(ni, a fortiori, de date de paiement) 1.

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éparation 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’utilisateur 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 contenant 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

Chapitre

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). 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

• É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

* 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.

Exercices

LES PROCESSUS ET LES ÉTATS

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 lorsque 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 permettent 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

Chapitre

Figure 1.15 Représentation de la gestion des commandes client sous forme de diagramme d’état.

EXERCICE 4

ANALYSER

• É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.

LES DONNÉES

Figure 1.16 CLIENT N° de client Raison sociale Adresse

COMMANDE CLIENT N° de commande client N° de client N° de produit Quantité Etat C.Client

FOURNISSEUR N° de fournisseur Raison sociale Adresse

PRODUIT N° de produit Désignation Prix unitaire

TRANSPORTEUR N° de transporteur Raison sociale Adresse

EMPLOYE N° d’employé Nom Prénom Fonction Rôle

COMMANDE FOURNISSEUR N° de commande fournisseur N° de fournisseur N° de produit

Quantité Etat C.Fournisseur

Dans la réalité, la base de données est plus complexe : ne sont représentées ici que les données
essentielles qui seront décomposées par la suite. En revanche, le dessin général est
incontournable. • 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).

Exercices

Représentation des données essentielles de la base Northwind.

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

Chapitre

EXERCICE 5
RETOUCHER

• É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 :

UN FORMULAIRE EN MODE CRÉATION

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 formulaire tel qu’il
apparaît à la figure 1.18. Figure 1.18

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. 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.

Exercices

Formulaire de saisie des clients en mode création.

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

Chapitre

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

Merise, un outil méthodologique ...................... 38

Problèmes et exercices 1. Créer la base de données d’une bibliothèque de prêt ....... 53 2. Gérer
un organisme de formation ........................... 57 3. Créer la base de données du système
télépéage............... 60

Les exercices du chapitre précédent ont laissé entrevoir que l’assemblage des données stockées
dans une base nécessitait une organisation particulière ; dans la même optique, le montage des
objets qui contiennent ces données nécessite une méthode. Nous étudierons donc maintenant
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 manipulation 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 exemple 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 commande 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 signifiera 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


2

Chapitre

verra comme une zone de liste déroulante. Le dessin des deux tables mises en œuvre sera celui
de la figure 2.1. 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 « CIVILITE ». Enfin, la figure 2.1 montre un libellé parfaitement identique
du terme « ID_CIVILITE » 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émarche, 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_civilite » 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éroports, 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 semblent 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

Chapitre

requêtes structurées sur de pareils libellés. Il devient donc indispensable d’établir un système
relationnel entre les étudiants et leurs diplômes, à l’image de la figure 2.3. Figure 2.3 Modèle
relationnel simplifié EtudiantDiplô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
remplir 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 comporter qu’une
et une seule information : cette information doit être réduite à son expression é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 conjugaison 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 proprié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

Chapitre

Les relations de plusieurs à plusieurs Le cas inverse est beaucoup plus fréquent. Imaginons que
la base de données à créer 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é primaire 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éenLangue.

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,
progressera 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 reconstitution 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

Chapitre

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é. 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 enregistrements 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. 2. 3. 4.

Fermez toutes les applications éventuellement ouvertes. Démarrez Access. Cliquez sur l’icône
Base de données vide. 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 » ; changezle 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

Chapitre

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. 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_SALARIE » : 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 lisibilité 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équentes ; 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 internationaux). • 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 proposé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 obligatoire.

48

Access® 2007 et VBA

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

Chapitre

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 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’enregistrement 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 ajoutera 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 fondement
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

Chapitre

• En qualité de clé primaire pour la table « CIVILITE » ; • En qualité de clé étrangère dans la table
« CONTACT ». 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 « Appliquer 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émorisé. 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érentielle
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
informations à 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

Chapitre

Problèmes et exercices 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.

* 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 ; 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.) ;

Exercices

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.

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émentielle
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 exemplaires 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émentation 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 classement 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

Chapitre

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 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 le champ « ISBN_LIVRE », texte, 18 caractères, non indexé (clé étrangère). • 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.

Exercices

• Créez la table et son identifiant « ID_EXEMPLAIRE », clé primaire, NuméroAuto, Entier long,
Indexé sans doublon.

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

• É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 ; • une session donne lieu à
plusieurs inscriptions.

UN ORGANISME DE FORMATION

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.

Exercices

Chapitre

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
organisation, 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 : • • • •

58

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é.

Access® 2007 et VBA

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

Chapitre

• CP_CLIENT, Texte, 5 caractères, Null interdit, non indexé. • VILLE_CLIENT, Texte, 50 caractères,
Null interdit, non indexé. 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’application, 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_COURS, clé primaire, NuméroAuto, Entier long, Indexé sans doublons. • 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.

Exercices

• 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 :

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

• É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 badges à 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.

LA BASE DE DONNÉES DU SYSTÈME TÉLÉPÉAGE

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 suivantes : • 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

Chapitre

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é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 entreprise, 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 passage correspond à un couloir et un seul ; • un couloir enregistre plusieurs passages. 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.

Exercices

• un badge effectue plusieurs passages dans un couloir (dans le temps) ; • un passage


correspond à un badge et un seul ; et

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.
Table « CLIENT » :

62

2. Création des tables Voici la liste des tables avec leurs différents champs. • 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 Entreprise 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

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 effectivement rempli. •


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 :

Table « STATION » :

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 caractè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é. • 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é. •
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.

Exercices

Chapitre

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

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

Table « PEAGE » :

Table « PASSAGE » :

Table « TARIF » :

Table « BADGE » :

Table « LOCATION » :

Table « STE_AUT » :

Il ne faut évidemment pas créer de table « STATION_1 » comme l’indique le modèle relationnel
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. • 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). • 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. • 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é. • ID_BADGE, Clé primaire, NuméroAuto, Null interdit, Indexé sans
doublons. • CODEBARRE_BADGE, Texte, 13 caractères, Null interdit, Indexé sans doublon. •
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é. 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

Chapitre

Les différentes formes d’acquisition de données, importer et attacher 1. Les importations de


données..... 66 2. Les liaisons de données ............ 71 Problèmes et exercices 1. Importer des
données au format Excel ....................... 75 2. Importer des données au format
CSV ........................ 77 3. Importer des données d’une autre base Access........... 79 4. Établir les
contraintes référentielles............................ 80

Il existe de multiples manières d’acquérir des données dans Access. On peut les importer
complètement dans une base déjà existante, mais, au-delà de cette première approche, on peut
attacher des sources de données à une base sans avoir à les manipuler dans Access. Ces données
acquises, le logiciel offre un puissant assistant pour créer des requêtes propres à interroger la
masse d’informations 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 parviendra é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


3

Chapitre

Figure 3.1 Ajout des codes 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 format 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

Chapitre

• 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. • 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

Chapitre

plus prudent de l’intégrer à l’importation elle-même suivant la démarche montrée à la figure 3.5.
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

Chapitre

Contrairement aux liens avec Access, l’accès à la base de données via ODBC est conditionné par
la mise au point des moyens d’accès à cette base : le paramétrage représenté à la figure 3.8 est
donc primordial. 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 éventuellement 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 accessibles, à 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
provenance, 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

Chapitre

Problèmes et exercices 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.
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.pearsoneducation.fr, puis importez-le dans une nouvelle base nommée «
ECOLE_INTERNATIONALE.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 ». 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 proposée).

Exercices

EXERCICE 1

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. Positionnez 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 provient 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), obligatoire. 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

Chapitre

EXERCICE 2 • Énoncé

IMPORTER
DES DONNÉES AU FORMAT

CSV

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


ECOLE_INTERNATIONALE.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 possible
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

Exercices

Fichier CSV lu sous NotePad.

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_INTERNATIONALE.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

Chapitre

Figure 3.12 Table NOTE 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 propose 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 ».

* 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 ».

Exercices

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

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

• É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.

LES CONTRAINTES RÉFÉRENTIELLES

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 plusieurs ; 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

Chapitre

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


la nouvelle table « GROUPE ». 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.

Exercices

Conservez ces travaux, qui resserviront dans les chapitres suivants.

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

4
Chapitre

Les requêtes

1. Les requêtes Sélection .............. 84 2. Les requêtes Insertion, Suppression et Mise à jour .......
95 3. Les requêtes création.............. 100 Problèmes et exercices 1. 2. 3. 4. 5. 6.

Affichage par ordre alphabétique .. 103 Affichage sur critère de prénom ..... 104 Affichage sur
critère excluant un pays 104 Affichage sur critères multiples ....... 105 Affichage sur critère de
date .......... 105 Affichage sur critères de date et de pays .......................................... 7. Affichage
avec valeurs distinctes .... 107 8. Affichage des premiers éléments .... 107 9. Affichage avec
regroupement par pays et comptage.................... 108 10. Affichage avec jointure.................. 108
11. Affichage avec jointure et regroupement............................ 109 12. Appel de requêtes
multiples ........... 110 13. Affichage de la moyenne générale . 111 14. Affichage de la moyenne
par matière......................................... 112 15. Tableau croisé dynamique ............. 113 16. Tableau
croisé avec regroupement . 114 17. Regroupement et coefficient ........... 115 18. Requête
Ajout ............................... 118 19. Requête Suppression ..................... 120 20. Requête Mise à
jour ...................... 121

C’est par excès de langage qu’Access nomme « Requête » l’outil qui permet de rédiger et stocker
une requête SQL. Une requête est une interrogation d’une ou plusieurs tables ; l’interrogation
utilise un langage générique nommé SQL pour Structured Query Language (langage de requête
structurée). Outre la lecture des données suivant une grande variété de tris et de filtres (c’est la
commande SELECT de SQL), les requêtes permettent l’écriture de données par ajout,
modification ou suppression (ce sont les commandes INSERT, UPDATE ou DELETE de SQL). Les
premiers exemples de ce chapitre concernent la table « CODE_POSTAL » contenue dans la base «
CODES_POSTAUX.accdb », téléchargeable sur le site de l’éditeur, à l’adresse
www.pearsoneducation.fr. Par la suite, la table « ADRESSE », dans le même fichier Access, sera
utilisée.

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 indispensable 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

Chapitre

La syntaxe complète est SELECT CODE_POSTAL.* FROM CODE_POSTAL; qui signifie littéralement :
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 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 provisoirement 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 successivement 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

Chapitre

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 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. 2. 3. 4.

Dans la zone Critères de la colonne VILLE, saisissez le mot « PARIS » et validez. Des guillemets se
positionnent automatiquement pour cerner ce mot. Affichez en « Mode feuille de données ». 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 enregistrements 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 commence 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 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

Chapitre

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 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. 2. 3. 4.

Le cas échéant, fermez les requêtes et tables actives. Dans le ruban du menu « Créer », cliquez
sur l’icône Création requête. Sélectionnez la table « ADRESSE » puis fermez. 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 simplement 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 plusieurs 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

Chapitre

• 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 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 syntaxes 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électionner 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 Management 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 supprimez 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 renommant : 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

Chapitre

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. 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
refermezla. 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 « =01/01/1960 ». Dans la zone Critères de la seconde colonne
DATENAISSANCE_ELEVE, inscrivez « 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. 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 formulaire).

Exercices

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 :

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 seulement 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, Modification 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érations 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é automatique 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éplacements 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éplacements 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

Chapitre

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


propriété Afficher le sélecteur à Non. 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 formulaire


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 un formulaire. • Insérer un sous-
formulaire dans le premier.

Exercices

• Créer une requête source de données du sous-formulaire.

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 MoyenneDeNOTATION
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

Chapitre

Mise en œuvre du formulaire principal 1. Dans le volet de navigation, mettez la requête


Req1_Moyennes en surbrillance. 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-dessus 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 formulaire 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

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

Exercices

Établissement du lien entre formulaire et sous-formulaire.

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 formulaire
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 fonctionnel) 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
formulaire, 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
MoyenneDeNOTATION par Fixe (au lieu d’aucune propriété). 8. Modifiez la propriété Décimales
du contrôle Moyenne DeNOTATION en sélectionnant 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électionnant 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

Chapitre

11. Modifiez la propriété Boutons de déplacements par Non. 12. Modifiez la propriété Barres de
défilement par Aucune. 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 respectivement 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
Exercices

Formulaire du deuxième exercice en mode création.

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

• É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éroulante et zone
de liste ne sont pas les mêmes que les zones de texte et sous-formulaires utilisé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, particuliè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 ?

AVEC ZONE DE LISTE ET RÉACTUALISATION

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
Consultation 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

Chapitre

5. Insérez une étiquette de titre Consultation des résultats. Pour cela revenez au menu «
Création ». 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 à ). 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.

• 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; . À
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é.

Exercices

Dans les propriétés de cette zone de liste déroulante, on notera les points suivants :

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

Chapitre

l’expression suivante dans la zone Champ : «


MoyenneDeNOTATION:Round((Moyenne(NOTE.NOTATION));2) ». 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 : [Formulaires]![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 composée de
trois parties séparées par des points d’exclamation et de la forme : [Formulaires]!
[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 dessous. Pire,
si le formulaire est fermé puis réouvert, le choix d’un élève laisse la zone Moyennes
complètement vierge ! • À l’ouverture du formulaire, le contrôle Choix_Eleve ne comporte pas
de valeur (aucun é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.

Exercices

Cette imperfection provient du déroulement des faits suivants :

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 à 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

Chapitre

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. Figure 5.31

Exercices

Résultat final du troisième exercice.

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

Chapitre

Les états

1. Fonctionnement automatisé .... 168 2. Conception d’états, notion de


regroupement ................... 170 Problèmes et exercices 1. État des notes des élèves ........ 174

Il est toujours possible d’imprimer des formulaires. Mais là n’est pas leur destination première.
Les formulaires sont conçus pour la visualisation 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
programmeur 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écifiques à 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 fonctionnalité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 apparaissent 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 excessivement les marges : outre des messages erreurs
systématiques, l’impression est conditionné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’impression 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

Chapitre

imprimer occupent peu de place en largeur, ce chiffre peut être monté à 2, réduisant de moitié
le nombre de feuilles nécessaires ! 1. 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?displaylang=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’illustrer 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 graphique 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 paramé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

Chapitre

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. 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 donné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’entê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
formulaires 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.
Inversement, 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

Chapitre

5. Dans la même feuille de propriétés, positionnez la propriété Cumul à Par Groupe (au lieu de
Non). 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 plupart
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èrement 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 apparaî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épendante 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
renseignez 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

6
Chapitre

Figure 6.8 Boîte de dialogue 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).

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, ELEVE.PRENOM_ELEVE, MATIERE.NOM_MATIERE,
Avg(NOTE.NOTATION) AS MoyenneDeNOTATION FROM MATIERE INNER JOIN (ELEVE INNER JOIN
[NOTE] ON ELEVE.ID_ELEVE = NOTE.ID_ELEVE) ON MATIERE.ID_MATIERE = NOTE.ID_MATIERE

Exercices

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.

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

Chapitre

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. 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-NOMPRENOM. • 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é.

Exercices

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.

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]=[Formulaires]![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é
Formulaires 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 à renseigner 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

Chapitre

La macro doit avoir la structure décrite à la figure 6.12. Figure 6.12 Macro incorporée du
contrôle OK de la boîte de dialogue modale.

Exercices

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.

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

Chapitre

Les macros

1. Mise en œuvre des macros..... 182 2. Le passage des macros à Visual Basic........................ 189
Problèmes et exercices 1. Macro insérée dans une zone de liste.................................. 194 2.
Macro d’envoi de messages électroniques......................... 199

Déjà abordées rapidement, les macros d’Access permettent l’automatisation d’actions


successives, éventuellement sous condition. Fondamentalement différentes de celles d’Excel, les
macros Access n’enregistrent pas les gestes faits par l’utilisateur, 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 graduellement 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 à afficher 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électionnez 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 saurions 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

Chapitre

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. 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 postaux 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 exportation 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ération 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

Chapitre

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 : • le champ VILLE est cité
entre crochets et guillemets mais une apostrophe (quote simple) est insérée en outre avant le
dernier guillemet ; cette apostrophe sert à citer la variable 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 " & [VarTemp]![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 indispensable 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 affichage
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’orthographe, la ville de PAROS est demandée, à la place de PARIS, le programme répond
simplement « Le code de PAROS est » sans plus de commentaire. Pour éviter ce problème, on
peut écrire une macro conditionnelle, qui prévoira cette éventualité. 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([VarTemp]![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 programme 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 programme à 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

Chapitre

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.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’application. 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 intervenir dans les macros. Dans le programme de recherche d’un
code postal, une erreur intervient à 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 respecte 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
à enregistrement 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 proprié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

Chapitre

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.

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émarrage 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

Chapitre
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. 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 suivent, 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 énumè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 ellemê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 utilisé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 OpenTable. 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 noninitié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 éventualité, 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
appellera 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

Chapitre

• S’il survient une erreur dans le programme, le contrôle programme passe donc directement à
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. • 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 fonction. 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 messages 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’environnement 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 • Énoncé

MACRO

INSÉRÉE DANS UNE ZONE DE LISTE

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 à calculer
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 formulaire 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

Chapitre

Figure 7.13

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 [Formulaires]![Frm_Liste_Eleves]![Choix_Eleve] qui précise
respectivement et séparés 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.

Exercices

Zone de liste de l’exercice 1.

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 =" &
[Formulaires]![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( ; "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 convertissable
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

Chapitre

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 nouvelle 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 VARLIBMATIERE 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 recherchée", "Calcul de
moyenne"). Cette ligne, dont la fonction InputBox() est l’équivalent 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).

À ce stade, testez le programme : cliquez sur un élève de la liste, une boîte message 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.

Exercices

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

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

Chapitre VARPRENOM = Me.Choix_Eleve.Column(2) MsgBox "La moyenne en " &


VARLIBMATIERE & " de " & VARPRENOM & " " _ & VARNOM & " est de : " &
Format(DAvg("[NOTATION]", "NOTE", ➥_ "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

• É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 indiquant quelle est
sa moyenne. On imaginera que l’adresse internet des élèves est systématiquement de la
forme .@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écessaires 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 ». 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

Exercices

DE MESSAGES ÉLECTRONIQUES

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 automatiquement 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

Chapitre
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, carnet 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_EnvoiMail]!
[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

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 EnvoyerObjet. 4.
Choisissez Req_EnvoiNotes dans la liste des requêtes disponibles dans l’argument Nom d’objet.
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] & "@pearson.net".
Cette formule concatène le prénom, le nom et l’adresse de destination du

Exercices

Structure de la deuxième requête de l’exercice 2.

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(MoyDom("[NOTATION]";"NOTE";"ID_ELEVE =" &
[Formulaires]![Frm_EnvoiMail]![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

Chapitre

5. 6. 7. 8. 9. 10.

11. 12. 13. 14. 15. 16. 17.

L’argument Enregistrement est Suivant. Enregistrez les modifications et fermez cette macro. Dans
le menu « Créer », cliquez sur le bouton « Macro ». Dans la nouvelle macro ouverte,
sélectionnez l’action ExécuterMacro. L’argument Nom de macro doit être Mcr_EnvoiMail.
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é).
Enregistrez la macro sous le nom « Mcr_EnvoiGroupe ». Ouvrez, si nécessaire, le formulaire
Frm_EnvoiMail en mode création. Dans l’en-tête de formulaire, insérez un bouton de
commande. À 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. Sélectionnez la macro
Mcr_EnvoiGroupe dans la deuxième étape. Choisissez l’option Texte dans la troisième étape,
avec pour libellé Lancer un envoi groupé. 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 messagerie : 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

Exercices

Code de la macro d’envoi groupé.

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

Chapitre

Le langage VBA sous Access 1. Le lancement de requêtes SQL sous VBA ............................... 206
2. L’utilisation de la notion de RecordSet......................... 208 3. L’automation ......................... 215
Problèmes et exercices 1. Un programme de notation .... 219 2. Travail sur jeu
d’enregistrements .................. 224 3. Une automation Access/Word........................ 231

L’utilisation du code VBA donne à Access des performances et des capacités très supérieures à
celles qui sont disponibles sous l’interface graphique, tant dans l’affichage des données que dans
leur traitement. Ce chapitre présente l’exécution de requêtes SQL écrites avec le programme
VBA, puis une méthode pour charger des données en mémoire afin de les traiter sans même les
afficher. Enfin, nous étudierons les rudiments de l’automation, 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 langage 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électionner 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_POSTAL 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

Chapitre

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. 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/UserForm). 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’avertissement, 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èrement 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 obligatoirement afficher des données pour procéder à des
manipulations sur la base. Cette organisation 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émarche 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éricain. Le jeu d’enregistrements se constitue des
enregistrements chargés, avec leur ordonnancement 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 nommée DAO
(Data Access Objects). Dès lors, le programmeur peut « jouer » avec ces enregistrements, 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

Chapitre

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. 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 message dotée
de deux boutons : OK et Annuler. Si l’utilisateur clique sur OK, la valeur renvoyé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_POSTAL, 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’enregistrement 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

Chapitre rst.MovePrevious End If

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 proprié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 enregistrements 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 comprenant 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 enregistrements 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 enregistrements 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 modifications 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

Chapitre

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 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 toutes 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’enregistrement


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 programme
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’existence 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 syntaxe DELETE. On trouvera, ci-après, un exemple dans lequel sont supprimés
tous les enregistrements 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 interdite : la
suppression est immédiate.

214

Access® 2007 et VBA

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

Chapitre

(3)

L’automation 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 procé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 > Programmes > Microsoft Excel. 10. La ligne
suivante rend l’application visible prog_xlsx.Visible = True. En effet, lorsque 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 programmeurs 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

Chapitre

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_ 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 Dim Dim Dim Dim Dim

Echange_xlsx_accdb() prog_xlsx As Excel.Application fic_xlsx As Excel.Workbook db As


DAO.Database rst As DAO.Recordset 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éveloppé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, insertions 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 installé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

Chapitre

Problèmes et exercices EXERCICE 1

UN

• É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 :
PROGRAMME DE NOTATION

• 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

Exercices

Formulaire de notation des élèves.

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 suspension à 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

Chapitre

(présence d’un DISTINCT après le SELECT !), elle est reproduite graphiquement sur la figure 8.5.
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 formulaire 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).

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électionnez 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
Exercices

3. Création du code Visual Basic À l’ouverture du formulaire, les boutons et zones de texte de
saisie des notes doivent être invisibles :

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 Validation) 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

Chapitre

vide), ou une valeur Null, ou une chaîne de caractères (auquel cas le programme renverrait 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. • 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 plusieurs 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ériques (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 langage 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 Annulation) 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 commande
(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.

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é.

Exercices
4. Dans la première étape de l’assistant, choisissez les options « Opérations sur formulaires » et «
Fermer un formulaire ».

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

Chapitre

• 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). • 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éalisation 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

• 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. • 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

Exercices

Chaque fois que sera lu un nouvel enregistrement :

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écessaire
de passer en mode modification (rst_notes.Edit). Deux cas de figure se présentent : 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 correspond à 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

Chapitre 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 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 relativement lent :
si le fichier contient non pas des milliers mais des millions d’enregistrements, il pourra être
considéré comme non performant.

3. Version avec un tableau La deuxième formulation de la réponse pourrait donc emprunter une
autre voie en imaginant 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

Exercices

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éévalue à
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.

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 colonnes 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

Chapitre If rst(2).Value < 2 Then rst(3).Value = 0 Else 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 enregistrements ; 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 équivalents 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 performante 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

Exercices

Table d’équivalence de l’exercice 2.

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 EQUIVALENCE. Dans la zone Champ de la première
colonne choisissez NOTEPONDEREE de la table NOTE. Dans la zone Mise à jour inscrivez
VraiFaux([NOTATION] 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 modifié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’utilisateur. 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 utilisateur. 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. 2. 3. 4.

Faites un clic droit sur le premier élément : « Frm_ChoixEleve ». Cliquez sur « Ajouter à un
groupe > Nouveau groupe ». En haut, nommez le nouveau groupe « ECOLE » (au lieu de
Personnalisé1). 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

Chapitre

Il est envisageable de créer autant de groupes personnalisés que de besoin (maximum 10) pour
s’adapter aux utilisateurs. À 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 navigation.
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
personnalisé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
fonctionnalité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 par exemple et une balise fermante notée .
Les balises peuvent être dotées d’attributs du type . Dans un fichier texte ou XML, entrez le code
suivant :

La première balise (Customized User Interface ou Interface utilisateur personnalisée) est fermée
en fin de fichier par la même balise démarrée avec une barre de fraction (). Elle fait appel à une
adresse constante. La deuxième balise 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 vise les onglets supérieurs des rubans. Il n’a été créé ici qu’un seul onglet
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. 2. 3. 4.

Dans le menu « Créer », cliquez sur « Création de table ». Nommez le premier champ «
RibbonName » 1 (type texte de longueur 255). Nommez le second et dernier champ «
RibbonXml » (type mémo). 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

Chapitre

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. 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 :

La balise 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 . Chaque pavé est doté des attributs id (nom
unique) et label (étiquette). La balise 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

Chapitre

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.

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 & 185 .accdb 3, 23 .csv 77 .dsn 72 .laccdb 23 .mdb 3, 23

A Acrobat 169 Actions (macros) 182 ActiveX (contrôle) 143 ADO 208 Afficher le sélecteur 155
Ajout copier par 66 formulaire 128 Alias 89, 96 And 88 Apercu avant impression 168 ArrêtMacro
(action) 187 As 89 Assistant Masque de saisie 35 Attache 71 Automation Excel 215 Word 231

B Balise 240 Barre de synchronisation 32 de défilement 155 Begin transaction 99 Bentrée 184
BOF 210 Boîte de dialogue modale 174 BoîteMsg (action) 185

Bouton de commande 183 de déplacement 155 Branchement 192

C Case à cocher 139 Champ 47 Champ-père 158 Clé étrangère 51, 94 primaire 40, 54 Coller 66
par ajout 66 Colonne liée 135 Column (VB) 198, 232 Coma Separated Values 77 Comme 87, 104
Commit transaction 100 Compactage 237 Compte() 149 CompteDom() 150 Concaténation 185
Conditions 186 Continu (formulaire) 127 Contrainte référentielle 50, 80 Contrôle 22, 125 ActiveX
143 Bouton de commande 137 Cadre d’objet dépendant 138 Case à cocher 139 Etiquette 133
Onglet 141 zone de liste 135 déroulante 133 zone de texte 131 Conversion (en Visual Basic) 189
Copier 66

Curseur 210

D DAO 208 Date() 119 DéfinirVarTemp (action) 184 Delete 97 Délimitée (structure de fichier) 69
Démarrage, paramètres 236 Diagramme d’activité 32 d’état 32 Dim (VB) 197 Distinct 88
Distinctes, valeurs 107 Diviseur d’enregistrements 136 DoCmd 192 Domaine 149 Données
externes 69 Doublon 94

E Edit (VB) 213 Enregistrement, ligne 18 En-tête de formulaire 124 de ligne ou colonne 114
Entier Long 76 Entrée de données (formulaire) 129 EnvoyerObjet (action) 201 EOF 210 Et 88
États 12, 167 Etiquette 133 de ligne 192 Excel 67 automation 215

Index 245

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

ExécuterMacro (action) 187 ExtracChaîne() 91

F Facture, créer 27 Fen indépendante 174 Modale 174 Feuille (de données) 16 Fields 209 Filtre
15, 87, 103 Find 211, 225 Fonction 90 Compte() 149 CompteDom() 150 Date() 119 de domaine
149 ExtracChaîne() 91 Format() 196 Gauche() 90 MoyDom() 195 RechDom() 184 Round() 112
SommeDom() 150 VB 191 VraiFaux() 90, 148 Format() 196 Formulaire 12 ajout 128 continu 127
entrée de données 129 unique 127

G Gauche() 90 Générateur d’expressions 90, 140 de code 220 GoTo 192 Graphique 142 Groupe
d’options 139

I Icône 236 Identifiant 40 Importation de données 66 Index 48 Intégrité référentielle 50 IsDate


222 IsNumeric 222

J Jeu d’enregistrements 208 Jointure 93, 108 droite ou gauche 94

246

Access® 2007 et VBA

L Label 192 Largeurs colonnes 56 Lecture seule 154 Légende 48 Liaisons de données 71 Lien
hypertexte 143 Like 87 Limiter à liste 56, 133 Longueur fixe (structure de fichier) 69

Processus 32 Produit cartésien 94 Projet 191 Propriété (de formulaire) 126

Macro 12, 164, 178, 181 conditionnelle 186 incorporée 137 Mail 201 Mailing 172 Masque de
saisie 18, 63 Me 222 Merise 38 Mise à jour en cascade 51 Mise en forme conditionnelle 169
Mise en page 168 Modèle physique 38 Module 12, 190, 206 Move 210 MoyDom() 195 MsgBox
191 MySQL 4, 72

RechDom() 184 RecordCount 211 RecordSet 208 Rectangle (contrôle formulaire) 136 Réel
Double 76 Regroupement 91, 108, 170, 175 Regrouper et trier 171 Relation 38 de plusieurs à
plusieurs 42 de un à plusieurs 42 icône 34 réflexive 45, 61 Réorganiser (onglet) 153 Requête
ajout 95, 118 création 100 définition de données 101 mise à jour 98 paramétrée 89 Sélection 12,
84 suppression 97, 120 Round() 112 Ruban 11, 21, 239 RunSql 206

Non-correspondance 95 Not 88, 105 Null interdit 48

Select Case 226 Sélecteur 125 afficher 155 Sélection étendue (zone de liste déroulante) 136
multiple (zone de liste déroulante) 135 simple (zone de liste déroulante) 136 Séparateur 70
SetWarnings 222 SommeDom() 150 Source de données (formulaire) 129 Sous-formulaire 144,
155 SQL Server 4, 72, 238 Structure de fichier 69 Sub (VB) 191 Suppression en cascade 45, 52, 97
SurClic (propriété) 196, 222 SurErreur (action) 188

O Objet graphique 142 ODBC 71 Onglet 141 OpenRecordSet 210 Opération 91, 108 Options
Access (bouton) 236 Or 87 Ou 87, 105 Où 87, 103

P Paramètres d’importation 70 de démarrage 236 Pas 88, 105 PDF 169 Pièce (jointe) 18 Pied de
formulaire 125 Points-virgules 78

T Table 12 création 46

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

Tableau 227 croisé dynamique 113 Tabulaire, mode 153 Temps, notion de 44 Titre de
l’application 236 Totaux (icône) 91 Tracé d’enregistrement 70 Transaction 98
TransférerFeuilleCalcul (action) 183 Tri 15, 86, 103

U UML (Unified Modeling Language) 31

Unique (formulaire) 127 Update (VB) 214 USysRibbon 240

V Valeurs distinctes 88, 107 Variable tableau 227 VarTemp 185 VBA 205 vbCrLF 202 Verrouillage
volet 239 Volet de navigation 4, 12, 238 VraiFaux() 90, 148

W Where 87

X XML 4, 240

Z Zone de liste 135, 194 déroulante 39, 56, 76, 133, 153, 161 de texte 131, 221
Index 247

Informatique

Synthèse de cours

& exercices

Access 2007

Microsoft®

et VBA

corrigés L'auteur :

Bernard Minot est professeur associé en informatique à l’université Paris-Est. Il y enseigne


l’utilisation des tableurs, l’audit informatique et la gestion des bases de données sous Oracle. Il
est également auditeur informatique dans le cabinet qu’il dirige.

Dans la même collection : • Excel et VBA, B. Minot • Le langage C, J.-M. Léry • Le langage C++, M.
Vasiliu • Java 5 et 6, R. Chevallier • UML 2, deuxième édition, B. Charroux et al • Création de
bases de données, N. Larrousse • SQL, F. Brouard, C. Soutou • LaTeX, J.-C. Charpentier, D. Bitouzé
• Algorithmique, applications en C, J.-M. Léry • Algorithmique en C++, J.-M. Léry • Algorithmique
en Java 5, J.-M. Léry • Mathématiques discrètes appliquées à l’informatique, R. Haggarty •
Architecture de l’ordinateur, E. Lazard • Systèmes d’exploitation, B. Lamiroy et al • Linux, J.-M.
Léry

Ce livre, qui porte sur la dernière version d’Access, présente toutes les étapes de la conception
de bases de données de taille moyenne. Il explique également comment réaliser des interfaces
graphiques de saisie et de visualisation. Les premiers chapitres traitent de la modélisation des
données, de 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 programmation en langage
VBA. Le livre comprend de nombreux exemples et exercices dont les données peuvent être
récupérées sur le site www.pearsoneducation.fr. Les exercices sont tous intégralement corrigés.
Ce livre s’adresse en premier lieu aux étudiants de premier cycle, aux étudiants en IUT et en BTS.
Il sera également utile aux PME désirant créer leurs propres bases de données. La collection
Synthex informatique propose de découvrir les fondements théoriques et les applications
pratiques des principales disciplines de science informatique. À partir d’une synthèse de cours
rigoureuse et d’exercices aux corrigés détaillés, le lecteur, étudiant ou professionnel, est conduit
au cœur de la discipline, et acquiert une compréhension rapide et un raisonnement solide.

• Architecture des réseaux, D. Seret, D. Dromard • XML, G. Chagnon, F. Nolot

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

ISBN : 978-2-7440-4014-6

Comments
About | Terms | Privacy | Copyright | Contact

Copyright © 2017 KUPDF Inc.