Alimenter une table automatiquement

Question d’un lecteur du blog : Je dispose d’une table Access. Je dois créer 150 enregistrements dans cette table, les informations de chaque ligne étant quasi identiques. Peut-on automatiser le processus ?

Avant toute chose…

Avant de se lancer tête baissée dans le code, il faut d’abord s’assurer si cette approche respecte les règles de bases de données. Une table qui contient des lignes identiques (ou presque) peut être constituée de doublons, et c’est exactement ce qu’il faut éviter en principe ! Donc, plutôt que de reprendre ce qui suit mécaniquement, il faut avant se poser la question de son intérêt… 🙂

La table

La table dont on dispose est une table d’attestations, elle a cette structure simplifiée :

  • Numéro Attestation (clef primaire)
  • Date Attestation
  • Usage
  • Motif

Dans le scénario, la clef primaire est numérique, et c’est la seule information qui change de ligne en ligne. L’idée est de créer une séquence (par exemple du numéro 68003211 au numéro 68003360, soit 150 enregistrements).

Vous pourrez adapter en fonction de votre propre scénario (remplacez le nom de la table et des champs dans la suite).

Le formulaire

Je suppose que vous avez construit un formulaire indépendant pour la saisie de ces informations. Le formulaire contient les champs suivants, qui reprennent quasiment ceux de la table, sauf pour le numéro d’attestation qui va être généré automatiquement.

Les champs sont des zones de texte dont le nom démarre à chaque fois par txt (vous les retrouvez dans le listing plus loin).

formulaire_attestations.png

Au cas où, un petit rappel :

  • Un formulaire dépendant est basé sur une table (ou une requête), il est alimenté par cette table et peut servir à l’alimenter. D’où le côté « dépendant ». Les mises à jour (de la table vers le formulaire et inversement) sont gérées automatiquement par Access, aucun code à écrire.
    Les champs d’un formulaire dépendant sont généralement tous eux-mêmes dépendants (le champ de formulaire étant lié à un champ de la table).
  • Un formulaire indépendant n’est lié ni à une table, ni à une requête (sa « source » est vide). Par conséquent, les données qui y sont saisies ne sont pas conservées. Elles servent généralement à des traitements temporaires, qui sont à votre charge.
    Chaque champ d’un formulaire indépendant est lui-même indépendant.

Dans notre cas, il s’agit bien d’un formulaire indépendant : les informations n’alimentent pas directement la table, elles vont être utilisées en VBA pour créer indirectement plusieurs lignes de table. Nuance ! 🙂

Le code

Le bouton OK (dont le nom technique est btnOK) déclenche le traitement, une fois la saisie faite. Le principe consiste à utiliser les Recordsets DAO pour créer chacune des lignes demandées, dans une boucle VBA. Voici ce à quoi peut ressembler son événement Sur clic :

Important
L’exemple de code ci-dessus fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit être associée à votre base de données pour que le programme fonctionne.

Pour plus de détails sur les références, consultez cette page.

Tester le code

Pour tester tout ça :

  1. Ouvrez le formulaire en mode de saisie (le mode Formulaire, donc !).
  2. Remplissez le formulaire correctement (pour simplifier l’exemple, le code ne fait aucune vérification).
  3. Cliquez sur le bouton OK.

Vous aimerez aussi...

18 réponses

  1. clamens dit :

    Cool ce petit tuto. Il correspond pil poil à ce que je cherchais à faire? Petite question subsidiaire. Comment faire pour annuler un enregistrement? Suite à une erreur de saisie de N° de départ ou de Nbr d’enregistrement.
    D’avance merci

    • Hervé Inisan dit :

      L’annulation de l’enregistrement se ferait après l’exécution du code VBA ?
      Je pose la question parce qu’une fois le code exécuté, les données sont déjà dans la table. Il n’y a pas de réelle annulation possible, mais on peut supprimer les enregistrements incorrects.

  2. Christal dit :

    J’ai la sensation que la réponse à mon problème est là, à portée de doigt, sur cette page… et déjà, c’est un grand soulagement ! 🙂
    Mais trop novice en VBA pour adapter tout cela à ma problématique… j’aurais besoin de vos lumières :
    Voilà, ma base de données doit éditer chaque mois une facture pour chaque client qui a opté pour le prélèvement mensuel. La secrétaire doit, tous les mois, éditer les factures, une par une, pour l’ensemble des clients mensualisés (près de 1000, c’est très long…).
    J’imagine que l’on pourrait sélectionner les clients concernés (case à cocher dans la table client), et éditer chaque mois une facture automatique d’acompte (numéros incrémentés). Là où ça se complique, c’est que chaque facture d’acompte est différente en fonction des clients : éléments du devis /12.
    Ca me semble donc un peu complexe… Qu’en pensez-vous ?

    • Hervé Inisan dit :

      Pour le côté technique : oui, c’est faisable (ça fera appel à du VBA).
      Pour le côté pratique : ce n’est pas facile de répondre comme ça, j’imagine qu’il y a de nombreuses contraintes par client, qu’il faut les intégrer dans le code VBA, et que le tout fait partie d’une base de données plus générale…

  3. Haifed dit :

    Bonjour,
    Comment mettre à jour le champ quantité en stock de la table produit à chaque saisie du champ quantité de la table regrouper.
    Merci

    • Hervé Inisan dit :

      Ce n’est pas forcément une bonne idée : tu n’auras aucune traçabilité en cas d’erreur de saisie, puisque tu ne conserveras que la quantité finale. Il vaut mieux créer une table des mouvements de stocks, avec les entrées et les sorties, et calculer dynamiquement le total des mouvements.

  4. kolele dit :

    Bonjour Hervé,
    Pas sûr d’avoir posté, donc je reposte.
    Ordre alpha élèves, c’est parfait, en remplissant les salles contiguës (ordre alpha aussi). Pour les types de salles, une clause pour ne remplir que les salles ayant une capacité NON NULL suffirait.
    Merci de votre aide.

    • Hervé Inisan dit :

      kolele > J’ai bien reçu le message. Pas encore eu le temps de répondre proprement : j’étais pris dans une grooosse migration du site vers WordPress. Je fais encore quelques tests sur la migration. Ne pas hésiter à relancer si j’oubliais la réponse ! 😉

  5. Hervé Inisan dit :

    kolele > Vu de loin, c’est faisable techniquement. Dans les grandes lignes, il faudra ouvrir un premier Recordset pour extraire les élèves concernés par un code MEF, et un second Recordset pour l’écriture dans la table T_Examens (qui jouera le même rôle que celle de l’article).

    Maintenant : quelles sont les règles pour « remplir » une salle ? Est-ce qu’on se base sur l’ordre alphabétique des élèves, jusqu’à remplissage de la salle ? Est-ce que certaines épreuves doivent se faire obligatoirement dans certains types de salles ? (ou pas ?)

  6. kolele dit :

    Bonjour Hervé,

    Merci pour la présentation très claire de vos astuces.
    Novice déterminé en VBA et SQL, je voudrais remplir une table avec du code, en partant de votre solution, mais avec quelques modifications :
    – les enregistrements à ajouter sont sur une table tierce
    – le formulaire contient le critère qui permet de sélectionner les données à ajouter

    Le projet consiste à gérer des examens scolaires : sélectionner des élèves qui doivent passer une épreuve, pour ensuite les répartir dans des salles à capacité limitée. Pour l’instant, je voudrais ajouter ces élèves candidats dans une table, s’ils suivent la formation sanctionnée par l’examen.

    Soit une table T_Elève, avec les champs Id_Elève (clé primaire), NomPrénom_Elève, Code_MEF (c’est l’identifiant unique de la formation – ex: Code_MEF = 1 pour la Terminale Littéraire).
    Soit une table T_Salle, avec les champs Id_Salle (clé primaire), Nom_Salle, Capacité.
    Soit une table T_Epreuve, avec les champs Id_Epreuve, Nom_Epreuve, Date_Epreuve, Durée_Epreuve, Code_MEF
    Soit une table T_Examens qui relie les trois précédentes avec les champs Id_Examen (clé primaire), Clé_Elève, Clé_Salle, Clé_Epreuve (3 champs clé externe en relation plusieurs-à-un avec les clés primaires des tables T_Elève, T_Salle et T_Epreuve).

    Mon formulaire à moi est dépendant, les données proviennent de T_Epreuve. Ex. d’enregistrement :
    Id_Epreuve = 1
    Nom_Epreuve = Bac histoire-géographie
    Date = 19/6/14
    Code_MEF = 1
    Le code sur clic de bouton de commande créerait un jeu d’enregistrement, avec les Id_Elève de T_Elèves, seulement pour ceux d’entre eux qui ont le code MEF du formulaire. Puis ajouterait ces enregistrements dans T_Examens, avec Clé_Epreuve=Id_Epreuve du formulaire.

    Qu’en pensez-vous ?

  7. Hervé Inisan dit :

    Kadem > Merci pour le retour ! 🙂

  8. Kadem dit :

    Je suis très content de découvrir ce site.
    Le code proposé ici marche très bien; j’ai déjà utilisé une variante de celui-ci pour remplir mes tables à partir des formulaires indépendants.
    Merci.

  9. Hervé Inisan dit :

    Bandi > Ce sera plus facile effectivement. A bientôt là-bas ! 🙂

  10. Bandi dit :

    Je viens d’essayer ta technique. Cela ne marche malheureusement pas…
    Hier je me suis orienté vers le même raisonement sans aucun résultat (il faut savoir que je suis un novice en ce qui concerne le vba).
    Je vais m’inscrire sur le forum du site très bientôt ce sera mieux !

  11. Bandi dit :

    Pour mon cas ces txtbox sont de type numérique.
    Merci pour ton aide

  12. Hervé Inisan dit :

    Bandi > Dans ce cas, il faudrait ajouter une boucle à l’intérieur ou autour de la boucle principale existante. Du genre :

    J’ai repris l’exemple de l’article, les modifications touchent lngUsage. A adapter bien sûr. 😉

  13. Hervé Inisan dit :

    Bandi > txtDebut et txtFin sont de quel type dans ton scénario ?

  14. Bandi dit :

    Cette technique marche vraiment très bien merci beaucoup !!! De mon côté je l’utilise en reprenant les champ d’une table (donc dépendant) et pas de problème.
    Par contre, dans mon cas, je souhaite rajouter une condition avec 2 textbox : txtdebut et txtfin qui font office de plage de travail.
    En reprenant ton exemple : imagine que ton formulaire est dépendant et que tu souhaite créer les enregistrements pour USAGE = A à D
    Comment faire pour automatiser le processus ?
    Encore merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *