Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Frais de livraison en VBA Access
Dans cette formation, nous proposons de monter une petite application via un
formulaire Access , permettant de déterminer les
coûts de livraison d'une commande, selon le pays de destination, le poids du colis et le mode de réception.
Le type de livraison peut prendre deux valeurs :
A domicile ou
En point relais . Ces deux modes ne sont pas disponibles pour tous les pays. Ainsi un système d'entonnoir par le biais de listes déroulantes liées en cascade doit être monté.
Base de données des tarifs de livraison
Nous proposons de démarrer la conception à partir d'une
base de données dont l'ossature a déjà été conçue par le biais des tables reliées entre elles.
Cette
base de données Access est en effet constituée de quatre tables liées. Le formulaire quant à lui est à bâtir.
Dans le volet de gauche, double cliquer sur la table Pays pour l'ouvrir,
Comme vous le constatez, cette table n'est constituée que de deux champs. Le champ de la
clé primaire auto-incrémenté (pays_id) et le champ pour le nom de chaque pays de livraison (pays_nom). De la même façon, la
table Poids recense tous les poids des colis en kilogrammes selon là aussi une clé primaire auto-incrémentée. Et selon le même modèle, les deux modes de livraison sont recensés dans la
table Livraisons .
Enfin, comme l'illustre la capture ci-dessus, la
table Tarifs recense tous les coûts de livraison selon le pays repéré par son index (tarif_pays), selon le poids repéré par son index (tarif_poids) et selon le mode de livraison, lui aussi repéré par son index (tarif_livraison), issu de la clé primaire de la table Livraisons.
Cliquer sur l'onglet Outils de base de données en haut de la fenêtre pour activer son ruban,
Puis, cliquer sur le bouton Relations afin de visualiser les liens schématisés,
Afin de mettre en oeuvre ces dépendances Ã
matérialiser par des listes déroulantes en cascade , toutes ces
tables sont reliées entre elles grâce à leur clé primaire et à la clé étrangère répétée dans la table enfant . C'est ce qu'illustre la capture ci-dessus.
Cliquer sur le bouton Fermer du ruban pour clore la fenêtre des relations,
Conception du formulaire
Il s'agit maintenant de concrétiser ces
relations visuellement à l'aide de listes déroulantes, liées entre elles pour certaines. A l'issue de la cascade des choix (Pays, poids, mode de livraison), le coût de transport et le délai de livraison doivent être dévoilés. Il s'agit donc de recouper tous ces critères en puisant dans la table Tarifs.
Fermer toutes les tables ouvertes,
Cliquer sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
Dans la section Formulaires, cliquer sur le bouton Création de formulaire ,
De cette action résulte un formulaire vierge bâti sur aucune des tables. En effet, nous devons disposer plusieurs listes déroulantes qui puiseront dans les différentes tables.
Elargir quelque peu la zone de formulaire pour faire de la place,
A l'aide du ruban Format , lui attribuer une couleur de fond grisée,
Grâce au ruban Création , ajouter un titre dans un contrôle Etiquette ,
Enregistrer le formulaire (CTRL + S) sous le nom : tarifs_livraison ,
En dessous, grâce au ruban Création, ajouter un contrôle Zone de liste déroulante ,
Cliquer sur le bouton Annuler si l'assistant se déclenche automatiquement,
Cliquer sur le bouton Feuille de propriétés du ruban Création si elle n'est pas visible,
Saisir le texte : liste_pays dans la propriété Nom de l'onglet Autres pour cette liste,
Déplacer l'étiquette associée au-dessus de la liste déroulante,
Changer son texte en : Choix du Pays ,
A ce stade la
liste déroulante est vierge de contenu car elle n'est liée à aucune source. Elle doit afficher les noms de chaque pays tout en considérant pour chacun d'eux, la valeur de la
clé primaire associée.
Activer l'onglet Données de la feuille de propriétés pour la liste déroulante,
Dans la propriété Contenu , saisir la requête SQL suivante :
SELECT pays_nom, pays_id FROM Pays;
Il s'agit d'une basique
requête sélection en SQL dont nous avions abordé la syntaxe dans la formation pour apprendre à créer des requêtes dans Access .
Nous choisissons d'extraire (SELECT) les informations des champs pays_nom et pays_id issus (FROM) de la table Pays. Comme le champ pays_nom est placé en premier dans la syntaxe de la requête, c'est lui qui sert à remplir le contrôle. Mais comme au choix d'un pays, la liste déroulante doit retenir la valeur de la clé primaire pour matérialiser les dépendances des tables, nous devons ajuster un paramètre.
Toujours dans l'onglet Données, saisir la valeur 2 dans la propriété Colonne liée ,
La colonne 2 correspond au champ pays_id dans la requête, soit le champ de la clé primaire. Ainsi le contrôle Zone de liste déroulante stockera le nombre associé au nom du pays choisi.
Enregistrer les modifications (CTRL + S ),
Cliquer sur le bouton Affichage du ruban Accueil pour exécuter le formulaire,
Dérouler la liste et choisir un pays,
Tous les noms référencés dans la
table Pays sont effectivement proposés dans l'ordre où ils ont été saisis. La
requête SQL directement associée à la
propriété Contenu est donc une nouvelle façon de définir la source de données d'un contrôle de formulaire. Nous devons réitérer ce processus afin de créer une zone de liste déroulante permettant de choisir un poids de colis à livrer.
Afficher de nouveau le formulaire en mode Création,
Ajouter une nouvelle liste déroulante, à droite de la précédente, par copier-coller par exemple,
La renommer liste_poids dans l'onglet Autres de sa feuille de propriétés,
Puis changer le texte de son étiquette en : Poids du colis (Kg) ,
Sélectionner de nouveau le contrôle de la zone de liste déroulante,
Activer l'onglet Données de sa feuille de propriétés,
Dans la zone Contenu, saisir la requête SQL suivante :
SELECT poids_kg, poids_id FROM poids;
Il s'agit de charger la
liste déroulante de toutes les catégories de poids répertoriées dans la table source. Et comme précédemment, en même temps que la zone de liste se charge d'afficher les poids en Kg, elle doit mémoriser la valeur sélectionnée correspondant à la
clé primaire dans la table.
Donc nous récupérons (SELECT) les informations des champs poids_kg et poids_id depuis (FROM) la table poids. Dans l'énumération le
champ poids_kg est volontairement placé en tête pour que la liste déroulante récupère par défaut les informations textuelles. Mais pour que la zone de liste mémorise la valeur du numéro correspondant, nous devons modifier une autre propriété.
Toujours dans l'onglet Données, régler la valeur de sa propriété Colonne liée sur 2 ,
Enregistrer les modifications (CTRL + S),
Cliquer sur le bouton Affichage du ruban Accueil pour exécuter le formulaire,
Comme l'illustre la capture ci-dessus, la zone de liste propose effectivement toutes les tranches de poids autorisés pour la livraison.
Afficher de nouveau le formulaire en mode création,
Maintenant nous devons proposer le mode de livraison parmi deux possibilités, toujours via une liste déroulante. Ces deux modes ne sont pas disponibles pour tous les pays. Il s'agit donc d'une
liste déroulante en cascade . Son contenu dépendra du choix du pays dans la première liste.
Il s'agit de réaliser une requête sélection sur les deux tables Livraisons et Tarifs en fonction de la valeur (clé primaire) du pays sélectionné par le biais de la première liste déroulante. Le
critère de cette requête doit donc être dynamique puisqu'il dépend du choix de l'utilisateur à l'instant t . Pour faciliter la tâche, nous proposons de construire cette requête à l'aide de l'éditeur.
Cliquer sur l'onglet Créer en haut de la fenêtre Access pour activer son ruban,
Dans la section Requêtes, cliquer sur le bouton Création de requête ,
Dans la fenêtre qui apparaît, sélectionner les tables Tarifs et Livraisons (Touche CTRL),
Puis, cliquer sur le bouton Ajouter et ensuite sur le bouton Fermer ,
Glisser le champ Livraison_type de la table Livraisons dans la grille de requête,
Puis, ajouter les champs tarif_livraison et tarif_pays de la table Tarifs ,
Le champ tarif_livraison est en effet le numéro de la clé étrangère lié à la clé externe renseignant sur le mode de livraison à stocker dans la liste déroulante. Le champ tarif_pays est la clé externe correspondant au numéro de la clé primaire du pays choisi par le biais de la première liste déroulante du formulaire. Et c'est là que le critère dynamique doit être posé. Enfin, le champ Livraison_type est l'information en toutes lettres sur le mode de livraison à afficher dans cette troisième liste déroulante.
Cliquer avec le bouton droit de la souris dans la zone de critères du champ tarif_pays ,
Dans le menu contextuel, choisir Créer pour afficher le générateur d'expression,
Dans les éléments d'expression sur la gauche, déployer l'arborescence jusqu'à sélectionner le formulaire tarifs_livraison ,
Dans les catégories d'expressions au centre, double cliquer sur le contrôle liste_pays ,
Nous générons ainsi l'expression dynamique de correspondance pour que la requête extraie les modes de livraison dépendant du choix du pays depuis le formulaire.
Valider l'expression en cliquant sur le bouton Ok de la boîte de dialogue,
Enregistrer la requête sous le nom livraison_type ,
Fermer l'éditeur de requête en cliquant sur la croix de son onglet,
Basculer sur le formulaire en mode Création,
Ajouter une liste déroulante ou copier la précédente toujours sur la même horizontale,
Dans son étiquette, saisir le texte : Type de livraison ,
Puis sélectionner le contrôle de la liste déroulante,
Activer l'onglet Autres de sa feuille de propriétés,
Dans la zone Nom , saisir : liste_livraison ,
Puis activer l'onglet Données de sa feuille de propriétés,
Dans sa propriété Contenu , choisir la requête livraison_type à l'aide de la liste déroulante,
Dans sa propriété Colonne liée , saisir la valeur 2 pour les mêmes raisons que précédemment,
Enregistrer les modifications (CTRL + S),
Puis, cliquer sur le bouton Affichage du ruban Accueil pour exécuter le formulaire,
Choisir un pays à l'aide de la première liste et éventuellement un poids avec la deuxième,
Puis, dérouler la troisième liste déroulante pour visualiser les modes de livraison disponibles,
Comme l'illustre la capture ci-dessous, un problème surgit. En effet, la
requête dynamique que nous avons construite fonctionne, mais
extrait tous les doublons répondant à la demande . En effet, pour un même pays et pour un seul mode de livraison, plusieurs poids de colis sont possibles. Et ainsi les valeurs se répètent.
Comme nous l'avait appris la
formation VBA Access sur la saisie semi-automatique , nous allons modifier manuellement la syntaxe SQL de la requête. Le
mot-clé DISTINCT juste après l'instruction SELECT permet de préciser de ne pas répéter les valeurs en double.
Afficher le formulaire en mode création par le biais du bouton Affichage,
Dans le volet de gauche, cliquer avec le bouton droit de la souris sur la requête livraison_type ,
Dans le menu contextuel, choisir Mode création ,
Puis, cliquer sur la flèche du bouton Affichage dans le ruban Créer,
Dans la liste, choisir Mode SQL ,
Ajouter l'instruction DISTINCT juste après le mot clé SELECT ,
Les préfixes des noms de tables devant les champs comme Livraisons et Tarifs ne sont pas nécessaires dans la mesure où il n'existe pas d'ambiguïté dans les noms qui ont été attribués aux champs. Il convient en revanche de les conserver dans la clause INNER JOIN :
SELECT DISTINCT livraison_type, tarif_livraison, tarif_pays FROM Livraisons INNER JOIN Tarifs ON Livraisons.livraison_id = Tarifs.tarif_livraison WHERE Tarifs.tarif_pays=[Formulaires]![tarifs_livraison]![liste_pays];
En
langage SQL , la
clause INNER JOIN fait intervenir les relations existant entre les tables pour filtrer les enregistrements naturellement, comme l'explique la correspondance entre la clé primaire et la clé étrangère (Livraisons INNER JOIN Tarifs ON Livraisons.livraison_id = Tarifs.tarif_livraison).
Enregistrer les modifications et fermer l'éditeur SQL en cliquant sur la croix de son onglet,
Puis exécuter de nouveau le formulaire,
Choisir un pays, un poids et dérouler la liste déroulante des modes de livraison,
Un problème persiste. Les données ne se mettent pas à jour au changement de pays. La requête est chargée à l'ouverture du formulaire. Ensuite le contenu reste statique. Nous devons forcer le rafraîchissement des données au changement de destination. Nous pourrions le faire par le biais d'une macro mais nous choisissons ici le
code VBA car quelques lignes seront à écrire par la suite. Ce
code doit intervenir sur un événement particulier , celui du changement de nom détecté dans la liste
déroulante liste_pays .
Afficher le formulaire en mode création et sélectionner la liste déroulante des pays,
Puis, activer l'onglet Evénement de sa feuille de propriétés,
Cliquer sur le petit bouton en regard de son événement Sur changement ,
Dans la boîte de dialogue qui apparaît, choisir Générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code Visual Basic Access , entre les bornes de la
procédure événementielle liste_pays_Change . Le
code VBA écrit en ces bornes s'exécutera donc au changement de valeur dans la liste déroulante liste_pays. Comme nous l'avait appris la
formation pour débuter la programmation en VBA Access , l'objet DoCmd propose de nombreuses méthodes permettant de réaliser des actions et notamment des interactions.
Entre les bornes de la procédure, ajouter la ligne de code suivante :
DoCmd.Requery
La
méthode Requery de l'
objet DoCmd permet de forcer le recalcul des requêtes afin d'intégrer les nouveaux potentiels critères dynamiques.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + F11),
Exécuter ce dernier à l'aide du bouton Affichage du ruban Accueil ou de la touche F5,
Choisir la France à l'aide de la première liste déroulante ainsi qu'un poids avec la deuxième,
Puis, dérouler la liste des modes de livraison,
Seul le mode
En point relais est proposé pour ce pays, ce qui est tout à fait cohérent avec les enregistrements archivés en base de données.
Choisir maintenant l'Espagne et dérouler de nouveau la liste des types de livraison,
Cette fois le contenu s'adapte automatiquement et dynamiquement pour correspondre aux possibilités du pays, selon le
critère dynamique de la
requête livraison_type que nous avons conçue en amont.
Revenir sur le formulaire en mode création,
Extraction dynamique des données par le code VBA
Nous pourrions extraire les informations correspondantes du prix et du délai de livraison par requête intermédiaire afin d'afficher les résultats directement sur le formulaire. Mais l'extraction par le
code VBA Access n'est pas plus compliquée. De plus, cette méthode procure plus de souplesse afin de manipuler les données extraites dans leurs contrôles.
En dessous des listes déroulantes, ajouter un contrôle Zone de texte avec le ruban Création,
Avec l'onglet Autres de sa feuille de propriétés, le nommer : tarif_livraison ,
Dans son étiquette associée, saisir la légende : Le prix de la livraison ainsi définie est de : ,
Dupliquer ce contrôle et son étiquette (CTRL + C – CTRL + V),
Renommer la zone de texte ainsi copiée sous le nom : delai_livraison ,
Dans son étiquette associée, saisir le texte : Le délai de la livraison ainsi défini est de : ,
Enregistrer les modifications (CTRL + S),
Le principe consiste à exécuter un
code VBA dès qu'un changement est détecté dans l'une des listes déroulantes afin de récupérer le tarif et le délai de livraison correspondant au pays de destination, au poids du colis et au mode de livraison choisi. Cela signifie que ce code doit être déclenché sur l'
événement Sur changement de chacune des zones de liste déroulante. Nous proposons donc de créer une procédure indépendante qui pourra être appelée par chacune des procédures événementielles.
Basculer dans l'éditeur de code Visual Basic Access (ALT + F11),
En dessous de la procédure liste_pays_Change, créer la procédure maj_tarif() , comme suit :
Private Sub maj_tarif()
End Sub
Pour récupérer l'information sur le coût et le délai de la livraison, nous devons accéder aux enregistrements de la
table Tarifs selon une
requête SQL de sélection . Dans sa
clause WHERE , cette
requête doit recouper trois critères correspondant aux choix respectifs dans les listes déroulantes . Il suffira alors d'extraire l'information isolée grâce à un
objet Recordset . Et comme nous l'avait appris la
formation pour établir la connexion aux données , pour manipuler un tel objet, nous devons commencer par ajouter la référence à la librairie
Microsoft ActiveX Data Objects .
Dérouler le menu Outils en haut de l'éditeur de code,
Dans la liste, choisir Références ,
Dans la boîte de dialogue, cocher la case Microsoft ActiveX Data Objects 6.1 Library ,
Le numéro (6.1) dépend de la version installée sur votre ordinateur. Désormais, nous pouvons déclarer les objets qui hériteront des méthodes permettant de manipuler les enregistrements de la base de données.
Entre les bornes de la procédure, ajouter les deux déclarations de variables suivantes :
Dim ligne As Recordset: Dim base As Database
Nous déclarons un objet ligne en tant qu'
objet Recordset afin de pouvoir manipuler les enregistrements extraits par la
requête SQL . Et pour accéder à ces enregistrements, nous avons besoin d'un objet capable de pointer sur la base de données en cours, soit un
objet Database .
Avant d'exécuter la requête sur la
table Tarifs , nous devons commencer par nous assurer que les trois choix ont bien été réalisés dans chacune des listes déroulantes du formulaire. En d'autres termes, la valeur (Value) retournée ne doit pas être nulle. Il s'agit donc d'exploiter l'
instruction VBA conditionnelle .
A la suite du code, ajouter le bloc If suivant :
If (liste_pays.Value <> 0 And liste_poids.Value <> 0 And liste_livraison.Value <> 0) Then
End If
Le mot clé AND exclusif permet de recouper les trois critères afin qu'ils soient vérifiés ensemble. Si l'un d'eux n'est pas validé, la suite du code n'est pas exécutée. Nous pouvons désormais instancier les classes qui permettront aux objets déclarés de manipuler les éléments de la base de données.
Dans le bloc If, ajouter les affectations suivantes :
Set base = Application.CurrentDb
Set ligne = base.OpenRecordset('SELECT tarif_prix, tarif_duree FROM Tarifs WHERE tarif_pays=' & liste_pays.Value & ' AND tarif_poids=' & liste_poids.Value & ' AND tarif_livraison=' & liste_livraison.Value, dbOpenDynaset)
Le
mot clé Set permet d'initialiser l'affectation d'une variable objet. La
méthode CurrentDb de l'
objet Application permet de pointer sur la base de données en cours. Dès lors, la
méthode héritée OpenRecordset de l'
objet Database permet de faire pointer l'
objet ligne sur les enregistrements extraits par une requête. Cette requête sélection est passée en premier argument. Nous récupérons les enregistrements des champs tarif_prix et tarif_duree de la table Tarifs (FROM Tarifs) pour lesquels les champs tarif_pays, tarif_poids et tarif_livraison correspondent respectivement aux valeurs des listes déroulantes du formulaire. Nous accédons à ces enregistrements de façon dynamique (dbOpenDynaset) afin de pouvoir les manipuler par le code.
Pour récupérer les données extraites des champs tarif_prix et tarif_duree, nous devons exploiter la
propriété Fields de l'objet Recordset après avoir placé le pointeur de lecture sur le premier enregistrement, en l'occurrence ici, le seul correspondant aux critères recoupés de la requête.
Pour ce faire, Ã la suite du code, ajouter les instructions suivantes :
ligne.MoveFirst
tarif_livraison.Value = ligne.Fields('tarif_prix').Value
delai_livraison.Value = ligne.Fields('tarif_duree').Value & ' Jours'
La
méthode MoveFirst de l'
objet Recordset place le pointeur de lecture sur l'enregistrement résultant. La
propriété Fields de ce même objet permet de récupérer l'information du champ passé en paramètre pour l'enregistrement extrait. Nous affectons les valeurs des zones de textes à ces résultats grâce à leur
propriété Value .
Avant de tester le code et comme toujours, toute connexion ouverte sur une base de données doit être fermée. De plus, les variables objets doivent être déchargées de la mémoire afin de ne pas continuer de consommer des ressources inutilement.
A la suite, toujours dans l'instruction If, ajouter les lignes de code VBA suivantes :
ligne.Close
base.Close
Set ligne = Nothing
Set base = Nothing
La
méthode Close des
objets Recordset et
Database ferme les connexions. L'affection des variables objet Ã
Nothing permet de détruire ces dernières et donc de purger la mémoire vive.
Il nous reste encore à prévoir le cas échéant, c'est-à -dire lorsque l'un des critères n'est pas vérifié et donc qu'un choix de liste déroulante est manquant. Nous devons ajouter une
clause Else dans l'instruction If.
Pour ce faire, Ã la suite du code, ajouter les instructions suivantes :
Else
tarif_livraison.Value = ''
delai_livraison.Value = ''
Grâce à la propriété Value des contrôles Zone de texte, nous réinitialisons leur contenu pour ne pas induire l'utilisateur en erreur lorsqu'un paramètre est manquant. A ce stade, le code est inoffensif puisqu'il n'est appelé par aucune procédure événementielle. Nous avions déjà créé la procédure détectant le changement de valeur dans la liste déroulante des pays.
Dans la procédure liste_pays_Change , à la suite du code, ajouter les instructions suivantes :
liste_livraison = liste_livraison.ItemData(0)
maj_tarif
Grâce à la première ligne de code, nous prenons soin de recaler la valeur de la liste des modes de livraison sur le premier élément. En effet, en fonction du pays sélectionné, les éléments et leur nombre changent. Puis nous appelons la
procédure maj_tarif chargée d'exécuter la requête SQL permettant d'extraire les frais et délai de livraison.
Enregistrer les modifications et basculer sur le formulaire (ALT + F11),
Cliquer sur le bouton Affichage du ruban Accueil pour l'exécuter,
Avec la première liste déroulante, choisir la Belgique par exemple,
Comme vous le constatez, rien ne seproduit. Le test multicritère n'est pas vérifié par l'instruction conditionnelle If puisque les trois listes déroulantes ne sont pas renseignées. En conséquence, la suite du code n'est pas exécutée.
Choisir un poids à l'aide de la deuxième liste, par exemple 5 Kg,
Comme vous l'avez remarqué, grâce au code précédent, la dernière liste déroulante est pré-renseignée, soit
livraison A domicile . Et bien que les trois listes soient maintenant complétées, aucun résultat n'apparaît. Le code est en effet prévu pour se déclencher au changement de Pays. Or lorsque nous l'avons défini, les autres paramètres n'étaient pas réglés. Nous allons donc devoir appeler le code de la procédure indépendante sur Changement détecté dans les deux autres listes déroulantes.
Avec la première liste déroulante, choisir maintenant la France,
Cette fois les résultats sont extraits et affichés dans les zones de texte prévues à cet effet. Comme le seul mode de livraison pour la France est en point relais, la dernière liste s'est recalée automatiquement.
Afficher de nouveau le formulaire en mode création,
Sélectionner la deuxième liste déroulante, celle des poids,
Activer l'onglet Evénement de sa feuille de propriétés,
Cliquer sur le petit bouton en regard de son événement Sur changement ,
Dans la boîte de dialogue, choisir Générateur de code et valider par Ok,
Dans la procédure événementielle ainsi générée, ajouter l'appel (maj_tarif) au code précédent,
Revenir sur le formulaire (ALT + F11),
De la même façon, créer la procédure associée au changement de valeur dans la dernière liste,
Ajouter l'appel au code maj_tarif, entre les bornes de cette dernière,
Enregistrer les modifications et exécuter le formulaire,
Cette fois, la mise à jour s'opère dès qu'un changement est repéré et ce, quelle que soit la liste déroulante à l'origine du déclenchement. Mais comme toujours, la condition demeure. Les trois paramètres doivent être renseignés. Notre application pour déterminer les coûts de livraison en fonction de la destination, du poids du colis et du mode de livraison est terminée. Rappelons-nous de l'astuce de la requête intermédiaire qui nous a permis de créer ce système de liste déroulante en cascade, afin de restreindre les choix en fonction des précédents.
Le code complet de la procédure VBA qui permet l'extraction des coûts en fonction des paramètres définis depuis le formulaire est le suivant :
Private Sub maj_tarif()
Dim ligne As Recordset: Dim base As Database
If (liste_pays.Value <> 0 And liste_poids.Value <> 0 And liste_livraison.Value <> 0) Then
Set base = Application.CurrentDb
Set ligne = base.OpenRecordset('SELECT tarif_prix, tarif_duree FROM Tarifs WHERE tarif_pays=' & liste_pays.Value & ' AND tarif_poids=' & liste_poids.Value & ' AND tarif_livraison=' & liste_livraison.Value, dbOpenDynaset)
ligne.MoveFirst
tarif_livraison.Value = ligne.Fields('tarif_prix').Value
delai_livraison.Value = ligne.Fields('tarif_duree').Value & ' Jours'
ligne.Close
base.Close
Set ligne = Nothing
Set base = Nothing
Else
tarif_livraison.Value = ''
delai_livraison.Value = ''
End If
End Sub