Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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,
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 .
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.
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