formateur informatique

Exporter les données de tables Access en Csv avec VBA

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Exporter les données de tables Access en Csv avec VBA
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Inscription Newsletter
Sujets que vous pourriez aussi aimer :


Exporter les données en CSV

Dans ce nouveau volet, nous allons apprendre à automatiser l'exportation des données de tables Access dans des fichiers CSV, prêts à être exploités par des logiciels tiers comme Excel.



Base de données Access à télécharger
Pour développer l'étude, nous suggérons d'appuyer les travaux à partir d'une base de données Access hébergeant un formulaire permettant déjà de choisir l'une des tables à exporter, par le biais d'une liste déroulante. Comme vous le voyez, la décompression livre le fichier de la base de données accompagné d'un sous dossier destiné à recevoir les exportations de données au format csv.
  • A la racine, double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
  • Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
Comme l'indique le volet de navigation sur la gauche de l'écran, cette base de données Access est constituée de sept tables et d'un formulaire. Les tables abritent des questionnaires destinés à une application d'évaluation. Ils sont très anciens et ne sont donc plus d'actualité. Qu'à cela ne tienne, seules les données à manipuler et à exporter fidèlement nous intéressent.
  • Dans le volet de navigation, double cliquer sur le formulaire fQuestions pour l'exécuter,
Nous découvrons une liste déroulante placée au-dessus de deux boutons. Le premier doit servir à exporter les données de la table choisie, au format Csv. Le second doit simplement permettre de fermer le formulaire.
  • Déployer la liste déroulante en cliquant sur sa flèche,
Liste déroulante des noms de tables sur formulaire Access

Comme vous pouvez le voir, ce sont tous les questionnaires qui sont proposés, soit tous les noms de tables. Et c'est un code VBA Access existant, que nous avons développé à l'occasion d'une précédente astuce, qui se charge de remplir cette liste déroulante de tous les noms de table, dans la mesure où il ne s'agit pas de tables du système.

Au choix de l'un de ces noms et au clic sur le bouton Exporter, nous devons livrer le contenu de la table désignée au format Csv pour pouvoir l'exploiter dans un autre logiciel comme Excel. Comme vous le savez, le Csv est effectivement un format universel de communication.



La procédure et les variables
Pour débuter, nous devons commencer par créer la procédure VBA capable de se déclencher au clic sur le bouton Exporter. Nous devons aussi déclarer les variables nécessaires au traitement. Il est notamment question de piloter la base de données et ses enregistrements avec des objets dédiés. Mais nous nous sommes acclimatés désormais. Nous devons aussi pointer sur le fichier à créer dans le sous dossier exports pour y écrire les informations structurées issues de la table désignée par l'utilisateur.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • Sur le formulaire en conception, cliquer sur le bouton Exporter pour le sélectionner,
  • Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
  • Puis, cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par le bouton Ok,
De fait, nous basculons dans l'éditeur VBA Access entre les bornes de la procédure événementielle exporter_Click. exporter est le nom du bouton. Click est son événement associé. Son code se déclenchera au clic sur le bouton exporter.

Au passage, vous notez la présence de la procédure Form_Current. C'est elle qui se charge de parcourir toutes les tables de la base de données au chargement du formulaire pour remplir la liste déroulante de tous ces noms.
  • Dans la procédure exporter_Click, ajouter les déclarations de variables suivantes :
Private Sub exporter_Click()
Dim base As Database: Dim enr As Recordset
Dim nomTable As String: Dim ligne As String
Dim nomF As String: Dim memLibre As Integer

End Sub


C'est usuel. Nous déclarons tout d'abord deux objets de base de données. Le premier typé comme un objet de base de données (Database) doit pointer sur la base de données en cours pour hériter des propriétés et méthodes permettant de la piloter. Le second, typé comme un objet de type Recordset, doit exploiter l'une de ses méthodes pour piloter les enregistrements de la table désignée dans la base de données en cours. Nous exploiterons la variable nomTable, typée comme un texte (As String) pour reconstruire le chemin d'accès complet au fichier Csv à créer, en cohérence avec le nom de la table. Nous utiliserons la variable ligne pour construire chaque ligne du fichier Csv en fonction des données de chaque enregistrement parcouru dans la table désignée. La variable nomF doit exploiter le nom du fichier Csv reconstruit. Enfin, nous userons de la variable numérique memLibre pour générer un numéro d'allocation mémoire afin d'accéder au fichier Csv en écriture depuis la mémoire de l'ordinateur, avant de l'enregistrer en dur sur le disque.

Initialiser les variables VBA
Comme il est de coutume, après les déclarations viennent les affectations. Nous allons certes calibrer le chemin d'accès pour l'écriture mais nous allons surtout en profiter pour initialiser nos objets de base de données.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
If (Questionnaire.Value <> "") Then
nomTable = Questionnaire.Value

nomF = CurrentProject.Path & "\exports\" & LCase(Replace(nomTable, " ", "-")) & ".csv"
memLibre = FreeFile

Set base = CurrentDb()
Set enr = base.OpenRecordset(nomTable)
ligne = "QUESTION; choix1; choix2; choix3; choix4; REPONSES; réponse; image"

End If
...


La liste déroulante se nomme Questionnaire. Nous questionnons son contenu (Value) avant d'entreprendre tout traitement d'exportation. S'il est vide, cela signifie que l'utilisateur n'a désigné aucune table. En conséquence, nous devons avorter la procédure.

Si une table est bien renseignée en revanche, nous stockons son nom dans la variable nomTable. Puis, nous la concaténons au chemin d'accès local (CurrentProject.Path), lui-même associé au sous dossier exports. C'est effectivement à cet emplacement que nous souhaitons écrire les fichiers csv. Notez que nous retravaillons le nom de la table. Avec la fonction LCase, nous convertissons tous les caractères en minuscules pour normaliser le nom de fichier résultant. Avec la fonction Replace, nous remplaçons tous les espaces par des tirets. Enfin, nous ajoutons l'extension csv.

La fonction FreeFile permet d'attribuer un numéro d'adresse mémoire non encore utilisé. Nous l'exploiterons quand nous entreprendrons l'écriture des données de la table dans le fichier csv. Cette écriture se fait effectivement en mémoire dans un premier temps.

Ensuite, nous initialisons (Set) nos objets de base de données. Grâce à la fonction CurrentDb, notre objet base hérite des propriétés et méthodes pour piloter les objets de la base de données en cours. Et précisément dans l'enchaînement, nous appelons sa méthode OpenRecordset, avec en paramètre le nom de la table choisie, pour initialiser (Set) notre objet enr. Dès lors, ce dernier hérite des propriétés et méthodes pour manipuler les enregistrements et champs de cette table.

Enfin, nous inscrivons les noms des champs dans la variable ligne. Il s'agit des entêtes à reproduire sur la première ligne du fichier csv pour qu'un logiciel comme Excel sache les utiliser comme des titres. Notez que nous exploitons le point-virgule (;) comme délimiteur.



Accéder au fichier en écriture
Avant de pouvoir écrire dans le fichier, nous devons le créer, selon le chemin reconstruit précédemment. Avec la méthode que nous allons utiliser, s'il n'existe pas, il est créé. S'il existe, son contenu est remplacé par le nouveau.
  • A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Open nomF For Output As #memLibre
Print #memLibre, ligne

Close #memLibre
...


Il s'agit d'un accès séquentiel en écriture très classique. Nous avions appris ces techniques avec la formation VBA Excel pour importer et exporter des données. L'instruction Open désigne le nom du fichier cible (nomF). Le mode d'accès est l'écriture (Output) sur l'adresse mémoire allouée (#memLibre). Et tout de suite, sur cet emplacement en mémoire (#memLibre), nous en profitons pour écrire (Print) la première ligne, celle des entêtes. Les autres suivront et se cumuleront les unes en-dessous des autres. Une fois l'écriture terminée, nous n'oublions pas de libérer la mémoire (Close) pour procéder à l'inscription en dur du fichier csv sur le disque.

Ecrire les lignes de la table dans le Csv
Mais nous n'avons pas fini d'écrire. Nous allons donc continuer d'implémenter cette section. En effet, grâce à l'objet enr, il est maintenant question d'accéder aux enregistrements de la table. Nous devons les parcourir tous avec une boucle dédiée. C'est ainsi que nous pourrons ajouter les nouvelles lignes dans le fichier pour recomposer les données de la table au fur et à mesure et au format Csv.
  • Avant l'instruction Close, ajouter les lignes VBA suivantes :
...
Open nomF For Output As #memLibre
Print #memLibre, ligne
If (enr.RecordCount <> 0) Then
enr.MoveFirst
Do
ligne = enr.Fields("QUESTION").Value & ";" & enr.Fields("choix1").Value & ";" & enr.Fields("choix2").Value & ";" & enr.Fields("choix3").Value & ";" & enr.Fields("choix4").Value & ";" & enr.Fields("REPONSES").Value & ";" & enr.Fields("réponse").Value & ";" & enr.Fields("image").Value
Print #memLibre, ligne
enr.MoveNext
Loop Until enr.EOF
End If

Close #memLibre
...


Grâce à la propriété RecordCount de l'objet enr, nous vérifions tout d'abord (if) que la table contient bien des enregistrements. Sinon, il n'est pas utile de poursuivre. Ensuite et classiquement, nous plaçons le pointeur de lecture sur le tout premier enregistrement de la table, grâce à la méthode MoveFirst de l'objet enr. Dès lors, nous engageons la boucle destinée à les parcourir tous (Do...Loop Until enr.EOF). La propriété EOF de l'objet enr signifie End Of File. Comprenez que la boucle ainsi construite, poursuit son traitement tant que le dernier enregistrement n'est pas atteint. Et précisément à chaque passage, nous recomposons la ligne à ajouter dans le fichier csv. Pour cela, nous assemblons chaque valeur de champ (Fields) avec les autres, sans oublier les points-virgules qui doivent servir de délimiteurs. Puis, nous écrivons effectivement (Print) cette nouvelle ligne, à la suite dans le fichier Csv.

Détruire les objets de base de données
Pour terminer, nous devons détruire les objets de base de données pour libérer proprement les ressources. Et bien entendu, cette intervention doit survenir après l'écriture finalisée dans le fichier Csv, donc une fois tous les enregistrements traités et le fichier fermé. En d'autres termes, ces instructions doivent être inscrites après la commande Close dans la première instruction conditionnelle.
  • Après la commande Close, ajouter les instructions VBA suivantes :
...
Loop Until enr.EOF
End If
Close #memLibre

enr.Close
base.Close
Set enr = Nothing
Set base = Nothing

End If
...


C'est la méthode Close appliquée sur ces objets de base de données qui permet tout d'abord de les fermer tour à tour. Ensuite, nous les réinitialisons (Set) sur la valeur Nothing. C'est ainsi que nous les vidons de la mémoire.
  • Enregistrer les modifications (CTRL + S), puis basculer sur le formulaire (ALT + Tab),
  • L'exécuter avec la touche F5 du clavier,
  • Choisir une table avec la liste déroulante puis cliquer sur le bouton Exécuter,
Maintenant, si vous affichez le contenu du sous dossier exports, vous notez effectivement la présence d'un nouveau venu. Il s'agit du fichier Csv fraîchement créé par notre application VBA Access.

Exporter les données de table Access au format Csv par le code VBA

Si vous double cliquez sur ce fichier, il s'ouvre automatiquement dans Excel. Et comme vous pouvez l'apprécier, les données exportées y apparaissent parfaitement structurées. Chaque valeur de champ est inscrite dans une colonne différente. Certes, il convient d'élargir quelque peu ces dernières pour y voir plus clair.

Exporter et ouvrir les données de la table Access dans une feuille Excel



Bien sûr, si vous choisissez une autre table depuis le formulaire Access et que vous validez l'exportation, c'est un nouveau fichier Csv parfaitement conforme qui est créé.

Dans le prochain volet, nous poursuivrons ces travaux pour montrer comment commander automatiquement l'ouverture du fichier Csv dans Excel, juste après l'exportation.

Le code VBA Access complet que nous avons construit est le suivant :

Private Sub exporter_Click()
Dim base As Database: Dim enr As Recordset
Dim nomTable As String: Dim ligne As String
Dim nomF As String: Dim memLibre As Integer

If (Questionnaire.Value <> "") Then
nomTable = Questionnaire.Value

nomF = CurrentProject.Path & "\exports\" & LCase(Replace(nomTable, " ", "-")) & ".csv"
memLibre = FreeFile

Set base = CurrentDb()
Set enr = base.OpenRecordset(nomTable)
ligne = "QUESTION; choix1; choix2; choix3; choix4; REPONSES; réponse; image"

Open nomF For Output As #memLibre
Print #memLibre, ligne
If (enr.RecordCount <> 0) Then
enr.MoveFirst
Do
ligne = enr.Fields("QUESTION").Value & ";" & enr.Fields("choix1").Value & ";" & enr.Fields("choix2").Value & ";" & enr.Fields("choix3").Value & ";" & enr.Fields("choix4").Value & ";" & enr.Fields("REPONSES").Value & ";" & enr.Fields("réponse").Value & ";" & enr.Fields("image").Value
Print #memLibre, ligne
enr.MoveNext
Loop Until enr.EOF
End If
Close #memLibre

enr.Close
base.Close
Set base = Nothing
Set enr = Nothing
End If
End Sub


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn