Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Décompresser des fichiers en VBA
Dans ce nouveau volet, nous poursuivons la conception d'une petite
application pour récolter et analyser les
numéros du loto . Dans le précédent et premier volet, nous avons appris Ã
automatiser le téléchargement de
fichiers issus du Web . C'est ainsi que nous avons récolté un
fichier compressé hébergeant le
fichier Csv des
numéros du loto , régulièrement mis à jour. Dans cette nouvelle étape, consécutivement au
téléchargement , nous devons être en mesure de
décompresser automatiquement le fichier récolté. C'est ainsi, de fil en aiguille, que nous pourrons accéder à son contenu pour rapatrier les informations utiles sur la feuille du classeur.
Classeur Excel à télécharger
Pour poursuivre le développement de l'application, il convient tout d'abord de récupérer les travaux du volet précédent.
Comme vous le voyez, le
classeur est accompagné d'un sous dossier nommé
tirages et d'un
fichier texte . Ce dernier héberge le
code VBA réalisant le
téléchargement . C'est pour éviter la neutralisation de ce classeur par les antivirus que nous avons détaché le code dans un fichier inoffensif. Certes les antivirus se trompent mais ils sont suspicieux.
Double cliquer sur le fichier réceptionné pour l'ouvrir dans Excel ,
Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Nous retrouvons bien la feuille du volet précédent avec la grille destinée à accueillir les numéros des lotos à récolter. En haut à droite, vous notez de même la présence d'un
bouton intitulé
Actualiser . C'est lui que nous avons déjà commencé à développer pour
télécharger le fichier compressé depuis le site de la française des jeux.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Y coller le code de la procédure actualiser_Click depuis le fichier texte,
Procédure de décompression
Pour décomposer les différentes parties de ces développements et pour une meilleure structuration, nous proposons de développer le
code VBA de décompression dans une autre procédure. Mais celle-ci devra être appelée par la première (actualiser_Click), juste après le téléchargement finalisé. C'est ainsi que les différentes parties pourront s'articuler facilement.
Sous la procédure actualiser_Click , créer la procédure decompresser , comme suit :
Sub decompresser(cheminFichier As String, dossier As String)
Dim source As FolderItems
Dim commande As Shell
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
End Sub
Nous la signons avec deux paramètres en attente. Ils sont tous deux typés comme des textes (As String). Le premier représente le chemin d'accès complet au fichier compressé téléchargé. Le second représente le chemin d'accès jusqu'au dossier qui l'héberge. Ensuite, nous déclarons un objet (source) typé comme un
folderItems . Il doit représenter tous les éléments contenus dans un dossier. En réalité ici, il s'agit de tous les éléments hébergés par le fichier compressé. Puis, nous déclarons un autre objet (commande) que nous typons comme un
objet de type Shell . Son rôle est d'instancier la classe permettant d'exécuter des commandes Windows, ancestralement DOS pour manipuler les fichiers et dossiers, organiser des copies et déplacements, etc... Et précisément, nous déclarons enfin
trois variables objets que nous exploiterons pour manipuler les fichiers dans les dossiers, plus précisément le fichier Csv issu de la décompression.
Microsoft Shell Controls
Cependant, pour que les deux premiers objets puissent exécuter des lignes de commande Windows, une référence doit être impérativement ajoutée au projet.
En haut de l'éditeur, cliquer sur le menu Outils ,
Dans les propositions, choisir l'option Références ,
Dans la boîte de dialogue, cocher la case Microsoft Shell Controls And Automation ,
C'est elle qui doit permettre à notre
objet commande d'
instancier la classe pour exécuter des
lignes de commande Windows , soit des actions bien spécifiques sur le système, le disque dur et les éléments qui le composent.
Cliquer sur le bouton Ok pour valider l'ajout de cette référence ,
Manipuler les fichiers et dossiers
Avant d'entrer dans le vif du sujet de la
décompression , nous avons besoin d'instancier la classe permettant de manipuler les fichiers et les dossiers du disque, grâce notamment à deux des trois dernières variables objets que nous avons déclarées. L'utilisateur est susceptible de
télécharger et de
décompresser le
fichier distant régulièrement pour jouir de toutes les mises à jour réalisées à la suite des trois tirages effectués hebdomadairement. Mais un problème se pose. La décompression va livrer un fichier du même nom que le précédent déjà décompressé et toujours en vigueur dans le sous dossier. Donc, une alerte indésirable va se déclencher. Pour la court-circuiter, nous devons préalablement supprimer ce précédent fichier décompressé.
A la suite du code de la procédure, ajouter les instructions VBA suivantes :
...
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.GetFolder(dossier)
If Dir(dossier & "loto.csv") <> "" Then
Kill dossier & "loto.csv"
End If
...
Grâce à la désormais très connue
fonction VBA CreateObject , nous instancions la classe (scripting.filesystemobject) permettant de manipuler les fichiers et dossiers du système. Notre
objet objetFichier ainsi affecté hérite des propriétés et méthodes nécessaires. Et pour preuve dans l'enchaînement, nous exploitons sa
méthode héritée GetFolder pour pointer sur le sous dossier de la décompression (passé en paramètre de la fonction). C'est ainsi que notre
objet leDossier initialisé de cette manière, hérite lui aussi des propriétés et méthodes pour manipuler précisément ce sous dossier. Nous exploiterons plus tard sa
collection Files pour parcourir les fichiers qu'il contient afin de renommer le fichier de l'extraction. Nous le verrons en temps voulu.
Mais en attendant et indépendamment, grâce à la référence ajoutée au projet, nous déclenchons la
commande Dir pour pointer sur le précédent potentiel
fichier Csv décompressé . S'il existe (<>""), nous enclenchons la
commande Dos Kill pour le supprimer et laisser la place à la nouvelle décompression à venir.
La classe des commandes Dos
Grâce à la référence ajoutée au projet, certaines
commandes Dos sont directement disponibles, comme celles que nous venons d'exploiter. D'autres plus complexes, notamment pour extraire tous les éléments compris dans un fichier compressé, nécessitent que toutes les librairies attenantes soient chargées. C'est la raison pour laquelle, nous devons maintenant
instancier cette classe afin de rapatrier toutes ses propriétés et méthodes, sans exception.
A la suite du code, ajouter les deux instructions VBA suivantes :
...
Set commande = CreateObject("Shell.Application")
Set source = commande.Namespace(cheminFichier).Items
...
Grâce à l'incontournable
fonction VBA CreateObject et à son
argument Shell.Application , nous instancions donc cette fameuse classe. Dès lors, la
collection héritée Namespace de cet objet permet de pointer sur le fichier compressé (cheminFichier). C'est ainsi que sa
collection enfants Items retourne tous les éléments qu'il contient, dans la
variable objet source .
Extraire les éléments du fichier compressé
Maintenant pour réaliser l'
extraction des éléments du
fichier compressé , ici du
fichier Csv , il s'agit d'utiliser de nouveau la
collection Namespace mais en la faisant cette fois pointer sur le
sous dossier tirages . Et rappelez-vous, ce chemin est mémorisé dans la
variable dossier passé en paramètre de la procédure.
A la suite du code, ajouter l'instruction VBA suivante :
...
commande.Namespace(dossier).CopyHere source
...
Grâce à la
méthode CopyHere , nous déposons tous les éléments embarqués dans l'
objet source . Il s'agit bien sûr des fichiers et dossiers du
fichier compressé . Dans notre cas, nous réalisons l'
extraction du fichier csv .
Renommer le fichier CSV
Nous en avons terminé. Pourtant, nous proposons d'aller plus loin en maîtrisant parfaitement l'extraction. Nous souhaitons attribuer un nom précis au fichier extrait. Ainsi, nous pourrons le piloter sans souci dans les développements qui suivront. Nous partons du principe que nous ne connaissons pas le nom qui lui a été donné à l'origine. L'idée consiste donc Ã
parcourir tous les fichiers du
sous dossier tirages . Si un
fichier Csv est rencontré, alors il doit être renommé. Il est donc question d'enclencher une
boucle For Each .
Toujours à la suite du code VBA, créer la boucle For Each comme suit :
...
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier, 4) = ".csv") Then
Name dossier & chaqueFichier.Name As dossier & "loto.csv"
End If
Next chaqueFichier
...
Nous engageons la
boucle For Each sur notre
objet chaqueFichier . Grâce à la
collection Files de notre
objet leDossier , nous les parcourons tous. A chaque passage dans cette boucle, donc pour chaque fichier du dossier, nous testons l'
extension de celui qui est en cours d'analyse. S'il s'agit bien d'un
fichier Csv , nous exploitons la
commande Name , pour le renommer (As) en tenant compte du chemin complet (dossier) associé au nouveau nom (loto.csv).
Décharger les objets de programmation
Il nous reste encore deux actions à entreprendre. La première consiste à décharger les objets qui ne sont dès lors plus utilisés, pour les libérer de la mémoire.
Après la boucle For Each, ajouter les instructions VBA suivantes :
...
Set commande = Nothing
Set source = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
Set chaqueFichier = Nothing
...
C'est en les réinitialisant (Set) à Nothing que nous les détruisons tous tour à tour.
La seconde action consiste à appeler le traitement de cette procédure à la fin de celui organisé par la
procédure actualiser_Click . C'est ainsi que la décompression suivra naturellement le téléchargement.
A la fin du If de la procédure actualiser_Click, réaliser l'appel comme suit :
...
If requeteHttp.Status = 200 Then
Set flux = CreateObject("ADODB.Stream")
flux.Open
flux.Type = 1
flux.Write requeteHttp.responseBody
flux.SaveToFile chemin, 2
flux.Close
decompresser chemin, ThisWorkbook.Path & "\tirages\"
Else
MsgBox "Une erreur est survenue"
End If
...
Enregistrer les modifications (CTRL + S) et revenir sur la feuille Excel (ALT + Tab),
Cliquer alors sur le bouton Actualiser en haut à droite de la feuille,
Si une erreur survient, il convient de cliquer de nouveau sur ce bouton. Nous en avions expliqué les potentielles causes dans le volet précédent. Nous avions de même évoqué la possibilité d'ajouter un gestionnaire d'erreur pour relancer la demande en cas d'échec et ainsi la faire aboutir à tous les coups.
Désormais, si vous ouvrez le sous dossier tirages dans l'explorateur Windows, vous notez la présence non seulement du
fichier compressé téléchargé mais aussi de son
fichier Csv extrait et renommé . Dans le prochain volet, nous verrons comment organiser l'
importation sélective des données de ce
fichier Csv , dans la
grille de la feuille Excel .