Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Lire le contenu des fichiers
Avec les travaux du volet précédent, nous avons appris Ã
parcourir les fichiers d'un dossier pour restituer leurs noms dans une zone de liste placée sur un
formulaire Access. Avec ce nouveau volet, nous allons apprendre à accéder à leurs contenus respectifs.
Sur l'exemple illustré par la capture, l'utilisateur clique sur un bouton matérialisé par l'icône d'un dossier. Dans la boîte de dialogue qui suit, il désigne un
dossier du disque et valide par Ok. Tous les
noms des fichiers textes présents dans ce
dossier sont alors restitués dans une zone de liste, placée sur la gauche du bouton. Il définit un système d'encodage grâce à une case d'option. Il clique sur l'un des
noms de fichier. Et aussitôt son contenu est intégralement restitué dans une zone de texte multiligne sur la gauche du
formulaire Access.
Base de données Access à télécharger
Pour démontrer le cas, nous suggérons d'appuyer l'étude sur les travaux du volet précédent.
La décompression livre le
fichier de la base de données accompagné d'un fichier texte et de deux sous dossiers. Les sous dossiers hébergent des fichiers textes à importer par le
code VBA Access. Ils sont encodés différemment. Le fichier texte à la racine, abrite un
code VBA usuel pour réaliser la
lecture du contenu des fichiers. Grâce à lui, nous comprendrons dans un second temps l'importance du
système d'encodage pour
gérer les accents à l'importation.
- Double cliquer sur le fichier lire-fichiers.accdb pour l'ouvrir dans Access,
- Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
- Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fParcourir,
Ainsi nous l'exécutons et nous retrouvons bien le formulaire du volet précédent.
- En haut à droite du formulaire, cliquer sur le bouton à l'icône du dossier,
- Dans la boîte de dialogue, pointer dans un des sous-dossiers téléchargés,
- Puis, valider par le bouton Ok,
Comme vous pouvez l'apprécier, la liste de tous les
noms de fichiers textes contenus dans ce sous dossier est parfaitement reconstruite dans la
zone de liste. Mais à ce stade, bien entendu, si vous cliquez sur l'un de ces noms, aucun contenu n'est encore restitué dans la zone de texte multiligne.
Code VBA au clic sur un fichier
Pour débuter, nous devons commencer par créer la
procédure de code VBA qui se déclenchera
au clic sur un élément de la
zone de liste.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans la liste, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur la zone de liste pour la sélectionner,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
- 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 Ok,
Nous basculons ainsi dans l'
éditeur VBA Access entre les bornes de la
procédure événementielle listeFichiers_Click. Son code se déclenchera donc au clic sur un élément de la
zone de liste nommée
listeFichiers. Au passage, vous appréciez la présence du code du volet précédent, dans la
procédure parcourir_Click. Le
bouton Parcourir est celui matérialisé par l'icône du dossier.
La déclaration des variables
Maintenant, nous avons besoin de variables mais aussi d'un objet pour piloter les fichiers du système.
- Dans les bornes de la procédure, ajouter les déclarations suivantes :
Private Sub listeFichiers_Click()
Dim pos As Byte: Dim nomF As String
Dim fichier As String: Dim texte As String
Dim encod As String: Dim objFlux
End Sub
Pour récupérer le nom du fichier cliqué, nous avons besoin de connaître la position de l'élément désigné dans la zone de liste. C'est l'utilité de la
variable pos déclarée comme un entier court. Nous exploiterons ensuite le nom ainsi récolté pour reconstruire le
chemin d'accès complet avec la
variable nomF, dans la
variable fichier, toutes deux déclarées fort naturellement comme des textes (As String). Le contenu récupéré sera stocké dans la
variable texte. Le
système d'encodage cliqué pour l'importation, sera transmis à la
variable encod. Enfin, la
variable objFlux prendra son type au moment de l'instanciation de la classe permettant de manipuler les fichiers.
Certaines variables peuvent d'ores et déjà être initialisées.
- A la suite du code, créer les affectations suivantes :
...
contenu.Value = ""
pos = listeFichiers.ListIndex
nomF = listeFichiers.ItemData(pos)
fichier = acces.Value & "\" & nomF
...
La
zone de texte multiligne se nomme
contenu. Nous vidons son contenu avant chaque nouvelle importation. Grâce à la
propriété ListIndex de l'
objet zone de liste, nous récupérons la
position de l'élément cliqué. Nous exploitons cette position en argument de sa
propriété ItemData pour récolter le texte qu'il renferme. Il s'agit du
nom du fichier que nous stockons dans la
variable nomF. Nous récupérons le
chemin d'accès au dossier, mémorisé dans la zone de texte horizontale supérieure, nommée
acces. Et nous l'associons au
nom du fichier pour reconstruire le
chemin complet. C'est ainsi que nous pourrons parvenir à accéder au
contenu du fichier cliqué.
Importation des contenus de fichiers
Puisque nous détenons désormais toutes les informations utiles, il est temps de les exploiter pour procéder à la récupération des contenus des fichiers cliqués par l'utilisateur. Et nous proposons dans un premier temps de recourir à la méthode usuelle d'accès séquentiel aux fichiers.
- A la racine du dossier de décompression, double cliquer sur le fichier texte pour l'ouvrir,
- Sélectionner tout le code VBA (CTRL + A) et le copier (CTRL + C),
- Revenir dans l'éditeur VBA Access et le coller (CTRL + V) à la suite du code précédent,
...
Open fichier For Input As #1
Do While Not EOF(1)
Line Input #1, texte
contenu.Value = contenu.Value & texte
Loop
Close #1
...
Cette méthode d'accès classique, nous l'avons largement expliquée notamment dans la
formation VBA Excel pour importer et exporter des données. Nous ouvrons un accès au fichier en mémoire. Nous parcourons toutes ses lignes grâce à une
boucle Do While. Nous les ajoutons tour à tour à la suite dans la zone de texte multiligne.
- Enregistrer les modifications (CTRL + S) et revenir sur le formulaire Access (Alt + Tab),
- L'exécuter avec la touche F5 du clavier,
- Cliquer sur le bouton à l'icône du dossier,
- Avec la boîte de dialogue, ouvrir le sous dossier 11-fonction-excel-decaler,
- Valider avec le bouton Ok,
- De retour sur le formulaire, cliquer sur l'un des noms de fichier récoltés,
Comme vous pouvez l'apprécier, l'intégralité de son contenu est effectivement importé dans la zone de texte multiligne sur la gauche du formulaire.
- Cliquer de nouveau sur le bouton à l'icône du dossier,
- Avec la boîte de dialogue, ouvrir cette fois le sous dossier 12-fonction-excel-indirect,
- Valider par Ok pour revenir sur le formulaire,
- Puis, cliquer sur l'un des noms de fichier dans la zone de liste,
Là encore, le contenu est importé mais des problèmes surgissent cette fois. Le système d'encodage n'étant pas géré, les accents sont mal retranscrits.
Le système d'encodage
Nous devons donc gérer ces différents
systèmes d'encodage. Ils sont désignés par les cases d'option sous les boutons. Il peut s'agir du
système iso-8859-1 ou du
système utf-8.
- Revenir dans l'éditeur VBA Access,
- Passer les précédentes lignes de l'importation en commentaires,
Il suffit de les préfixer d'une apostrophe. Il existe un bouton dédié dans une barre d'outils en haut de l'éditeur.
...
If encodage.Value = 1 Then
encod = "iso-8859-1"
Else
encod = "utf-8"
End If
...
Très simplement, en fonction de la case cochée, nous mémorisons le système d'encodage associé qu'il va maintenant s'agir d'exploiter.
Instancier la classe des flux de fichiers
Pour cette gestion, il est question maintenant d'
instancier une classe bien précise.
- A la suite du code VBA, ajouter les instructions suivantes :
...
Set objFlux = CreateObject("ADODB.Stream")
objFlux.Charset = encod
objFlux.Open
objFlux.LoadFromFile (fichier)
texte = objFlux.ReadText()
contenu.Value = texte
set objFlux = nothing
...
Grâce à la
fonction CreateObject et le
paramètre ADODB.Stream, nous instancions la classe permettant de gérer les flux de données dans les fichiers. De fait, l'
objet objFlux hérite des propriétés et méthodes pour les piloter. Avant d'accéder au contenu, sa désormais
propriété Charset permet de fixer le
système d'encodage à utiliser. Avec le chemin d'accès (fichier) passé en argument de sa
méthode LoadFromFile, nous le chargeons en mémoire. Dès lors, sa
méthode ReadText récupère l'intégralité de son contenu que nous stockons dans la
variable texte. Enfin, nous exploitons cette variable pour charger ce contenu dans la zone de texte multiligne nommée
contenu. Certes, nous aurions pu éviter l'étape intermédiaire de la variable. Enfin, puisque le travail est terminé et que cet objet n'est plus utilisé, nous le détruisons (set objFlux = nothing) pour libérer la mémoire.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
- Cocher la case UTF et cliquer sur un fichier dans la zone de liste,
Cette fois et comme vous pouvez l'apprécier, les accents sont correctement gérés à l'importation du contenu du fichier.
- Cliquer de nouveau sur le bouton à l'icône du dossier,
- Ouvrir le sous dossier 11-fonction-excel-decaler et valider par ok,
- Cliquer sur un nom de fichier dans la zone de liste,
Cette fois c'est l'interprétation inverse qui est mal réalisée. Les accents qui étaient bien transcrits ne le sont plus.
- Cocher la case ISO et recliquer sur ce même nom de fichier,
Comme vous pouvez le voir, tout rentre dans l'ordre. Tout est une question de système d'encodage que nous savons désormais gérer pour procéder à l'importation du contenu des fichiers de type texte.