Mise à jour d’une base Access par fichier CSV ou Excel – Episode 4

Suite de notre saga sur l’importation de fichiers CSV et Excel. Dans le précédent article, on a vu comment importer un fichier CSV. Aujourd’hui, c’est au tour des fichiers Excel.
Cet article sera plus court que les précédents, puisque toute la structure est déjà en place.
Si vous avez manqué le début
Relisez les articles précédents, si vous ne l’avez pas déjà fait (sinon, rien ne marchera ;)).
Le code
Pour importer un fichier Excel, au lieu d’un fichier CSV, il suffit de modifier les paramètres de notre objet TableUpdater
. Ajoutez cette procédure de test, dans le module mod Tests TableUpdater
(créé précédemment).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
' --- ' TEST DE MISE A JOUR DE TABLE - NEWSLETTER ' --- ' Sub TestTableUpdaterNewsletterExcel() Dim tu As TableUpdater ' Pour les tests, on vide la table avant d'importer ' les données externes CurrentDb.Execute "DELETE * FROM [tbl Destinataires Newsletter]" ' Initialisation d'un TableUpdater Set tu = New TableUpdater With tu ' Fichier à importer (chemin, type, version) .Source = SourcePath() & "dest01.xlsx" .SourceType = Excel .ExcelVersion = acSpreadsheetTypeExcel12 ' Informations sur les données .Headers = True .Target = "tbl Destinataires Newsletter" .TempTable = "tbl Destinataires Newsletter TEMP" ' Importation .Import End With ' Message final BilanImportation tu ' Libérer les ressources Set tu = Nothing End Sub |
Pour que ça fonctionne, je suppose :
- Que vous avez un fichier Excel (au format 2007, 2010 ou 2013, extension
.xlsx
) appelédest01.xlsx
. - Que ce fichier est placé dans le dossier défini par la constante
SOURCE_PATH
. Reportez-vous à l’article précédent pour plus de détails. - Que ce fichier contient des données compatibles avec la table (ça va aider !). Dans mon cas, le fichier a été créé en ouvrant dans Excel le fichier CSV de l’article précédent, et en l’enregistrant au format Excel.
Les nouveautés
La procédure de test ne change pas beaucoup de l’exemple précédent. Les nouveautés sont :
- La propriété
Source
qui pointe maintenant vers un fichier Excel plutôt que CSV. - La propriété
SourceType
qui précise que la source est un fichier Excel. - La propriété
ExcelVersion
qui donne la version d’Excel du fichier (les valeurs proposées sont fournies par Access).
Importer des données en choisissant la feuille Excel
Il se peut que votre classeur Excel contienne plusieurs feuilles. Vous devrez donc peut-être choisir laquelle des feuilles utiliser à l’importation. L’objet TableUpdater
fournit pour cela une propriété Range
. Voici comment l’utiliser :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
' --- ' TEST DE MISE A JOUR DE TABLE - NEWSLETTER ' --- ' Sub TestTableUpdaterNewsletterExcel() Dim tu As TableUpdater ' Pour les tests, on vide la table avant d'importer ' les données externes CurrentDb.Execute "DELETE * FROM [tbl Destinataires Newsletter]" ' Initialisation d'un TableUpdater Set tu = New TableUpdater With tu ' Fichier à importer (chemin, type, version) .Source = SourcePath() & "dest01.xlsx" .Range = "Liste Personnes!" .SourceType = Excel .ExcelVersion = acSpreadsheetTypeExcel12 ' Informations sur les données .Headers = True .Target = "tbl Destinataires Newsletter" .TempTable = "tbl Destinataires Newsletter TEMP" ' Importation .Import End With ' Message final BilanImportation tu ' Libérer les ressources Set tu = Nothing End Sub |
La nouveauté ici est cette ligne :
1 |
.Range = "Liste Personnes!" |
Elle permet de définir le nom de la feuille Excel à utiliser (ici : « Liste Personnes« ). Le point d’exclamation, après le nom de la feuille, est important : il indique qu’on souhaite extraire les données de toute la feuille. Vous pourriez aussi faire référence à une zone précise, comme ceci :
1 |
.Range = "Liste Personnes!A1:D6" |
ou encore en utilisant une zone nommée du classeur, comme cela :
1 |
.Range = "Personnes" |
Merci pour voter boulot et vos réponses avisées.
Tout fonctionne parfaitement chez moi aprés quelques corrections apportées suite aux réponses que vous avez faites vers d’autres utilisateurs.
Super boulot !!
Merci ! 🙂
Bonjour,
Tuto super intéressant et clair! Un épisode 9 est-il prévu?
Je tombe cependant sur un message d’erreur n°6 lorsque je veux injecter un fichier xlsx.
Quelle pourrait être la cause de ce message? Ma clé principale est une chaine de caractère composée de chiffres, lettres et le symbole -. Quand, sur la même table, je modifie la clé par un NumAuto je n’ai plus de probléme.
Merci!
A+
Le problème vient effectivement de là : actuellement, le code VBA ne gère qu’une clef numérique (NuméroAuto, ou Numérique/Entier long, par exemple).
OK! Je comprends mieux 🙂
Merci pour la réponse rapide !
Si je veux adapter le code à mon cas particulier, il faut que je modifie quelle module?
A froid comme ça, il faudrait regarder du côté de la fonction
InsertData()
. L’instruction SQL qu’elle génère fait des comparaisons sur une clef primaire numérique (les valeurs 0 et 1). Il y a peut-être d’autres endroits du code à retoucher (j’ai pu rater quelque chose en relisant ;)).Hello
pour l’erreur #5 pour ma part c’était un fichier xlsx mal formaté. Par contre peux-tu m’expliquer si je veux changer de table quelle partie de ton code je dois modifier ?
D’avance merci
djillius
Ça marche. 🙂
Pour modifier la table destination, il faut remplacer tous les «
tbl Destinataires Newsletter
» par le nom de ta table (c’est elle la table cible, dans cet article).Hello,
J’ai un autre souci.
Avec une table différente, il m’insère 4 champs dans la table provisoire p_f10, p_f11, p_f12 et p_f13 et je n’arrive pas à trouver d’où ces champs proviennent ?
Merci pour ton aide.
Est-ce qu’il y a des colonnes vides dans le CSV d’origine ? (du genre :
nom;prenom;;ville
)Oui il y en a
Les colonnes « spéciales » doit venir de là : Access importe toutes les colonnes, y compris les vides, et les nomme automatiquement si aucun titre n’est fourni. Un nom de champ est obligatoire pour qu’une structure de table soit valide.
Effectivement les entêtes n’étaient pas propres 😉 Ils me créaient des colonnes supplémentaires. Par contre j’ai toujours une erreur 6#, la table tmp est bien créée. Sais-tu d’où cela peut provenir ??
L’erreur 6 correspondrait à un problème d’insertion de ligne. Du coup, ça m’amène quelques pistes :
Est-ce que la clef primaire est définie ?
Est-ce que le champ en question donne bien des données toutes différentes ?
(ça peut venir encore d’autre chose, bien sûr)
Hello,
Bravo pour ton site et merci pour le code. Tout fonctionne bien avec un fichier csv mais si je teste le code avec un fichier excel. Il me met une erreur #5 erreur d’importation.
Merci pour ton aide
djillius