Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Créer des dossiers en VBA
Nous poursuivons le perfectionnement d'une petite application. A l'occasion des volets précédents et par le biais d'un
formulaire Access , nous avons permis à l'utilisateur d'
exporter les données de tables dans un
fichier Csv . Et pour que chaque exportation n'écrase pas les données précédemment écrites, nous avions adapté la
méthode d'écriture . Dans ce nouveau volet, nous souhaitons laisser à l'utilisateur le
choix du sous-dossier dans lequel doivent se produire ces
exportations . Si ce
sous-dossier n'existe pas, il doit naturellement être créé à la volée par le
code VBA Access .
Base de données Access à télécharger
Pour la mise en place de cette astuce, il est opportun d'appuyer l'étude sur les travaux aboutis à l'occasion des volets précédents.
En consultant le
volet de navigation sur la gauche de l'écran, vous constatez que nous retrouvons les
quatre tables et le
formulaire du volet précédent. Ces tables sont toutes structurées de la même façon. Elles embarquent des enregistrements qui se suivent et qu'il convient de
consolider dans un
fichier externe unique .
Dans le volet de navigation , double cliquer sur le formulaire fExport pour l'exécuter,
Une
liste déroulante se charge automatiquement des
noms des tables présentes dans cette
base de données . L'utilisateur n'a plus qu'à choisir l'une d'entre elles et à cliquer sur le
bouton Exporter pour procéder à l'
extraction CSV des données , potentiellement à la suite d'une précédente exportation de table. La nouveauté réside dans la présence d'une
zone de texte au-dessus des boutons. Pour information, elle porte le nom
sDossier . L'opérateur doit y indiquer le
nom du sous dossier local dans lequel doit être produite cette
extraction . Il est donc libre d'organiser les exportations à sa guise. Et c'est précisément ce bout de
code VBA qui manque pour parfaire cette solution.
La procédure d'extraction
Pour débuter, nous proposons d'accéder à la
procédure de code existante et attachée au
bouton Exporter . C'est elle qui réalise déjà l'
exportation CSV des données de la table choisie. Mais pour l'instant, cette extraction se fait sur un emplacement absolument statique.
Dans le 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 situé à droite de son événement Au clic ,
De fait, nous basculons dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle exporter_Click . Le
code VBA accède aux enregistrements de la table définie. Il ouvre l'
accès en écriture (For Append) à un
fichier CSV (consolidation.csv), placé statiquement dans un
sous dossier nommé
export . C'est cela que nous devons adapter. Pour chaque enregistrement passé en revue, il reconstruit les informations de tous ses champs, séparées par des délimiteurs (;) pour exporter ces enregistrements reconstitués les uns en dessous des autres, dans ce format universel de communication.
La variable du nom de dossier
Nous devons donc tout d'abord
déclarer une variable pour réceptionner le
nom de dossier choisi par l'utilisateur par le biais de la
zone de texte qui rappelons-le, se nomme
sDossier .
Dans la partie déclarative de la procédure, ajouter la déclaration suivante :
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 nomD As String
If (listeTables.Value <> "") Then
...
Avant d'affecter cette variable, nous devons déjà nous assurer que l'utilisateur a bien renseigné un
nom de dossier . Donc tout le traitement existant doit désormais être encapsulé dans une
instruction conditionnelle à imbriquer elle-même dans celle qui teste si l'utilisateur a bien choisi un nom de table avec la liste déroulante.
Dans la première condition, avant l'affectation de la variable nomF, créer le critère suivant :
...
Dim nomF As String: Dim nomD As String
If (listeTables.Value <> "") Then
nomTable = listeTables.Value
If (sDossier <> "") Then
nomF = CurrentProject.Path & "\export\consolidation.csv"
...
Il s'agit d'une ébauche car cette instruction doit être bornée. Cette instruction vérifie simplement que l'utilisateur a bien renseigné un nom de dossier (sDossier <> ""). Le cas échéant en effet, il n'est pas nécessaire de poursuivre le traitement. Et ce que nous devons indiquer désormais.
A la fin du code et avant le End If , ajouter la branche contraire comme suit :
...
enr.Close
base.Close
Set base = Nothing
Set enr = Nothing
Else
MsgBox "Vous devez spécifier un nom de sous dossier pour l'exportation!", vbCritical
End If
End If
End Sub
Si aucun nom de dossier n'est renseigné, le traitement est avorté et l'utilisateur en est informé grâce à un message explicite par le biais de la
fonction VBA MsgBox .
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
Exécuter ce dernier avec la touche F5 du clavier ,
Choisir une table avec la liste déroulante puis cliquer sur le bouton Exporter ,
En l'absence de nom de dossier, c'est la
branche Else de la
seconde instruction conditionnelle qui se déclenche. En conséquence, le traitement pour l'
exportation des données est ignoré et le code est terminé.
Le chemin d'accès au dossier
Nous le savons, c'est la
propriété Path de l'
objet CurrentProject qui renvoie le
chemin d'accès au dossier de l'application . Si la
zone sDossier n'est pas vide, nous devons lui concaténer le
nom du dossier mentionné par l'utilisateur.
Dans les bornes de la nouvelle instruction conditionnelle, ajouter l'affectation suivante :
...
nomTable = listeTables.Value
If (sDossier <> "") Then
nomD = CurrentProject.Path & "\" & sDossier & "\"
nomF = CurrentProject.Path & "\export\consolidation.csv"
...
Les antislashs sont très importants pour entrer dans le sous dossier.
Vérifier si le dossier existe
Si ce sous dossier existe, il doit être exploité pour y procéder à l'
exportation des données de tables au
format Csv . S'il n'existe pas, il doit d'abord être créé. Et ce sont des
instructions et
fonctions empruntées au
DOS que nous allons utiliser pour tester l'existence du dossier dans un premier temps et le créer le cas échéant.
Juste en-dessous de l'affectation précédente, ajouter l'instruction conditionnelle suivante :
...
If (sDossier <> "") Then
nomD = CurrentProject.Path & "\" & sDossier & "\"
If Dir(nomD, vbDirectory) = vbNullString Then
MkDir nomD
End If
nomF = CurrentProject.Path & "\export\consolidation.csv"
...
Grâce à la
fonction Dir et à son second paramètre
vbDirectory , nous testons si le dossier passé en premier argument (nomD) n'existe pas (vbNullString). Dans ces conditions, nous engageons la
commande MkDir sur ce
nom de dossier pour le créer. Dans le cas contraire, nous considérons qu'il existe déjà et nous l'exploiterons naturellement.
Le chemin de l'exportation
Il ne nous reste plus qu'Ã adapter le
chemin du fichier pour l'
exportation dans la
variable nomF . Cette exportation ne doit plus se produire dans le sous dossier fixe nommé export. Elle doit tenir compte du
nom du sous dossier indiqué par l'utilisateur et potentiellement fraîchement créé par le
code VBA Access .
Adapter l'affectation de la variable nomF comme suit :
...
nomF = nomD & "consolidation.csv"
...
Exporter dans un nouveau sous dossier
Il est désormais temps de tester cette exportation et consolidation des données dans un sous dossier défini à la volée par l'utilisateur.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
Avec la liste déroulante, choisir la table societes1 ,
Dans la zone de texte, saisir par exemple le nom de sous-dossier suivant : archives ,
Puis, cliquer sur le bouton Exporter ,
Aucune alerte ne surgit semblant confirmer que l'exportation dans le nouveau dossier s'est convenablement réalisée.
Effectivement, si vous accédez au dossier de décompression dans l'explorateur Windows, vous notez la présence du
nouveau sous-dossier . Si vous l'ouvrez, vous remarquez la présence du
fichier Csv d'exportation . Et si vous l'éditez, vous constatez que tous les enregistrements de la première table y figurent bien. Chaque donnée de champ est séparée d'une autre par un délimiteur, ici le point-virgule (;) en l'occurrence. Enfin, si vous exportez les données d'une autre table depuis le
formulaire Access , vous avez le plaisir de constater que ses informations sont ajoutées à la
suite des précédentes dans le
fichier d'exportation CSV .