Vous êtes sur la page 1sur 52

Débuter avec Access - Première base de données

Access est un SGBDR, un Système de Gestion de Bases de Données Relationnelles. Il est conçu pour gérer
les données complexes reliées entre elles. Lorsque ces données deviennent conséquentes, vous ne devez
en aucun cas utiliser Excel pour les gérer mais Access. Un de ses objectifs est d'éviter de répéter les
données. Par exemple, dans le cas de clients qui passent régulièrement des commandes, nous ne
construirons pas un tableau qui répète à chaque fois les données du client et les informations de sa
commande. Nous construirons une table qui identifie de façon unique chaque client. Et à cette table, par
le biais d'une clé primaire, nous relierons la table commandes dans laquelle seront listées toutes les
commandes. Ainsi pour un client, dont les informations ne seront pas répétées, il sera facile d'obtenir la
synthèse de toutes les commandes qu'il a passées.
 Cliquer sur l'icône d'Access pour le démarrer,
A l'ouverture, Access propose plusieurs choix comme Application web personnalisée. Nous y reviendrons.
 Cliquer sur le premier, base de données de bureau vide,

Comme vous le remarquez, et c'est une différence de philosophie fondamentale avec les autres
logiciels, Access vous demande tout de suite d'enregistrer votre base dedonnées, avant même de
commencer. En effet les saisies dans les tables et formulaires sont enregistrées en temps réel sur le
disque dur. Elles ne sont pas stockées en mémoire pour être ensuite sauvegardées.
 Taper un nom dans la zone Nom du fichier,
 Choisir un emplacement de sauvegarde en cliquant sur l'icône du dossier à droite,
 Puis cliquer sur le bouton Créer.
Toute l'ossature d'une base de données se construit sur les tables. Ce sont elles qui doivent être pensées
pour gérer les données et les relier entre elles avant de commencer tout autre travail. C'est
pourquoi Access vous dirige d'entrée sur la vue d'une première table à créer en mode Feuille de
données.
Vous remarquez, comme pour tous les logiciels Office, la présence des rubans sur la partie supérieure de
la fenêtre. La colonne de gauche quant à elle, liste tous les objets de votre base de données, créés à ce
stade. Nous y retrouverons ainsi les tables, les requêtes, les formulaires, les états et les macros. Pour nos
clients, nous allons définir quels sont les champs qui composent notre table. Pour ce faire :
 En haut à gauche, cliquer sur la flèche du bouton Affichage,
 Dans la liste, cliquer sur Mode Création,
Access demande un nom pour cette table.
 Saisir Clients puis valider par Ok.

Vous basculez dans la vue du mode création de la table Clients, désormais listée explicitement dans la
colonne de gauche. La création des champs (Les en-têtes de colonne de votre tableau ) requiert deux
informations pour chacun d'entre eux. Le nom du champ et son type dedonnées. Il est judicieux
d'attribuer aux noms des champs, le préfixe du nom de la table. Vous le verrez, il sera ainsi plus facile de
les manipuler via les requêtes notamment.
 A la place de N°, taper clients_num et enfoncer la touche Tabulation,
Vous vous retrouvez ainsi dans la colonne Type de données.

Cette colonne représente un point crucial au moment où vous montez les tables qui définissent l'ossature
de votre base de données. En effet ils permettent de dimensionner les champs en même temps que vous
leur affectez un type. Le type doit toujours correspondre précisément à la nature de l'information qui sera
saisie. Il peut s'agir d'un texte pour les noms, d'une date pour les dates d'achat, d'un nombre entier pour
la quantité achetée etc... Mais ce n'est pas tout. Ces champs ne doivent pas être dimensionnés trop
grands. Car à chaque champ, Access alloue l'espace mémoire en conséquence pour le gérer. Si votre base
est volumineuse et qu'elle traite beaucoup de données, un mauvais dimensionnement occasionnera des
ralentissements, nuisibles pour votre site Web par exemple. Ainsi, un texte pour un nom pourra être
limité à 20 ou 25 caractères. Un nombre entier pour une quantité achetée pourra être un entier court ou
un Octet. Nous reviendrons sur ces notions fondamentales. Ici nous conservons le type de
données NuméroAuto. En effet, chaque client doit être unique. Le NuméroAuto s'incrémente
automatiquement et attribue un numéro unique à chaque nouveau client saisi. A ce titre, vous notez la
présence d'une petite clé sur la gauche du nom du champ. Il s'agit d'une clé primaire. Uneclé
primaire n'autorise pas les doublons et permet de relier les tables entre elles. Chaque table devrait
disposer d'une clé primaire. Poursuivons la création des champs :
 Sur la ligne du dessous, créer le champ clients_nom,
 Lui affecter le type de données Texte court,
 En bas de la fenêtre, dans l'onglet Général des Propriétés du champ, régler la valeur de la propriété Taille
du champ sur 25,
Pour ne pas être trop gourmand, nous limitons le nombre de caractères pour le nom du client. Nous
essayons de dimensionner au plus juste et au plus judicieux comme nous l'avons expliqué avant.
 Créer ensuite le champ clients_prenom en Texte court et taille 25,
 Créer le champ clients_cp en Texte court et taille 5,
 Créer le champ clients_ville en Texte court et taille 25,
 Créer le champ clients_dateN en Date/Heure et Format Date, abrégé,

Le champ clients_dateN est prévu pour la date de naissance du client. Vous notez que le
champ clients_cp est typé en texte et non en numérique. En effet, nous ne ferons jamais d'opération sur
les codes postaux. De plus le champ texte permet de limiter la taille du champ à 5 caractères soit la taille
exacte d'un code postal.
 Enregistrer cette table (CTRL + S),
Les objets créés comme les tables et formulaires doivent être enregistrées contrairement aux saisies qui
se sauvegardent en temps réel comme nous l'avons expliqué plus haut.
 Cliquer sur le bouton Affichage en haut à gauche dans le ruban,
Vous basculez ainsi en mode feuille de données, le mode de saisie des données.
 Saisir quelques enregistrements comme le suggère la capture ci-dessous.

Pensez à utiliser la touche tabulation pour passer au champ suivant. Vous remarquez la limitation
des champs en taille. Si par exemple vous essayez de dépasser les 5 caractères pour la saisie d'un code
postal, vous constatez que la saisie se bloque. Il s'agit donc d'une sécurité intéressante. Chaque nouvelle
ligne (nouvel enregistrement) s'accompagne de l'attribution automatique d'un nouveau numéro unique
(clients_num). Ici les saisies sont enregistrées en temps réel sur le disque dur. Nous allons maintenant
construire la table Commandes. Nous allons volontairement la simplifier afin de nous concentrer
exclusivement sur la philosophie de base de données pour l'instant. Nous limiterons donc le nombre
de champs.
 Fermer l'onglet de la table Clients en cliquant sur sa croix en haut à droite,
 Cliquer sur l'onglet Créer en haut de la fenêtre Access,
 Dans le ruban, cliquer sur le bouton Création de table,
Nous revenons ainsi dans le mode Création de table dans lequel nous étions toute à l'heure. Chaque table
doit avoir un identifiant unique :
 Créer le champ Commandes_num,
 Lui affecter le type de données NuméroAuto,
 Cliquer avec le bouton droit de la souris sur son entête de ligne,
 Dans le menu contextuel, cliquer sur Clé Primaire,
Vous voyez ainsi apparaître l'icône de la clé primaire en regard du champ. Cette dernière permettra
d'éviter de saisir des commandes en double.

 Créer ensuite le champ Commandes_client avec un type de données Numérique et une taille définie
sur Entier long,
Ce champ numérique servira à faire le lien entre le client et ses commandes. La taille Octet aurait été trop
petite car un octet permet la saisie d'un nombre de 0 à 255. Nous espérons bien avoir plus de 255
commandes. De plus comme ce champ va servir de liaison, il doit être du même type que son parent
(Clients_num) qui est un Entier long.
 Créer le champ Commandes_total en numérique et de taille Réel simple,
Un réel simple autorise les décimales pour les montants qui ne sont pas ronds.
 Créer le champ Commandes_date en Date/Heure et de format Date, abrégé comme toute à l'heure,
 Enregistrer cette table (CTRL + S) en la nommant Commandes,
Cette nouvelle table apparaît bien dans la liste des objets sur la gauche.

Nous ne devons pas saisir tout de suite dans la table Commandes. Nous devons ajouter une sécurité qui
empêchera toute saisie de commande n'appartenant à aucun client. Pour ce faire, nous allons établir
une relation entre ces deux tables en appliquant l'intégrité référentielle.
 Fermer la table Commandes en cliquant sur la croix de son onglet en haut à droite,
 Cliquer sur l'onglet Outils de base de données en haut de la fenêtre,
 Dans le ruban, cliquer sur le bouton Relations,
 Dans la boîte de dialogue qui apparaît, sélectionner les
deux tables Clients et Commandes à l'aide de la touche CTRL et de la souris,
 Cliquer sur le bouton Ajouter puis sur le bouton Fermer,Les deux tables sont matérialisées
côte à côte avec leurs noms de champs.
 Cliquer et glisser le champ Clients_num sur le champ Commandes_client,
Une boîte de dialogue s'affiche instantanément.
 Cocher les trois cases Appliquer l'intégrité référentielle, Mettre à jour en cascade... et Effacer en
cascade...,
 Cliquer sur Ok pour valider.

Vous remarquez l'apparition d'un trait en biais reliant les deux champs des deux tables avec les symboles
1 et infini. Ils signifient tout simplement qu'un client peut passer un nombre de commandes illimité. A
l'inverse une commande ne peut appartenir au plus et au moins qu'à un seul client. L'intégrité
référentielle est la sécurité Access qui empêchera d'attribuer une commande à un client qui n'existe pas.
Autre avantage du SGBDR, base de données relationnelle, les actions en cascade. Par exemple, le fait de
supprimer un client de la table Clients, supprimera toutes ses commandes dans la table
Commandes (Effacer en cascade).
 Enregistrer les relations (CTRL + S) et fermer son onglet,
 Dans la liste des objets sur la gauche, double-cliquer sur la table Clients,
Nous l'affichons ainsi en mode saisie.
 De la même façon, double-cliquer sur la table Commandes,
Les deux tables apparaissent ainsi côte à côte. Leurs onglets nous permettent de basculer facilement de
l'une à l'autre.
 Saisir plusieurs commandes comme l'illustre la capture ci-dessous,
Faites-en sortes d'attribuer plusieurs commandes aux mêmes clients à l'aide des numéros de client.
Tentez de même d'attribuer une commande à un client qui n'existe pas (Par exemple le numéro 7).
Vous constaterez le message d'erreur de l'intégrité référentielle apparaître. La relation entre
les tables nous empêche de commettre l'erreur d'associer une commande à un client qui n'existe pas.
C'est donc une sécurité très importante pour ne pas risquer de perdre des traitements de commandes
dans la nature.
Access - Les requêtes sur les tables
Les requêtes de synthèse
Les requêtes de synthèse permettent d'effectuer des regroupements de données issues de
plusieurs tables. Elles affichent sous une même vue toutes les informations demandées. Dans le cas
d'une table Clients et d'une table Commandes, la requête de synthèse regroupe les données pour afficher
les commandes du client avec les informations du client. Elle permet de plus de faire des opérations de
synthèse comme la somme des commandes en les regroupant par client. La vue qu'elle fournit permet
donc une lecture de synthèse rapide et efficace. Le résultat d'une requête n'est ni plus ni moins
qu'une table. Si bien qu'une requête peut être utilisée au même titre qu'une table pour construire les
autres objets Access tels que les formulaires et les états.
 Télécharger la base de données facturation-requetes.accdb en cliquant sur ce lien,
 L'ouvrir dans Access,
Il s'agit d'une petite base de données de facturation avec la table des clients et celles des commandes du
client. Elles sont donc reliées entre elles par le jeu des relations. Certains clients ont passé plusieurs
commandes. Donc pour un client recensé dans la table Clients, il peut y avoir plusieurs lignes de
commandes lui appartenant dans la table Commandes.

 Cliquer sur l'onglet Créer en haut de la fenêtre Access,


 Cliquer sur le bouton Assistant requête dans la zone Requêtes,
 Dans la boîte de dialogue qui apparaît, choisir Assistant requête simple et cliquer sur Ok,
Dans l'étape qui suit, nous souhaitons afficher les informations des tables Clients et Commandes pour les
regrouper.
 Choisir Table :Clients dans la liste déroulante Tables/Reqêtes,
 Cliquer sur le bouton à double flèche de la zone centrale afin de sélectionner tous ses champs,
 Choisir ensuite Table : Commandes dans la liste déroulante Tables/Reqêtes,
 Double-cliquer sur le champ Commandes_num pour le basculer à droite,
 De la même façon, double cliquer sur Commandes_total et Commandes_date,
Ainsi nous n'ajoutons pas le champ Commandes_client. Il sagit en effet de la clé externe reliée à la clé
primaire de la table Clients. Nous avons déjà ajouté le champ Clients_num, donc nous ne souhaitons pas
répéter cette information.
 Cliquer sur le bouton Suivant pour continuer la construction de la requête,
 Cocher la case Synthèse et cliquer sur le bouton Options de synthèse,
Nous souhaitons afficher le nombre de commandes par client ainsi que la somme des commandes par
client. Pour ce faire, dans la boîte de dialogue qui est apparue :
 Cocher la case Somme pour le champ Commandes_total,
 Cocher la case Compter les enregistrements dans Commandes,
 Cliquer sur Ok pour valider ces choix,

 Cliquer ensuite sur le bouton Suivant pour poursuivre,


 Dans cette étape, conserver le choix de groupement Date/heure unique,
 Puis cliquer sur Suivant,
 Enfin donner un titre à la requête comme : Commandes_du_client,
 Et cliquer sur Terminer pour valider la création de la requête.

Les résultats de la requête s'affichent dans la partie centrale de l'écran sous une vue semblable à celles
des tables. Vous notez de même que ce nouvel objet, Commandes_du_client, s'affiche dans la liste
des objets Access sur la gauche, dans la partie Requêtes. De plus vous constatez que les informations des
clients et de leurs commandes sont bien affichées ensemble. A l'origine, elles appartiennent pourtant à
deux tables distinctes reliées entre elles. En plus de cela, les commandes d'un même client sont
regroupées. D'une part les informations du client ne sont ainsi pas répétées sur plusieurs lignes, d'autre
part la somme des montants des commandes d'un client est synthétisée dans un nouveau champ et enfin
un dernier champ récapitule le nombre de commandes du client. Cette requête pourtant simple à la
construction offre déjà beaucoup de précieux renseignements synthétisés.
 Cliquer sur l'onglet Accueil,
 Dans le ruban, cliquer sur la flèche du bouton Affichage,
 Dans la liste, cliquer sur Mode création,
Cette vue permet de voir tous les champs inclus dans la requête et d'agir dessus. Il est ainsi possible de
visualiser les opérations, comme celle de la somme. Nous pouvons la modifier ou effectuer d'autres
opérations et aussi ajouter des critères. Nous allons commencer par masquer les champs dont les
renseignements sont moins importants.
 Décocher la case Afficher du champ Clients_prenom,
 Décocher la case Afficher du champ Premier de Commandes_num,
 Décocher la case Afficher du champ Premier de Commandes_date,

 Dans le ruban, cliquer sur le bouton Exécuter pour afficher la requête en Feuille de données,
La vue est plus épurée, plus simple à lire.
 Revenir en mode Création,
Vous remarquez la présence d'une ligne Opération. Tous les champs qui peuvent l'être sont regroupés
(Regroupement) lorsqu'ils correspondent comme Clients_num. Pour ces regroupements,
l'opération Somme est réalisée sur le champ Somme de Commandes_total. Nous souhaitons maintenant
afficher les commandes des montants les plus importants vers les plus petits.
 Régler la valeur du Tri sur Décroissant pour le champ Somme De Commandes_total,
 Cliquer sur le bouton Exécuter du ruban,
Vous remarquez que les commandes s'affichent bien triées de la plus grande somme vers la plus petite.
Nous souhaitons maintenant n'afficher que les clients qui ont passé plusieurs commandes.
 Revenir en mode création de la requête,
 Taper >1 dans la zone Critères du champ Compte De Commandes,
 Cliquer sur le bouton Exécuter du ruban,

Seuls les clients ayant passé plusieurs commandes apparaissent triés selon la somme totale de leurs
commandes. Ainsi, à une requête de synthèse qui réalise déjà de précieuses opérations
automatiquement, nous sommes capables d'ajouter très simplement des restrictions, critères et tris grâce
au mode création. Nous obtenons facilement une requêterelativement complexe à l'usage pertinent et
efficace.

Le code des requêtes - Le langage SQL


Chacune des requêtes que vous réalisez à l'aide des assistants est bâtie sur un langage universel.
Le Sql est le langage de requêtage qui permet d'attaquer les données pour en extraire les informations
selon criètre. Pour présenter sommairement ce langage associé, nous allons créer une requête très
simple, sur une table seulement. Nous consulterons ensuite son code et tenterons d'y appliquer quelques
ajustements.
 Dans le ruban Créer, cliquer sur le bouton Assistant requête,
 Dans la boîte de dialogue, choisirAssistant requête simple et cliquer sur Ok,
 Dans l'étape qui suit, sélectionner Table : Clients dans la liste Tables/Requêtes,
Vous remarquez à ce stade que la requête que nous avons précédemment construite est proposée dans la
liste. Cela signifie qu'une requête peut être utilisée pour créer une autre requête plus complexe.
 Sélectionner tous les champs de la table Clients en cliquant sur le bouton double flèche au centre de la
boîte de dialogue,
 Cliquer sur Suivant,
 Nommer cette requête Requete_clients et cliquer sur Terminer,
Nous obtenons exactement la même vue que celle de la table Clients. A ce stade, cette requête fait donc
office de doublons.
 Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
 Dans la liste, cliquer sur Mode SQL,
Plutôt que d'afficher la requête en mode création comme nous l'avons fait précédemment, nous décidons
d'accéder directement au code source de cette dernière.

Le code exact de la requête est le suivant :


SELECT Clients.[clients_num], Clients.[clients_civilite], Clients.[clients_nom], Clients.[clients_prenom],
Clients.[clients_cp], Clients.[clients_ville], Clients.[clients_dateN] FROM Clients;

SELECT est le mot clé SQL pour débuter une requête sélection. Tous les champs qui suivent séparés d'une
virgule seront sélectionnés et affichés dans le résultat de la requête. Un champ comme clients_num
s'écrit entre crochets et est précédé du nom de la table dont il est issu : Clients.[clients_num]. Ici, tous les
champs de la table Clients sont énumérés car nous les avons tous sélectionnés. FROM est le mot
clé SQL qui permet de désigner sur quelle table nous effectuons la requête sélection. Donc FROM
Clients signifie que nous réalisons la requête sur la table Clients. Nous terminons toujours la syntaxe par
un point-virgule. Commençons les modifications. Nous ne voulons plus voir apparaître les champs prenom
et cp :
 Dans le code, supprimer les fragments, Clients.[clients_prenom], et Clients.[clients_cp],,
Pensez bien à ne pas oublier la virgule qui va avec, sinon vous obtiendrez une erreur de syntaxe.
 Enregistrer (CTRL + S),
 Cliquer sur le bouton Exécuter du ruban,
Nous obtenons bien une vue restreinte de la table Clients, avec deux champs en moins.
 Cliquer sur Mode Sql dans le bouton Affichage pour revenir dans l'éditeur de code,
Il existe une méthode très simple pour désigner tous les champs d'une table dans une requête sélection.
Il suffit de remplacer l'énumération des champs par le symbole * qui signifie Tous.
 Modifier la requête comme suit : SELECT * FROM Clients;,
 Cliquer le bouton Exécuter,
De nouveau nous retrouvons la vue de la requête initiale mais nous avons considérablement simplifié la
syntaxe. Nous souhaitons maintenant afficher les clients du plus ancien au plus jeune. Le mot clé ORDER
BY suivi du nom du champ permet de réaliser un tri dans une requête. Son expression doit toujours être
placée en dernier, avant le point-virgule de clôture de la syntaxe.
 Revenir dans l'éditeur SQL,
 Ajouter l'expression de tri avant le point virgule : ORDER BY Clients.[Clients_dateN],
 Cliquer sur le bouton Exécuter,
Nous obtenons bien un tri croissant des clients sur leur date de naissance : SELECT * FROM Clients ORDER
BY Clients.[Clients_dateN];. Si nous avions souhaité un tri décroissant, du plus jeune au plus ancien, nous
aurions ajouté le mot clé DESC : ORDER BY Clients.[Clients_dateN] DESC. Nous souhaitons n'afficher
maintenant que les clients de l'Ardèche, soit les clients dont le code postal commence par 07. Nous en
avons deux. Pour ajouter un critère dans une requête, nous allons devoir insérer une clause WHERE dans
la syntaxe. Nous ne pouvons pas utiliser le symbole égal pour la correspondance car aucun des codes
postaux n'est égal 07. Nous allons utiliser l'opérateur LIKE pour signifier que nous recherchons tous
les champs qui commence par 07. La clause WHERE intervient toujours après la clause FROM suivi du
nom de la table.
 Revenir dans l'éditeur SQL,
 Ajouter la clause WHERE suivante : WHERE Clients.[Clients_cp] LIKE '07*', après la clause FROM,
Nous demandons désormais d'afficher les clients pour lesquels (WHERE) le code postal commence par 07.
Comme le code postal est un champ texte, nous écrivons l'expression entre guillemets. Le * placé juste
derrière signifie, quels que soient les caractères qui suivent le 07 : SELECT * FROM Clients WHERE
Clients.[Clients_cp] LIKE '07*' ORDER BY Clients.[Clients_dateN];.
 Cliquer sur le bouton Exécuter,

Il ne nous reste en effet plus que deux enregistrements, ceux de l'Ardèche, triés croissants sur la date de
naissance. Avec quelques petites retouches dans la syntaxe SQL nous avons donc bien réussi à
personnaliser notre requête.
 Fermer la requête en cliquant sur la croix de son onglet.

Requête de non correspondance


La requête de non correspondance est proposée dans la liste de l'assistant requête. Comme son nom
l'indique, elle permet d'isoler avec grande simplicité les enregistrements orphelins. Dans notre cas, nous
avons des clients dans la table Clients qui passent des commandes dans la table Commandes. Or certains
de ces clients n'ont à ce jour encore passé aucune commande. Nous devons les extraire, pour les relancer
commercialement par exemple. La requête est d'autant plus efficace que la base est volumineuse. Son
code, si nous devions la concevoir nous même serait complexe.
 Cliquer sur le bouton Assistant requête dans le ruban Créer,
 Dans la boîte de dialogue, sélectionner Assistant requête de non correspondance et cliquer sur Ok,

 Dans l'étape qui suit, sélectionner la table Clients,


 Et cliquer sur Suivant,
C'est en effet elle qui contient les enregistrements Orphelins que nous souhaitons débusquer.
 Dans cette nouvelle étape, sélectionner la table Commandes,
 Et cliquer sur Suivant,
C'est en effet elle la table liée, qui permettra de définir qui n'a pas passé de commande. Dans l'étape qui
suit, nous devons confirmer à Access quel est le lien entre les clients et leurs commandes.
 Sélectionner le champ Clients_num sur la partie gauche, il s'agit de la clé primaire,
 Sélectionner le champ Commandes_client sur la partie droite, il s'agit de la clé externe,
 Cliquer sur le bouton à deux flèches sur la partie centrale de la boîte de dialogue,
Nous réaffirmons ainsi le lien entre les deux tables.

 Cliquer sur le bouton Suivant,


Cette avant dernière étape demande quelles sont les informations à afficher concernant les clients qui
n'ont pas passé de commande. Nous les voulons toutes.
 Cliquer sur le bouton à deux flèches sur la partie centrale,
 Cliquer sur Suivant,
 Enfin, nommer la requête Clients_sans_commandes et cliquer sur Terminer.
Dans une vue Feuille de données, nous obtenons effectivement les clients n'ayant jamais passé
commande. Ce traitement est d'autant plus intéressant qu'à chaque exécution de la requête, la liste est
susceptible d'évoluer si les contenus des tables Clients et Commandes évoluent eux-mêmes. Si vous
ouvrez la table Commandes en mode Feuille de données, vous constaterez bien que les clients concernés
n'ont jamais passé commande (Champ Commandes_client).

Les requêtes paramétrées


Il s'agit de requêtes spécifiques pour lesquels nous entrons volontairement un argument erroné. Ainsi au
moment de s'exécuter, Access demande des précisions sur cet argument. Nous lui fournissons, et nous
isolons ainsi la ligne en instantané. Imaginez que vous souhaitez, derrière votre caisse, retrouver
rapidement les informations d'un client qui est en face de vous au moment de payer. Vous n'allez par
parcourir toute la table à sa recherche, ou refaire une requête sous ses yeux. Non, vous allez exécuter
une requête toute prête qui demande simplement le nom du client à afficher. Le plus simple est de partir
d'une requête existante, Commandes_du_client et de fournir un critère impécis sur son nom de manière
à amener Access à poser la question.
 Cliquer avec le bouton droit de la souris sur la requête Commandes_du_client dans le volet de gauche,
 Dans le menu contextuel, cliquer sur Mode création,
 Supprimer le critère >1 dans le champ Compte De Commandes...,
 Dans la zone Critères du champ Clients_nom, taper : [Nom du client ?],
Les crochets sont impératifs. Ils signifient à Access qu'il s'agit d'un paramètre à définir.

 Cliquer sur le bouton Exécuter du ruban,


Comme vous le remarquez une boîte de dialogue se déclenche avec le message que vous avez
personnalisé entre crochets.
 Taper un nom de client ayant passé commande comme Decajou,
La casse n'est pas importante.
 Valider en cliquant sur Ok,

Vous obtenez l'information isolée en instantané.


 Fermer la requête en cliquant sur la croix de son onglet.

Les requêtes Action


Requête Mise à jour ou Update
Les requêtes Action sont celles qui agissent sur les données des tables. Elles ne se contentent plus de les
sélectionner pour en offrir une vue personnalisée, elles les modifient. Nous allons d'abord réaliser une
copie de la table Clients sur laquelle nous allons faire les manipulations avec les requêtes Action.
 Sélectionner la table Clients dans le volet de gauche des objets Access,
 Réaliser les raccourcis CTRL + C puis CTRL + V au clavier,
 Dans la boîte de dialogue qui apparaît, cliquer sur Ok.
La copie de la table apparaît dans la liste des tables du volet de gauche.
 Faire de même avec la table Commandes pour obtenir une copie,
 Cliquer sur l'onglet Créer,
 Cliquer sur le bouton Création de requête du ruban Accueil,
Cette fois, nous ne passons pas par l'assistant.
 Dans la boîte de dialogue qui apparaît, double cliquer sur la table Copie de Commandes pour l'ajouter,
 Puis cliquer sur le bouton Fermer de la boîte de dialogue.
Nous sommes de retour dans le mode création d'une requête.
 Dans le rectangle schématisant la table, cliquer sur le premier champ pour le sélectionner,
 Puis, en maintenant la touche MAJ enfoncée, cliquer sur le dernier,
Ainsi vous sélectionnez tous les champs de la table.
 Cliquer et glisser cette sélection sur la grille de requête en bas de fenêtre.
Ainsi vous ajoutez tous les champs de la table Commandes dans la zone de requête.

A ce stade, si vous cliquez sur le bouton Exécuter, vous n'obtiendrez rien de plus qu'une vue de la table
Commandes. Soit une basique requête sélection. Nous souhaitons appliquer une remise de 10% aux
clients dont le montant de la commande dépasse 100 Euros.
 Dans le ruban, cliquer sur le bouton Mise à jour,
Vous transformez ainsi votre requête en requête action, précisément mise à jour ou Update en
langage Sql. Vous remarquez que les lignes Afficher et Tri disparaissent au profit notamment de la
ligne Mise à jour.
 Dans la zone Critères du champ Commandes_total, taper >100,
 Dans la zone Mise à jour du même champ, taper l'expression [Commandes_total]*0,9,
Nous venons donc d'indiquer à Access de faire une remise de 10% (1-0,1=0,9) sur le champ
Commandes_total lorsque le montant est >100.
 Cliquer sur le bouton Exécuter,
Un message d'avertissement Access apparaît. Il vous informe que quatre lignes de la table sont
concernées et que vous allez les modifier.
 Cliquer sur Oui pour continuer.
Vous remarquez que l'exécution s'arrête. En effet, une requête Action n'affiche pas de vue mais elle agit.
 Afficher les tables Commandes et Copie de Commandes,
 Basculer de l'une à l'autre.
Vous remarquez effectivement que tous les montants supérieurs à 100 ont été remisés de 10%. Attention,
à chaque fois que vous exécuterez cette requête, les montants supérieurs à 100% subiront une nouvelle
remise de 10%. Dans certains cas, il est préférable de supprimer ces requêtes après action.
 Fermer cette requête en cliquant sur la croix de son onglet.
Si vous choisissez d'enregistrer la requête, vous la voyez apparaître dans le volet de gauche avec son icône
de mise à jour pour bien la distinguer des autres.

Requête Suppression ou Delete


Nous souhaitons maintenant mettre en oeuvre une autre requête action dans le but d'épurer la table
Clients en supprimant les clients de l'Ardèche, pour cause de délocalisation par exemple.
 Cliquer sur le bouton Création de requête du ruban Créer,
 Dans la boîte de dialogue, double cliquer sur la table Copie de Clients pour l'ajouter,
 Fermer la boîte de dialogue,
 Comme précédemment, ajouter tous les champs de la table dans la zone de requête,
 Cliquer sur le bouton Suppression du ruban,
Vous transformez votre requête en requête Suppression. La ligne Tri est remplacée au profit de la
ligne Supprimer. Si vous exécutez la requête en l'état, vous supprimerez tous les enregistrements de la
table dans la mesure où aucune restriction n'est posée.
 Dans la zone Critères du champ Clients_cp, taper 07* et enfoncer la touche tabulation pour valider,

Vous remarquez qu'Access transforme instantanément l'expression en Comme '07*' qui est l'équivalent
du LIKE '07*' que nous avons abordé plus haut avec le langage SQL. Cette requête est donc censée
supprimer tous les clients dont le code postal commence par 07.
 Cliquer sur le bouton Exécuter,
 Dans le message, Access vous informe que vous allez supprimer des enregistrements, cliquer sur Oui,
L'exécution s'arrête. Encore une fois, une requête action agit sur les données mais ne les affiche pas. Si
vous cliquez de nouveau sur le bouton Exécuter, Access vous informe qu'il n'y a plus d'enregistrements à
supprimer. Ceci semble indiquer que le requête a fonctionné.
 Enregistrer la requête sous le nom Suppression_clients_07,
 La fermer en cliquant sur la croix de son onglet.
Elle apparaît désormais dans le volet de gauche accompagnée de son icône de suppression pour bien la
distinguer.
 Afficher les tables Clients et Copie de Clients.
En basculant de l'une à l'autre, vous remarquez qu'il ne reste plus que les codes postaux en 26 dans la
copie.
Listes déroulantes liées dans un formulaire Access
Le but de ce didacticiel est de montrer comment lier deux listes déroulantes dans un formulaire Access.
Concrètement, un choix dans la liste déroulante 1 implique un chargement de la liste déroulante 2 qui
varie. Pour débuter les manipulations :
 Ouvrir la base de données exemple garage-depart.accdb en cliquant sur ce lien ,
Il s'agit d'une toute petite base volontairement simplifiée pour réaliser les actions qui nous intéressent.
Elle est constituée de trois tables marques, modeles et fiches. La table marques énumère les différents
fabricants de véhicules : Renault, Peugeot etc… La table modeles énumère les différents modèles selon la
marque (Clio, 208 etc…). C'est pourquoi ces deux tables doivent être liées. Enfin la table fiches correspond
à la fiche technique de chaque modèle d'une marque. Ainsi la table fiches doit être, elle aussi, liée à la
table modeles dans le but de savoir à quel modèle appartient telle fiche technique.

 Cliquer sur le bouton Activer le contenu pour avoir accès à toutes les fonctionnalités.
Les tables sont donc liées comme nous l'avons évoqué précédemment et nous allons le constater.
 Cliquer sur le ruban Outils de base de données pour activer ce dernier,
 Dans le ruban, cliquer sur le bouton Relations.
Les tables ont été conçues avec des clés primaires pour pouvoir les lier entre elles.
 Refermer cet onglet.
Nous allons maintenant concevoir un petit formulaire dans lequel seront disposées deux listes
déroulantes. La première permettra de sélectionner une marque. En fonction de la marque, la seconde
chargera les modèles disponibles depuis la table liée modeles de façon à proposer un second choix encore
plus sélectif.
 Cliquer sur le ruban Créer pour l'activer,
 Dans le ruban, cliquer sur le bouton Création de Formulaire.
Nous ne passons pas par l'assistant Formulaire. De cette façon, nous obtenons un formulaire vierge en
mode conception que nous allons pouvoir organiser à notre guise. Vous remarquez que le ruban
Création s'active automatiquement. Il propose notamment tous les contrôles à disposer sur le formulaire.
 Cliquer sur le bouton Zone de liste déroulante dans ce ruban,
 Puis cliquer sur le formulaire pour déposer ce contrôle.
Vous remarquez qu'une boîte de dialogue se déclenche immédiatement.
 La première case est cochée, nous allons nous faire aider par Access pour créer le lien,
 Cliquer sur le bouton Suivant,

Cette étape consiste à établir le lien entre la liste déroulante et la table de données.
 Cliquer sur la ligne Table : marques,
 Puis cliquer sur Suivant,
Cette étape consiste à indiquer les champs utiles pour cette liste déroulante. Dans notre cas nous avons
besoin des deux, marque_num car il s'agit de l'identifiant et marque_nom pour le texte à afficher dans la
liste.
 Cliquer sur la double flèche au centre de la boîte de dialogue,
De cette façon vous incluez tous les champs de la table dans la construction de la liste déroulante.
 Puis cliquer sur Suivant.

Dans cette nouvelle étape nous allons indiquer que nous souhaitons un affichage croissant des marques.
 Choisir le champ marque_nom dans la première liste,
 Cliquer sur Suivant,

Ici l'assistant Access nous indique qu'il n'affichera que les informations du champ marque_nom et
conservera la colonne marque_num comme masquée. C'est parfait c'est ce que nous souhaitons.

 Cliquer sur le bouton Suivant pour poursuivre,


Enfin nous voilà arrivé à la dernière étape. Access propose d'associer le nom du champ à l'étiquette qui
décrit cette liste déroulante.
 Accepter cette proposition et cliquer sur Terminer.
Nous n'avons pas totalement fini de paramétrer notre liste.
 Cliquer avec le bouton droit de la souris sur cette liste déroulante,
 Dans la liste qui s'affiche, cliquer tout en bas sur Propriétés.
La feuille de Propriétés pour la liste déroulante sélectionnée apparaît sur la droite de l'écran.
 Dans l'onglet Autres saisir liste_marques en lieu et place du nom proposé.
Un nom explicite pour un contrôle est important. C'est par son nom que nous allons le piloter au travers
des actions que nous allons entreprendre. Remarquez l'absence d'accents et d'espaces dans ces syntaxes.
Nous devons maintenant sauvegarder ce formulaire avant de l'exploiter.
 Cliquer sur le bouton Enregistrer tout à fait en haut à gauche de la fenêtre Access,
 Dans la boîte de dialogue, taper le nom choix_marques_modeles,
 Puis valider en cliquant sur Ok.
Vous remarquez que ce nouveau formulaire apparaît dans la liste des objets Access sur la gauche.

 Cliquer sur le bouton Affichage en haut à gauche du ruban.


Nous exécutons ainsi le formulaire. Si vous cliquez sur la liste déroulante, vous remarquez que celle-ci
propose bien de sélectionner une marque.
Nous souhaitons créer la liste déroulante des modèles qui dépendra de la marque sélectionnée au
préalable.
 Dans le ruban Accueil, cliquer sur la flèche du bouton Affichage,
 Dans la liste qui apparaît, cliquer sur Mode création,
Nous retournons ainsi dans la conception du formulaire.
 Cliquer sur le ruban Création pour l'activer,
 Cliquer sur le contrôle Zone de liste déroulante,
 Puis cliquer sur le formulaire pour ajouter une seconde liste déroulante,
 Dans la boîte de dialogue qui apparaît, accepter le choix par défaut (Je veux que la liste…),
 Cliquer sur Suivant,
 Cliquer sur la ligne Table : modeles pour la lier à la liste,
 Cliquer sur Suivant,
Cette fois nous avons besoin des champs modele_num pour l'identifiant et modele_nom pour le texte à
afficher dans la liste déroulante.

 Sélectionner la ligne modele_num dans la liste de gauche,


 Cliquer sur le bouton de la flèche pour la basculer dans la liste de droite,
 Sélectionner la ligne modele_nom dans la liste de gauche,
 Cliquer sur le bouton de la flèche pour la basculer dans la liste de droite,
 Cliquer sur Suivantpour poursuivre,
 Choisir un tri croissant sur modele_nom,
 Cliquer sur Suivant,
 Comme précédemment, accepter l'étape qui suit et cliquer sur Suivant,
 Enfin cliquer sur Terminer,
 Cliquer sur le bouton Affichage du ruban Accueil pour exécuter le formulaire,
La première liste déroulante propose bien les marques tandis que la seconde propose bien les modèles.
Mais à ce stade aucun lien n'existe entre les deux. En effet si vous sélectionner Renault dans la première,
le choix n'est pas restreint aux modèles de la marque dans la seconde. Nous devons créer ce lien.
 Cliquer sur la flèche du bouton Affichage,
 Cliquer sur Mode création.
Toujours aussi important, nous allons commencer par donner un nom explicite à cette seconde liste pour
pouvoir la piloter.
 Sélectionner la liste des modèles,
 Cliquer sur l'onglet Autres de la Feuille de propriétés,
 Dans la zone Nom, taper liste_modeles et valider par Entrée,
 Cliquer maintenant sur l'onglet Données,
Dans la zone contenu, une requête Sql indique de quelle façon est chargée cette liste : SELECT
[modeles].[modele_num],[modeles].[modele_nom] FROM modeles ORDER BY [modele_nom];
Concrètement il est écrit que cette liste affichera tous les modèles énumérés dans la table modeles. Il n'y
a donc en effet aucun lien avec la liste déroulante des marques, donc aucune interaction possible. Pour
pallier le problème nous allons ajouter une condition dans cette requête, plus précisément une clause
WHERE :
 Modifier la requête comme suit et valider par Entrée :
SELECT [modeles].[modele_num],[modeles].[modele_nom] FROM modeles
WHERE [modele_marque_num]=[liste_marques] ORDER BY [modele_nom];
Nous établissons un lien entre le champ de la table modeles qui est lié aux marques et la liste déroulante
des marques.
 Cliquer sur le bouton Affichage pour exécuter le formulaire.
Les deux listes déroulantes n'interagissent toujours pas malgré une requête Sql explicite. Cela tient au fait
que nous devons calibrer un évènement qui indique que lorsque le choix dans liste des marques change,
la liste des modèles doit être recalibrée. Nous avons besoin d'un tout petit bout de code Vba. Pour cela
nous devons commencer par activer le code pour ce formulaire.
 Cliquer sur le bouton Affichage de manière à revenir en mode Création,
 Cliquer dans l'angle supérieur gauche du formulaire pour le sélectionner,
 Dans la fenêtre propriétés, cliquer sur l'onglet Autres pour l'activer,
 Placer la valeur de la zone Avec module sur Oui,

Nous activons ainsi les modules de code VBA.


 Cliquer sur la liste déroulante des marques pour l'activer,
 Cliquer sur l'onglet Evénement de sa feuille de propriétés,
 Cliquer sur le petit bouton à trois points dans la zone Après MAJ,
 Dans la boîte de dialogue qui apparaît, sélectionner Générateur de code,
 Puis cliquer sur Ok.

Nous basculons dans l'éditeur de code Visual Basic pour Access. Au travers des configurations que nous
venons de réaliser, tout ce que nous allons écrire là se déclenchera au changement de choix dans la liste
déroulante des marques (Après MAJ).
 Saisir la ligne de code suivante :Me![liste_modeles].Requery
Me! désigne la formulaire actif. [liste_modeles] désigne la liste déroulante des modèles sur ce formulaire.
Et Requery est une méthode qui impose à cette dernière de se reclaculer. Ce recalcul intervient Après Maj
comme nous l'avons paramétré.
 Enregistrer ce petit bout de code(CTRL + S),
 Revenir sur le formulaire en changeant de fenêtre,
 Cliquer sur le bouton Affichage du ruban Accueil pour exécuter le formulaire,
 Cliquer sur la liste des marques et faire un choix,
 Cliquer sur la liste des modèles pour constater qu'elle s'adapte.

Nous avons donc bien réussi à lier ces deux listes.


Sous formulaire dynamique dans un formulaire construit sur plusieurs tables
Nous abordons ici une notion intéressante, comment charger dynamiquement le contenu d'un sous
formulaire en fonction de choix précédents réalisés à partir de listes déroulantes construites sur des
tables différentes. Pour débuter les manipulations, nous allons partir d'une petite base de données
existante :
 Ouvrir la base de données garage-depart-sform.accdb, en cliquant sur ce lien,
Cette base est constituée de trois tables. La table marques recense des fabricants automobiles. La table
modeles recense certains modèles de ces marques. Enfin la table fiches donne les fiches techniques des
modèles de ces marques. Ces trois tables sont donc liées entre elles par des clés primaires et des clés
externes. Ces tables sont volontairement simplifiées afin de faciliter les manipulations.

Vous notez aussi la présence d'un formulaire choix_marques_modeles.


 Double cliquer dessus pour l'exécuter,
En cliquant sur la liste des marques, vous choisissez une marque de véhicule. La liste des modèles se
charge alors en fonction du choix précédent pour permettre de choisir un modèle dans la marque
sélectionnée. Ce formulaire est donc déjà bâti sur deux tables. Nous avons besoin d'en ajouter une
troisième puisque l'objectif et de sortir la fiche technique du modèle dans un sous formulaire. Cette fiche
technique se trouve dans la table fiches.
Nous allons commencer par construire le formulaire des fiches techniques que nous afficherons ensuite
comme sous formulaire du formulaire choix_marques_modeles. Le but est d'arriver à modifier
dynamiquement le contenu du sous formulaire selon les choix réalisés dans le formulaire sur la marque et
le modèle.
 Fermer l'onglet du formulaire choix_marques_modeles,
 Cliquer sur le ruban Créer pour l'activer,
 Dans ce ruban, cliquer sur la flèche du bouton Plus de formulaires,
 Dans la liste choisir Assistant formulaire,
 Dans la boîte de dialogue qui apparaît, sélectionner la table fiches dans la liste déroulante,
 Basculer tous les champs de cette dernière dans la zone de droite à l'aide du bouton double flèche au
centre de la boîte de dialogue,
 Cliquer directement sur le bouton Terminer afin d'ignorer les étapes restantes et de construire le
formulaire sur les options par défaut.
Le formulaire s'affiche alors en exécution comme l'illustre la capture ci-dessous.

Nous allons maintenant l'intégrer en tant que sous formulaire du formulaire précédent.
 Fermer l'onglet du formulaire fiches,
 Cliquer avec le bouton droit de la souris sur le formulaire choix_marques_modeles,
 Choisir Mode création dans le menu contextuel qui apparaît,
Le formulaire s'affiche en mode conception.
 Dans l'onglet Création, cliquer sur le bouton Sous formulaire/Sous état,
 Tracer un rectangle sous les listes déroulantes pour définir sa zone d'implantation.
L'assistant sous-formulaire se déclenche.

 Cocher la case Utiliser un formulaire existant,


 Sélectionner le formulaire fiches dans la liste,
 Cliquer sur le bouton Suivant,
 Accepter le nom donné par défaut et cliquer sur Terminer.
Le sous formulaire s'affiche alors dans le formulaire en mode conception.

 Cliquer sur le bouton Affichage pour exécuter le formulaire.


Si vous choisissez une marque puis un modèle vous constatez que le sous formulaire reste désespérément
figé sur le premier enregistrement alors qu'il devrait afficher la fiche technique du modèle sélectionné
dans la seconde liste. En effet, nous n'avons à ce stade construit aucune interaction entre les listes et le
sous-formulaire.
 Cliquer sur la flèche du bouton Affichage,
 Puis cliquer sur Mode création dans la liste,
 Sélectionner la liste des modèles (seconde liste déroulante),
 Si la feuille de propriétés n'est pas visible, cliquer avec le bouton droit de la souris sur la liste déroulante,
 Dans le menu contextuel qui s'affiche, cliquer sur Propriétés,
 Dans la feuille des propriétés sur la droite, cliquer sur l'onglet Evénement pour l'activer,
Au choix d'un modèle, nous souhaitons afficher la fiche technique correspondante. Il s'agit donc d'un
événement à gérer. Lorsque le contenu de la liste change, le sous formulaire doit s'adapter.
 Dans la zone Après MAJ, cliquer sur le petit bouton à trois points,
 Dans la boîte de dialogue qui s'affiche, choisir Générateur de code,
 Puis cliquer sur Ok.
Vous basculez dans l'éditeur de code Visual Basic, VBA pour Access. Après MAJ signifie Après Mise à Jour,
soit dès lors que le contenu de la liste change. Cela signifie que ce que nous allons programmer
maintenant se déclenchera quand la liste déroulante changera. Le curseur de saisie étant placé entre les
bornes de la procédure (Entre le Private Sub et le End Sub) :
 Ajouter la ligne de code VBA suivante :
Me.fiches.Form.RecordSource ='SELECT * FROM fiches WHERE fiche_modele_num=' + Me.liste_modeles
Me désigne le formulaire actif. fiches est le nom du sous formulaire dans Me, soit le
formulaire choix_marques_modeles. Form.RecordSource est la propriété qui permet d'accéder à la
source de chargement de ce sous formulaire. C'est ici que nous lui précisons qu'il doit afficher la fiche
technique dont le numéro correspond à celui sélectionné dans la liste des modèles. La table modeles et la
table fiches sont liées par la clé primaire de la première table et la clé externe fiche_modele_num de la
seconde. D'où la requête SQL pour ce RecordSource qui demande explicitement de sélectionner tous les
champs de la table fiches pour lesquels le numéro d'enregistrement correspond au numéro sélectionné
dans la liste des modèles.

 Avant de terminer, ajouter cette dernière ligne de code à la suite :


Me.fiches.Form.Requery
Elle permet de forcer le sous formulaire à se recalculer suite à ce changement.

 Revenir sur la fenêtre des formulaires Access,


 Double cliquer sur le formulaire choix_marques_modeles- pour l'exécuter,
 Faire des choix différents dans les listes.

Vous constatez que le contenu du sous formulaire s'adapte et affiche bien la fiche technique du modèle
sélectionné dans la marque choisie.

Aperçu de la fiche technique


Dernière étape, nous souhaitons afficher l'aperçu de la fiche technique générée dynamiquement. En
d'autres termes nous devons construire un état basé sur la table fiches. Cet état devra afficher seulement
les informations correspondant au modèle sélectionné depuis le formulaire.
 Activer le ruban Créer,
 Cliquer sur le bouton Assistant état,
 Dans la boîte de dialogue, sélectionner tous les champs de la table fiches et cliquer sur Terminer.
L'état s'affiche en aperçu présentant tous les enregistrements de la table, soit toutes les fiches
techniques. Or il nous en faudra qu'un seul.

 Fermer l'état,
 Afficher le formulaire choix_marques_modeles en mode création,
 A l'aide du ruban Création, ajouter un bouton sur ce dernier,
 Dans la boîte de dialogue qui s'affiche, cliquer sur Annuler, nous allons le paramétrer nous-mêmes,
 Changer le texte du bouton en Aperçu,
 Dans l'onglet Evénement de sa feuille de propriétés, cliquer sur le bouton à trois points,
 Choisir générateur de code et cliquer sur Ok,
 Dans la procédure, taper la ligne de code suivante :
DoCmd.OpenReport 'fiches', acViewPreview, , '[fiche_modele_num]=' (Me![liste_modeles].Value)
Cette ligne commande l'ouverture de l'état fiches (OpenReport 'fiches') en mode aperçu (acViewPreview)
de manière à faire correspondre le numéro de la fiche à imprimer (fiche_modele_num) avec celui de la
fiche sélectionnée sur le formulaire (Me![liste_modeles].Value).
 Exécuter le formulaire,
 Choisir une marque et un modèle,
 Cliquer sur le bouton Aperçu.

Nous obtenons bien l'aperçu de la fiche technique voulue.


Facturation clients avec interface graphique VBA Excel
Ce que nous proposons de réaliser ici est un mini logiciel ou progiciel pour facturer les clients à l'aide
d'une interface utilisateur conçue en VBA Excel.

Le classeur de facturation
 Télécharger le classeur interface-utilisateur-facturation-vba.xlsx en cliquant sur son lien,
 L'ouvrir dans Excel,

Il s'agit d'une facturation automatisée et dynamique réalisée au titre de la formation sur la fonction
Decaler() pour adapter les formules des plages de cellules en fonction de leur contenu évolutif. La liste
déroulante permet de choisir un code article sur la base du catalogue de la feuille articles. Si le catalogue
évolue avec de nouvelles références, la liste déroulante les intègre car elle est conçue sur une plage de
cellules qui s'ajuste au contenu grâce à la fonction Decaler(). Les Désignations et prix unitaires sont
importés automatiquement en fonction de cette référence grâce à la fonction RechercheV(). Elle aussi
s'ajuste au contenu évolutif du catalogue grâce à la fonction Decaler() qui lui permet de réaliser la
recherche dans un tableau qui peut évoluer. Il ne reste plus à l'utilisateur qu'à saisir les quantités achetées
pour que les montants de la facture se calculent automatiquement. Comme vous le remarquez, il s'agit
d'un classeur classique (xlsx). Cela signifie qu'il ne gère pas les macros et donc le code VBA. Or nous
souhaitons programmer une vraie mini-application. Nous devons donc enregistrer ce classeur au
format xlsm.
 Cliquer sur Fichier en haut à gauche de la fenêtre Excel,
 Choisir ensuite Enregistrer sous puis Parcourir,
 Dans la zone Type, choisir l'extension *.xlsm puis cliquer sur Enregistrer,
Cette facturation est presque parfaite sauf qu'elle ne permet pas de gérer les stocks. Elle n'empêche pas
de vendre un article en rupture de stock ou dont la quantité est trop importante. Elle ne permet pas non
plus de mettre à jour les quantités de stocks après la validation de la facture. C'est ce que nous proposons
de réaliser avec une interface utilisateur graphique en VBA Excel. L'utilisateur doit pouvoir sélectionner
une référence depuis l'interface et définir la quantité à acheter. Si la quantité demandée est supérieure à
celle présente en stock, l'utilisateur en est averti et il ne peut pas ajouter l'article à la facture. Dans le cas
contraire, un bouton permet d'insérer une nouvelle ligne de facturation, mémorisant les informations
pour pouvoir mettre à jour les stocks lorsqu'à l'issue, l'utilisateur valide la facture et confirme ainsi
l'achat.

L'interface graphique en VBA Excel


Cette interface graphique se nomme un UserForm. Ce Userform doit se charger à l'ouverture du classeur
de manière à ce que l'utilisateur n'ait pas accès à la feuille directement. Toute la facturation doit se gérer
depuis l'interface.
 Basculer dans l'éditeur Visual Basic à l'aide du raccourci clavier ALT + F11 par exemple,
 Cliquer ensuite sur le menu Insertion puis choisir UserForm,

Le UserForm apparaît au centre de la fenêtre. En bas à gauche, se situe la fenêtre de propriétés de l'objet
sélectionné au centre, soit le UserForm à ce stade. Cette fenêtre permet de régler l'objet, le contrôle,
l'interface ainsi sélectionnée pour modifier son apparence notamment.
 Dans la fenêtre Propriétés, régler la propriété (Name) sur facture,
 Régler la propriété Height sur 250 et Width sur 300,
Par défaut ces propriétés sont rangées par ordre alphabétique. La propriété Height permet de modifier la
hauteur de l'objet tandis que Width influe sur sa largeur.
 Choisir une couleur de fond pour l'interface avec la propriété BackColor,
 Modifier le texte de la barre de titre de l'interface en : Facturation Clients, à l'aide de la propriété
Caption,
 Régler la propriété KeepScrollBarsVisible sur 0 – fmScrollBarsNone,
Les barres de défilement ainsi n'apparaîtront pas sur l'interface. Les dimensions que nous avons définies
suffiront à afficher l'ensemble des contrôles nécessaire pour cette application de facturation.
 Modifier la police de l'interface avec la propriété Font,
 Changer la propriété ForeColor avec l'onglet Palette qui se propose,
ForeColor désigne la couleur de premier plan. Il s'agit de la couleur qui sera affectée par défaut aux textes
et contrôles que nous ajouterons sur l'interface.
 Cliquer sur le Userform au centre de la fenêtre pour l'activer et enfoncer la touche F5 du clavier pour
l'afficher en mode exécution,
Comme vous le remarquez, le UserForm s'affiche au-dessus de la feuille du classeur, la
feuille facturation en l'occurrence ici. Cette interface apparaît dans une fenêtre qui dispose par défaut de
toutes les propriétés des fenêtres Windows classiques. Ainsi vous pouvez la déplacer en la cliquant et la
glissant depuis sa barre de titre. Vous pouvez la fermer en cliquant sur sa croix rouge.
 Fermer l'interface utilisateur,
L'exécution se stoppe et vous êtes de retour dans l'éditeur Visual Basic sur le UserForm. Nous souhaitons
que cette interface se déclenche automatiquement à l'ouverture du classeur. Le UserForm est
un objet qui possèdent des propriétés comme nous venons de le voir. Et comme l'enseigne la formation
pour débuter en VBA Excel, tout objet a aussi des méthodes. Ces méthodes permettent de réaliser des
actions, comme ouvrir ou afficher le formulaire. La méthode du UserForm pour ce faire est la méthode
Show qui s'appelle par le nom de l'objet, facture ici, tel que nous l'avons modifié par la fenêtre propriété.
La ligne de code est donc la suivante : facture.Show. Mais ce code doit être associé à un évènement, pour
qu'il se déclenche automatiquement. Nous souhaitons qu'il se déclenche à l'ouverture du classeur. Il est
très simple en VBA Excel de connaître les évènements disponibles attachés aux feuilles et classeurs.
 Double cliquer sur l'objet ThisWorkbook dans la fenêtre Projet sur la gauche de l'éditeur,
L'objet ThisWorkbook désigne le classeur sur lequel nous sommes en train de travailler, littéralement, ce
classeur.
 Régler la liste de droite au-dessus de la page de code sur Open,

La procédure Private Sub Workbook_Open() est ainsi créée. Il s'agit de l'évènement Open (Ouvrir)
associé à ThisWorkbook (Ce classeur). Concrètement, tout code écrit entre les bornes de cette procédure
se déclenchera automatiquement à l'ouverture du classeur. Il ne reste donc plus qu'à écrire la ligne
de code permettant d'afficher le UserForm facture.
 Ajouter la ligne : facture.Show, entre les bornes de la procédure,
 Enregistrer le travail (CTRL + S),
 Fermer le classeur puis le rouvrir.
Vous remarquez en effet que l'interface graphique se déclenche automatiquement à l'ouverture du
classeur en se positionnant au-dessus de la feuille.
 Fermer l'interface pour revenir dans le code.
Les contrôles de formulaire
Pour que l'utilisateur puisse gérer intégralement la facturation depuis l'interface graphique, nous devons
ajouter plusieurs contrôles. Il faut une liste déroulante pour lui permettre de choisir une référence à
acheter. Il faut une zone de saisie pour qu'il puisse définir la quantité achetée pour cette référence. Il faut
une zone de texte (Label) pour communiquer avec lui, de manière à par exemple lui indiquer que le stock
ne permet pas un achat d'une telle quantité. Enfin, il faut trois boutons. Un bouton pour ajouter la
référence avec sa quantité sur la facture. Il faut un bouton pour lui permettre de réinitialiser la facture en
cas d'erreur. Et enfin il faut un bouton pour valider la facture, commander l'aperçu avant impression et
mettre à jour les stocks en fonction de ces nouveaux achats. A l'aide de la boîte à outils qui s'affiche
lorsque vous sélectionnez le formulaire :

 Ajouter comme le propose la capture, une liste déroulante,


 La nommer liste_ref à l'aide de sa propriété (Name) de la fenêtre Propriétés,
 Ajouter au-dessus un contrôle Intitulé (Label),
 Modifier son texte en : Choisir une référence à l'aide de sa propriété Caption,
 Ajouter une zone de texte et définir son nom sur quantite,
 Juste au-dessus, ajouter un intitulé en réglant son texte sur Définir une quantité,
 En dessous, ajouter un nouvel intitulé avec comme texte Message utilisateur !,
 Ajouter un premier bouton avec le nom ajouter et le texte Ajouter,
 Ajouter un deuxième bouton avec le nom reinitialiser et le texte Réinitialiser,
 Ajouter un dernier bouton avec le nom valider et le texte Valider la facture,
Le code associé aux événements
Comme nous l'avons vu précédemment, les codes que nous allons développer doivent être attachés à
des événements. Ainsi un clic sur un bouton déclenchera le code qui est écrit entre les bornes de la
procédure gérant l'événement associé au clic sur ce bouton. Mais avant cela, lorsque l'interface s'affiche,
elle doit proposer par le biais de la liste déroulante, tous les codes articles présents dans le catalogue.
Donc la liste déroulante doit se charger de ses données en même temps que le formulaire s'active.
L'événement associé est activate.
 Depuis l'éditeur Visual Basic, double cliquer sur un emplacement vide du UserForm,
Vous basculez dans le code attaché auformulaire, entre les bornes de la procédure UserForm_Click().
Le code écrit entre ces bornes se déclencherait donc au clic sur le formulaire. Ce n'est pas cet événement
qui nous intéresse, mais l'événement Activate().
 Dans la liste de droite, en haut de la page de code, choisir Activate,

Le code écrit dans les bornes de cet événement s'exécutera en même temps que le formulaire s'active,
donc qu'il s'affiche. Pour remplir cette liste déroulante, nous avons besoin de parcourir la colonne des
codes articles de la feuille articles, en partant de la ligne 2 et tant que la cellule n'est pas vide. Donc il faut
déclarer une variable que nous nommerons ligne et l'initialiser à 2. Pour plus d'informations, vous pouvez
vous référer à la formation sur la déclaration de variables en VBA Excel.
 Ajouter la déclaration et affectation suivantes dans les bornes de la procédure,
Dim ligne As Integer: ligne = 2

Il s'agit de parcourir les codes articles de la feuille articles. ThisWorkbook est l'objet VBA Excel qui
désigne le classeur actif. Sa propriété Worksheets avec en paramètre le nom de la feuille, permet de
désigner une feuille précise du classeur. Pour parcourir tous les codes articles, ligne à ligne, tant que la
cellule n'est pas vide pour les insérer dans la liste déroulante du formulaire, nous devons utiliser
une boucle. La boucle qui permet de parcourir des éléments tant qu'une condition est vérifiée, est
la boucle While en VBA Excel. La formation VBA Excel sur les boucles For Next aborde ces boucles While.
Une boucle While doit se terminer par le mot clé Wend. Le critère à poser juste après le While, consiste à
vérifier que la cellule de la colonne 3 (C) n'est pas vide, signifiant qu'elle porte un code article.
 Ajouter l'instruction While comme suit :
While ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> ''

Wend

La variable ligne doit être incrémentée à chaque passage pour pouvoir ainsi scruter chaque cellule de la
colonne 3, tant qu'elle n'est pas vide. C'est l'objet Cells() qui désigne une cellule avec son indice de ligne
et son indice de colonne en paramètre. La propriété Value de ce dernier renvoie son contenu qui doit
être différent d'un contenu vide (<> ''). Dans la boucle, il s'agit maintenant d'ajouter à la liste déroulante,
chaque code article ainsi trouvé. Le nom de notre objet liste déroulante est liste_ref. La méthode qui
permet d'ajouter des éléments à cet objet est AddItem avec en argument, la valeur à ajouter, celle de la
cellule. Il ne faut pas ensuite oublier d'incrémenter la variable ligne. En effet, si la boucle While tourne
sans passer à la ligne suivante, le critère sera toujours vérifié et la boucle ne se terminera jamais. On parle
de boucle infinie.
 Dans les bornes de la boucle, ajouter les deux lignes de code suivantes :
liste_ref.AddItem(ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value)
ligne = ligne + 1

 Enfoncer la touche F5 pour tester le code.


Le formulaire apparaît. Si vous déroulez la liste, vous remarquez qu'elle propose tous les codes articles du
Catalogue. Et comme c'est une boucle While qui s'en charge, si vous faites évoluer le catalogue en
ajoutant des références à la suite, la liste déroulante les proposera.
 Ajouter enfin la ligne suivante afin de se placer sur la feuille facturation au démarrage :
ThisWorkbook.Worksheets('facturation').Activate

Le code complet que nous avons écrit est le suivant :

Private Sub UserForm_Activate()


Dim ligne As Integer: ligne = 2

While ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> ''


liste_ref.AddItem (ThisWorkbook.Worksheets('articles').Cells(ligne,3).Value)
ligne = ligne + 1
Wend

ThisWorkbook.Worksheets('facturation').Activate
End Sub

Après avoir sélectionné une référence, l'utilisateur doit définir la quantité achetée dans la zone de saisie
située sur la droite. Pour mâcher le travail, nous allons régler la valeur par défaut à 1 pour cette zone de
saisie.
 Fermer le formulaire en cliquant sur sa croix,
 Sélectionner la zone de saisie quantite sur le formulaire en mode conception,
 Régler sa propriété Value sur 1 à l'aide de la fenêtre Propriétés,
Le prochain code que nous devons écrire doit être associé à l'événement du clic attaché au bouton
ajouter. Ce code doit premièrement vérifier que la quantité saisie est bien un nombre pour éviter
l'incompatibilité de type, auquel cas le programme planterait. Ensuite, il doit comparer la référence
article et la quantité demandée avec celle en stock dans le catalogue pour cet article. Si la quantité
demandée est inférieure ou égale, le code article et la quantité doivent être insérés dans la facture, sinon
un message doit alerter l'utilisateur sur le fait que le stock n'est pas suffisant.
 Sur le formulaire en mode conception, double cliquer sur le bouton ajouter,
Vous basculez ainsi dans l'éditeur de code entre les bornes de la procédure suivante :

Private Sub ajouter_Click()

End Sub

Il s'agit de la procédure gérant l'événement du clic sur le bouton ajouter. Cela signifie que tout code écrit
entre ces bornes se déclenchera au clic sur ce bouton. Le premier critère à vérifier est de savoir si
l'utilisateur a bien sélectionné une référence à l'aide de la liste déroulante. C'est l'instruction If() en VBA
Excel qui permet de poser des conditions et d'engager des actions selon le cas. La propriété SelText pour
un objet liste modifiable, liste_ref ici, renvoie le texte sélectionné dans la liste. Cette propriété ne doit
pas être vide.
 Dans la procédure du bouton, ajouter l'instruction If() suivante :
If(liste_ref.SelText <> '') Then

End If

Si ce critère est vérifié, le programme doit continuer. Si la saisie de la quantité n'est pas un nombre, nous
devons en avertir l'utilisateur par un MsgBox() puis arrêter l'exécution du programme (Exit Sub). C'est la
propriété Value d'un objet zone de saisie (quantite ici) qui renvoie son contenu. Dans le cas contraire
(else), tout est en ordre, nous poursuivons.
 Imbriquer le deuxième critère If() à l'intérieur du premier :
If (IsNumeric(quantite.Value) = False) Then
MsgBox ('La quantité saisie n'est pas un nombre, veuillez corriger')
Exit Sub
Else

End If

Nous devons maintenant nous assurer que les stocks sont suffisants. Si c'est le cas, nous devons inscrire la
référence et la quantité demandée sur la facture. Ce code doit donc être écrit dans la branche else du if().
Mais avant cela, comme précédemment, nous devons déclarer et affecter une variable ligne, en début de
procédure. C'est elle, dans la boucle While qui nous permettra de parcourir les références du catalogue à
la recherche du stock correspondant.
 Ajouter la déclaration suivante au début de la procédure du bouton :
Dim ligne As Integer: ligne = 2

Notre catalogue ne possède pas d'information sur les stocks. Nous allons lui ajouter une colonne
permettant de les gérer.
 Revenir sur la feuille articles,
 Ajouter une colonne Stocks au tableau comme l'illustre la capture ci-dessous :

De retour dans le code, entre le If et le End If de l'instruction If() imbriquée :


 Ajouter la boucle While permettant de parcourir les références du catalogue tout en vérifiant (avec une
nouvelle instruction If) si la référence est celle choisie sur l'interface.
While(ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')
If (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value = liste_ref.SelText) Then

End If
ligne = ligne + 1
Wend

Si c'est le cas, nous devons encore imbriquer un nouveau test de manière à verifier si le stock permet
l'ajout de l'article. Dans le cas contraire, l'utilisateur doit en être averti et l'exécution du code stoppée.
 Ajouter cette nouvelle instruction If() à l'intérieur du test imbriqué :
If (Int(quantite.Value) > Int(ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value)) Then
MsgBox 'La quantité en stock pour cette référence n'est que de ' &
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value
Exit Sub
Else

End If

Si la quantité demandée par l'utilisateur est supérieure à celle disponible en stock (If (Int(quantite.Value)
> Int(Cells(ligne, 6).Value))). Alors (Then), nous en avertissons l'utilisateur (MsgBox) et nous stoppons le
programme (Exit Sub). Dans le cas contraire (Else), nous devons ajouter l'article et sa quantité sur la
facture, puis sortir de la boucle puisqu'une fois la référence trouvée, il n'est plus nécessaire de continuer
de parcourir le catalogue. Nous avons de nouveau besoin d'une variable à déclarer pour parcourir les
cellules des codes articles de la facture. Dès qu'une cellule vide sera détectée, signifiant qu'aucune
référence n'est insérée, nous utiliserons cette cellule pour intégrer le nouveau code article.
 Au début de la procédure du bouton, ajouter la ligne suivante :
Dim lignef As Integer: lignef = 6

Lignef est la variable que nous allons utiliser pour parcourir les lignes de la facturation.
 Dans le Else du dernier If imbriqué, ajouter les lignes suivantes :
While (ThisWorkbook.Worksheets('facturation').Cells(lignef,3).Value <> '')
lignef = lignef + 1
Wend

En partant de la ligne 6, nous déplaçons l'indice de la ligne (lignef = lignef + 1) jusqu'à trouver la première
cellule vide de la colonne des codes article, de manière à pouvoir y insérer la nouvelle référence. Donc,
une fois la boucle terminée, la variable lignef doit porter l'indice de la première cellule dans laquelle nous
pouvons saisir. Il s'agit de la colonne 3 pour la référence et de la colonne 5 pour la quantité. La feuille
étant activée, nous utilisons l'objet Cells avec ces indices pour y inscrire les nouvelles données. Pour ce
faire :
 Ajouter le code suivant, après le While et avant le End If :
ThisWorkbook.Worksheets('facturation').Cells(lignef,3).Value = liste_ref.SelText
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5).Value = quantite.Value
 Exécuter le code (F5),
 Ajouter quelques articles avec des quantités valides,

A chaque fois que vous cliquez sur le bouton Ajouter, vous remarquez que la nouvelle ligne
de facturation se crée à la suite des autres. Les fonctions RechercheV récupèrent les informations
correspondant au code article ainsi inséré. Les formules réalisent les calculs de la facture avec la quantité
intégrée automatiquement. Tout se fait par le formulaire VBA, plus aucune saisie sur la feuille n'est
nécessaire. De plus la facturation est sécurisée par le contrôle des stocks en amont grâce au code. Le
code complet du bouton ajouter associé à l'événement Click est le suivant :

Private Sub ajouter_Click()


Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6

If (liste_ref.SelText <> '') Then


If (IsNumeric(quantite.Value) = False) Then
MsgBox ('La quantité saisie n'est pas un nombre, veuillez corriger')
Exit Sub
Else
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')
If (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value = liste_ref.SelText) Then
If (Int(quantite.Value) > Int(ThisWorkbook.Worksheets('articles').Cells(ligne,6).Value)) Then
MsgBox 'La quantité en stock pour cette référence n'est que de ' &
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value
Exit Sub
Else
While (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '')
lignef = lignef + 1
Wend
ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value = liste_ref.SelText
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5).Value = quantite.Value
End If
End If

ligne = ligne + 1
Wend
End If
End If
End Sub

Le bouton Réinitialiser
Ce bouton consiste à supprimer tous les codes article et quantités de manière à purger la facture en cas
d'erreur.
 Afficher le UserForm en conception,
 Double cliquer sur le bouton reinitialiser,
Vous créez ainsi la procédure Sub reinitialiser_Click(), soit le code qui se déclenche au clic sur ce bouton.
 Dans les bornes de cette procédure, ajouter les trois lignes suivantes :
ThisWorkbook.Worksheets('facturation').Activate
Range('C6:C26').Value = ''
Range('E6:E26').Value = ''

Nous activons premièrement la feuille sur laquelle nous souhaitons supprimer les données insérées.
Comme nous connaissons les plages strictes des colonnes Code article et Quantité, nous les désignons
avec l'objet Range. La propriété Value permet de désigner le contenu de chaque cellule à l'intérieur de
cette plage que nous réinitialisons à '', soit un contenu vide.

Mise à jour des stocks


Le dernier bouton doit permettre de valider la facture en mettant les stocks à jour selon les quantités
achetées. Nous allons parcourir les références de la facture avec une boucle While. A l'intérieur de
cette boucle, c'est-à-dire pour chaque référence de la facture, nous allons les comparer aux références du
catalogue avec une autre boucle While imbriquée. Lorsque les références correspondront, nous
soustrairons les quantités pour mettre à jour les stocks.
 En mode conception, double cliquer sur le bouton valider,
 Ajouter les trois lignes de déclarations et d'affectations suivantes :
Dim reponse As Byte
Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6

La variable reponse déclarée comme un entier court servira à enregistrer la réponse de l'utilisateur à la
question posée via un MsgBox. Un clic sur un bouton renvoie en effet une valeur entière. Comme
toujours les deux autres variables vont permettre de parcourir les lignes des deux feuilles.
 Poursuivre avec le code proposé ci-dessous :
reponse = MsgBox('Souhaitez-vous valider la facture et mettre à jour les stocks', vbYesNo + vbQuestion)
If (reponse = 6) Then

End If

Le Msgbox permet de demander à l'utilisateur s'il souhaite poursuivre. Comme on lui associe deux
boutons de choix (vbYesNo), la boîte de dialogue renvoie une valeur en fonction du bouton cliqué, que
nous stockons dans la variable reponse. S'il clique sur Oui (If (reponse = 6)), alors (Then), nous devons
engager la double boucle qui permettra de mettre à jour les stocks. Il faut commencer par parcourir tous
les codes article de la facture. Pour ce faire,
 Ajouter la boucle While suivante :
While(ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '')
lignef = lignef + 1
Wend

Puis, pour chaque code article de la facture, il faut parcourir tous les codes articles du catalogue afin de
les comparer. Pour ce faire :
 Ajouter la boucle While imbriquée comme suit :
ligne = 2
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')
ligne = ligne + 1
Wend

Avant d'entrer dans cette boucle While, nous n'oublions pas de réinitialiser la valeur de la variable ligne à
2, car cette boucle doit repartir de ce point pour chaque code article de la facture, c'est-à-dire à chaque
passage dans la première boucle. Pour mettre à jour les stocks :
 Ajouter le test If() dans le While comme suit :
If(ThisWorkbook.Worksheets('facturation').Cells(lignef, 3) =
ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value) Then
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value =
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value -
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5)
End If

Si les références de la facture et du catalogue correspondent, alors nous mettons à jour le stock du
catalogue pour cette référence en lui soustrayant la quantité achetée. Il ne reste plus qu'à en informer
l'utilisateur en lui adressant un message de confirmation, cette fois par l'intermédiaire du label (Label1)
que nous avions placé sur le formulaire.
 Ajouter cette dernière ligne de code :
Label1.Caption = 'Les stocks ont été mis à jour. La facture peut être éditée.'
 Exécuter le code (F5),
 Ajouter plusieurs articles et cliquer sur Valider la facture.
Vous remarquez d'une part que la facture se construit parfaitement et automatiquement et d'autre part
que les stocks sont mis à jour en fonction des quantités achetées. Le code complet pour ce bouton est le
suivant :

Private Sub valider_Click()


Dim reponse As Byte
Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6

reponse = MsgBox('Souhaitez-vous valider la facture et mettre à jour les stocks', vbYesNo + vbQuestion)

If (reponse = 6) Then
While (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '')
ligne = 2
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')

If (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3) =
ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value) Then
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value =
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value -
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5)
End If
ligne = ligne + 1
Wend
lignef = lignef + 1
Wend

End If

Label1.Caption = 'Les stocks ont été mis jour. La facture peut être éditée.'
End Sub

Le poste : est un ensemble de missions principales et secondairesqui sont affectees a un emploi dans
l’entreprise

http://www.softwright.com/file-
downloads/20141210_Intro_to_RF_Coverage_Mapping_with_TAP.wmv

327 30 57

sx