formateur informatique

Décompresser des fichiers téléchargés en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Décompresser des fichiers téléchargés en VBA Excel
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 :


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,
Référence Microsoft Shell dans le projet VBA Excel pour les lignes de commande DOS

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écompression du fichier téléchargé en VBA Excel

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.

 
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