Un fichier ZIP est un fichier qui contient un ou plusieurs fichiers compressés ; la compression de fichiers permettant de réduire le volume des données avant leur transmission ou stockage. La décompression des fichiers ZIP est l’étape indispensable pour retrouver les fichiers dans leur forme originelle avant de pouvoir les exploiter.
En présence de nombreux fichiers ZIP (à l’image des FEC extraits à partir de la nouvelle version de DCSnet), leur décompression gagne à être automatisée. C’est ce que proposent les deux macros VBA ci-après. Le classeur Excel comprenant les deux macros est téléchargeable en bas de cet article.
Le première macro passe en revue tous les fichiers (à l’aide de la boucle Do While… Loop) d’un dossier (désigné par la variable Dossier_Source renvoyant ici vers le dossier Z:\ZIP FEC). Dès lors qu’un fichier ZIP est trouvé (identifié par le test conditionnel (If FSO.GetExtensionName(Dossier_Source & “\” & NomFichierZIP) = “ZIP” Then), il est décompressé grâce à la méthode .CopyHere de l’objet Namespace vers le dossier indiqué par la variable Dossier_Cible (ici : Z:\FEC).
Option Explicit Sub Unzip() 'Définition des variables Dim FSO As Object Dim ShApp As Object '---Chemin du dossier contenant les fichiers ZIP Dim Dossier_Source As Variant '---Chemin du dossier où transférer les fichiers dézippés Dim Dossier_Cible As Variant '---Nom du fichier ZIP Dim NomFichierZIP As Variant Set ShApp = CreateObject("shell.application") Set FSO = CreateObject("scripting.filesystemobject") 'Définition du dossier contenant des fichiers ZIP Dossier_Source = "Z:\ZIP FEC" 'Définition du dossier destination Dossier_Cible = "Z:\FEC" NomFichierZIP = Dir(Dossier_Source & "\") Do While NomFichierZIP <> "" If FSO.GetExtensionName(Dossier_Source & "\" & NomFichierZIP) = "ZIP" Then ShApp.Namespace(Dossier_Cible & "\").CopyHere ShApp.Namespace(Dossier_Source & "\" & NomFichierZIP).Items End If NomFichierZIP = Dir Loop End Sub
Cette deuxième macro remplit la même fonction que la précédente à la différence près que le contenu des variables Dossier_Source et Dossier_Cible est défini en dur dans le code source de la première (Dossier_Source = “..”) et sur sélection de l’utilisateur dans la seconde.
Dans ce deuxième code source, la définition des sources et cibles s’opère avec la commande FileDialog. Celle-ci s’utilise en deux temps :
- Création de l’objet FDialog (nom au choix du programmeur) : Set FDialog = Application.FileDialog(msoFileDialogFolderPicker)
Le paramètre de FileDialog, ici msoFileDialogFolderPicker indique que l’utilisateur doit sélectionner un dossier (Folder en anglais). La valeur msoFileDialogFilePicker demanderait à l’utilisateur de sélectionner un fichier (File).
- Dossier_Source = FDialog.SelectedItems.
La variable Dossier_Source prend la valeur du dossier sélectionné par l’utilisateur.
La commande FileDialog ouvre la fenêtre suivante :
La fenêtre de dialogue est personnalisable. Exemples de personnalisation :
- FDialog.InitialFileName = “C:\” : le dossier par défaut est C:\
- FDialog.Title = “Sélectionnez le dossier cible où extraire le contenu du(des) fichier(s) ZIP” : définit le titre de la fenêtre de dialogue.
Code source :
Sub Unzip_FileDialog() 'Définition des variables Dim FDialog As FileDialog Dim FSO As Object Dim ShApp As Object '---Chemin du dossier contenant les fichiers ZIP Dim Dossier_Source As Variant '---Chemin du dossier où transférer les fichiers dézippés Dim Dossier_Cible As Variant '---Nom du fichier ZIP Dim NomFichierZIP As Variant Set ShApp = CreateObject("shell.application") Set FSO = CreateObject("scripting.filesystemobject") Set FDialog = Application.FileDialog(msoFileDialogFolderPicker) 'Définition du dossier contenant des fichiers ZIP With FDialog FDialog.InitialFileName = "C:\" FDialog.Title = "Sélectionnez le dossier source contenant le(s) fichier(s) ZIP" If FDialog.Show Then Dossier_Source = FDialog.SelectedItems(1) Else Exit Sub End If End With 'Définition du dossier destination With FDialog FDialog.InitialFileName = "C:\" FDialog.Title = "Sélectionnez le dossier cible où extraire le contenu du(des) fichier(s) ZIP" If FDialog.Show Then Dossier_Cible = FDialog.SelectedItems(1) Else Exit Sub End If End With NomFichierZIP = Dir(Dossier_Source & "\") Do While NomFichierZIP <> "" If FSO.GetExtensionName(Dossier_Source & "\" & NomFichierZIP) = "ZIP" Then ShApp.Namespace(Dossier_Cible & "\").CopyHere ShApp.Namespace(Dossier_Source & "\" & NomFichierZIP).Items End If NomFichierZIP = Dir Loop End Sub
___
Pour approfondir le sujet : Analyse de données / Automatisation & productivité / VBA
Derniers articles parBenoît RIVIERE (voir tous)
- Projet IXP (v1.21beta) : nouvelle version en ligne - mardi 7 janvier 2025
- Excel : conserver les zéros non significatifs à gauche - dimanche 5 janvier 2025
- Excellente année 2025 ! - mercredi 1 janvier 2025
- Projet IXP (v1.21beta) : contrôles de cohérences et gestion MULTIFEC - lundi 30 décembre 2024
- Joyeuses fêtes de fin d’année ! - mardi 24 décembre 2024