Comment ajouter une valeur à une table avec VBA Access
Imaginez que vous avez une base de données Access contenant l'historique des ventes de votre entreprise. Et un de vos vendeurs vous envoie un fichier Excel avec ses chiffres. Si le format des deux tables est le même, l'import dans Access ne va pas poser de problème.
Principes généraux : INSERT INTO et méthodes d'ajout
Il existe principalement deux méthodes d’ajout des enregistrements à une table. La première consiste à ajouter un enregistrement à la fois ; la deuxième consiste à ajouter plusieurs enregistrements à la fois. Dans les deux cas, vous utilisez l’instruction SQL INSERT INTO pour exécuter la tâche.
Pour ajouter un enregistrement à une table, vous devez utiliser la liste de champs pour définir dans quels champs insérer les données, puis insérer les données dans une liste de valeurs. Pour définir cette dernière, utilisez la clause VALUES. Vous pouvez utiliser l’instruction INSERT INTO pour ajouter un enregistrement unique à une table à l’aide de la syntaxe de requête Ajout d’enregistrement unique indiquée ci-dessus.
Pour ajouter plusieurs enregistrements à une table en une seule fois, utilisez l'instruction INSERT INTO associée à une instruction SELECT. La table source ou cible peut spécifier une table ou une requête. Une requête Ajout copie des enregistrements à partir d'une ou plusieurs tables vers une autre.
INSERT INTO : champs, valeurs et compatibilités
Vous devez spécifier chacun des champs de l’enregistrement auxquels une valeur doit être attribuée, et la valeur de chaque champ. Si vous ne spécifiez pas tous les champs, la valeur par défaut ou une valeur Null est insérée dans les colonnes vides. Si vous omettez la liste de champs, la clause VALUES doit inclure une valeur pour chaque champ de la table ; sinon, l’opération INSERT échouera.
Lire aussi: Modifier Activité Kbis Auto-Entrepreneur
Les types de données des champs de la table source doivent être compatibles avec les types de données des champs de la table de destination. Les champs de texte sont compatibles avec la plupart des autres types de champs. Les champs numériques sont compatibles uniquement avec les autres champs numériques.
Cas particulier : champ NuméroAuto et clé primaire
Si votre table de destination contient une clé primaire, assurez-vous que vous ajoutez des valeurs uniques et non Null dans les champs de clé primaire. Si vous ajoutez des enregistrements à une table avec un champ NuméroAuto et que vous voulez renuméroter les enregistrements ajoutés, n’incluez pas le champ NuméroAuto dans votre requête.
Vous venez d'ajouter un enregistrement et vous voulez avoir le NuméroAuto qui vient de s'incrémenter. Vous pouvez le récupérer selon la méthode utilisée (DAO ou ADO), par exemple rst.Update puis lecture de la valeur générée ; par contre avec la méthode ADO le code est disponible après l'appel de Update.
Exemples pratiques : de la macro au VBA pour insérer dans une base externe
Comme vous pouvez le voir, la décompression livre deux fichiers Access. Le premier se nomme formulaire-d-ajout-original.accdb. Il permet déjà l'ajout d'enregistrements dans une table locale et ce, sans l'appui du code VBA Access. Le second se nomme source.accdb. Il s'agit de la base externe dans laquelle nous devons insérer les nouvelles informations, issues des demandes réalisées depuis le formulaire local de la première base de données.
Avec les deux précédents volets, nous avons appris à articuler des listes déroulantes entre elles et sur cette base à produire l'extraction des informations concordantes à partir d'une source externe. Si vous remplissez tous les champs, que vous cliquez sur le bouton Ajouter et que vous affichez les derniers enregistrements de la table Biens, vous constatez que la nouvelle ligne d'informations a parfaitement été insérée. Et cette solution ne fait pas appel au code VBA comme nous l'avons dit. Ce sont des macros qui l'articulent.
Lire aussi: INPI et Micro-Entreprise : Démarches
Mais désormais, la problématique est toute autre. Nous basculons dans l'éditeur VBA Access entre les bornes de la procédure Commande43_Click. Ce bouton n'avait donc pas été nommé. En effet, jusqu'alors la solution était animée par des actions de macro. Avec le VBA, il est toujours judicieux d'apporter des noms explicites sur les objets pour les piloter plus facilement.
Piloter une base externe depuis VBA : étapes et objets
Pour piloter les objets d'une base de données externe, une référence doit être ajoutée au projet. La variable base est typée comme un objet Access.Application. Cette déclaration est rendue possible grâce à la référence ajoutée au projet. Nous typons les deux autres variables comme des textes (As String). La première (requete) doit stocker la syntaxe de la requête SQL d'insertion à exécuter ensuite sur la source externe. La seconde (chemin) doit mémoriser le chemin d'accès à cette source d'informations.
Ensuite et nous le savons, c'est la fonction VBA CreateObject qui permet d'instancier des classes selon la valeur qui lui est transmise en paramètre. Avec l'argument Access.Application, elle permet de créer une nouvelle instance d'Access. Nous initialisons (Set) donc l'objet base sur une nouvelle instance d'Access. C'est ainsi qu'il hérite des propriétés et méthodes nécessaires pour piloter les objets d'une base de données.
Grâce à la propriété Path de l'objet CurrentProject, nous récupérons le chemin d'accès à la base de données en cours. Puis, nous lui associons le nom de la source externe (\source.accdb). C'est ainsi que nous pouvons passer ce chemin à la méthode héritée (OpenCurrentDatabase). Désormais, notre objet base pointe sur la source externe.
Construire une requête INSERT dans VBA
Maintenant, il est question de construire la requête SQL d'insertion permettant d'enregistrer chaque information du formulaire dans chaque champ respectif de la table Biens. Nous engageons donc une classique requête d'insertion sur la table Biens (INSERT INTO Biens). Nous énumérons tous les champs à renseigner dans cette table, en les séparant les uns des autres par une virgule. Puis, nous indiquons quelles sont les valeurs à y insérer (Values).
Lire aussi: Comment Calculer la TVA ?
Attention à la première donnée. La ville est un texte. Elle doit donc être encadrée de simples côtes ('" & Ville.Value & "'). Toutes les autres sont des valeurs numériques ou booléennes. Il nous reste encore à exécuter cette requête sur la base de données externe. L'objet CurrentDb de notre objet base permet de déployer la méthode Execute à laquelle nous passons la syntaxe SQL d'insertion et le tour est joué. L'injection s'effectue très rapidement.
Certes, un message de confirmation (MsgBox) aurait été opportun à l'issue. Si vous affichez la table Biens de la base de données en cours, vous remarquez, contrairement au résultat de la solution initiale, qu'aucune insertion n'y a été réalisée. Ça veut dire hélas, que si vos tables sont dans une base séparée, seule cette base sera mise à jour, pas l'application.
Variabiliser le code : noms de fichiers, tables, champs et valeurs
Comme vous voyez, vous pouvez choisir la manière dont vous sélectionnez les valeurs à exporter: cela peut être une valeur particulière, le contenu d'une cellule ou encore le résultat d'un calcul. On peut faire plusieurs fonctions selon la situation. Les informations sur le fichier Access sont dans la fonction, la seule chose qui manque sont les valeurs à exporter.
Dans cette fonction, on peut utiliser le nom du fichier et le nom de la table comme arguments variables. De plus, on peut également rendre variable les noms de colonnes et les valeurs. Prenons un exemple avec 3 valeurs qui doivent être exportées. Mon credo ? Ajoute un ou plusieurs enregistrements à une table. Chaque valeur est insérée dans le champ qui correspond à la position de la valeur dans la liste : valeur1 est insérée dans champ1 du nouvel enregistrement, valeur2 dans champ2, et ainsi de suite.
Joindre plusieurs opérations d'insertion en une seule requête
Par exemple avec une requete ajout. Pour ajouter plusieurs enregistrements en une seule passe, utilisez l'instruction INSERT INTO associée à une instruction SELECT. Vous pouvez spécifier la valeur de chaque champ dans un nouvel enregistrement unique à l’aide de la clause VALUES. Mais si vous avez besoin d'insérer plusieurs jeux de valeurs sur une même ligne, il faut veiller à réunir les données désirées dans une seule instruction INSERT ou construire la SELECT pour qu'elle retourne toutes les colonnes recherchées.
Voici la problématique souvent rencontrée : Par contre, j'aurais deux INSERT TO à mettre. L'age n'est pas important, c'était à titre d'exemple, en réalité ma base de données comporte des champs en rapport avec mon entreprise. oui mais moi je veux que les deux requete sois réunies en une seule, parce que en séparant en deux requettes comme tu as fait, ça ne va pas me mettre tout sur la meme ligne de donnée, or moi c'est ce que je veux.
Solution conceptuelle : réunir les données nécessaires dans une seule requête d'insertion (ou créer une requête SELECT qui combine/concatène les sources) afin que tous les champs de destination soient fournis simultanément par la clause VALUES ou par les colonnes retournées par la SELECT. Si certaines données viennent de calculs ou d'expressions, utilisez ces expressions dans la requête elle-même.
Bonnes pratiques : vérifications, compatibilités et tests
Certes, il serait tout d'abord opportun de contrôler la saisie sur ce formulaire et de vérifier qu'aucune donnée n'est manquante. Nous engageons donc une classique requête d'insertion sur la table Biens. Il est recommandé de vérifier que la requête a retourné les enregistrements que vous souhaitez copier. Vous pouvez afficher votre sélection en mode Feuille de données et apporter des ajustements à votre sélection en fonction des besoins avant de copier les données.
Vous ne pouvez pas annuler une requête Ajout. Pendant que vous exécutez une requête qui renvoie de grandes quantités de données, vous risquez de recevoir un message d’erreur indiquant que vous ne pourrez pas annuler la requête. Vous devez donc être certain des opérations à effectuer avant d'exécuter une requête Ajout.
Si vous copiez des données manuellement, vous devez généralement effectuer plusieurs opérations de copie/collage. Passez en revue votre sélection avant de la copier. Ceci peut être particulièrement utile si votre requête inclut des expressions ou des critères et que plusieurs essais sont nécessaires pour obtenir le résultat parfait.
Autres opérations liées : UPDATE, DELETE, CREATE TABLE
Pour modifier les données qui se trouvent actuellement dans une table, utilisez l'instruction UPDATE, couramment appelée « requête Mise à jour ». Pour supprimer les données qui se trouvent actuellement dans une table, utilisez l'instruction DELETE, couramment appelée « requête Suppression ». L’instruction DELETE ne supprime pas la structure de la table, mais uniquement les données qu’elle contient.
Pour créer une nouvelle table à partir d’une sélection de données ou fusionner deux tables en une seule nouvelle table, vous pouvez utiliser une requête Création de table. Par exemple, vous pouvez créer une table résultante à partir d'une SELECT et l'utiliser comme table cible d'opérations ultérieures.
Outils et références utiles
Il faut ajouter la référence Microsoft ADO Ext si vous utilisez certaines fonctionnalités. Il faut créer dans la table un index multichamp et définir sa propriété unique à "oui" si vous souhaitez interdire les doublons sur une combinaison de champs. Vous pouvez également utiliser une expression en tant que champ, comme =Date() pour retourner automatiquement la date du jour.
Liens fournis par la communauté UtterAccess et autres ressources peuvent aider pour des cas avancés comme la manipulation DAO, ADO, ou l'utilisation de l'API pour ouvrir des fichiers. Consultez la documentation et les FAQ pour des exemples concrets et des fonctions prêtes à l'emploi.
Labo Versa SD-WAN complet étape par étape : Installation de Versa Director | Architecture expliquée
Table récapitulative : choix selon le besoin
| But | Méthode | Remarques |
|---|---|---|
| Ajouter un enregistrement unique | INSERT INTO ... (champs) VALUES (...) | Spécifier chaque champ ; gérer types (texte entre ' ') |
| Ajouter plusieurs enregistrements | INSERT INTO ... SELECT ... FROM ... | Copier depuis une table/requête source compatible |
| Insérer dans base externe via VBA | CreateObject("Access.Application") + OpenCurrentDatabase + CurrentDb.Execute | Ajouter référence, veiller aux chemins et aux droits |
| Mettre à jour des enregistrements | UPDATE | Utiliser pour modifier des données existantes |
Conseils finaux
- Testez vos requêtes en mode Feuille de données avant exécution finale.
- Vérifiez les compatibilités de types entre source et destination.
- Ne modifiez pas la structure d'une table liée depuis une source non modifiable.
- Ajoutez des noms explicites aux objets (boutons, formulaires) pour faciliter la maintenance du code VBA.
balises:
