Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

zip And unzip des éléments d'un fichier de type zip y compris les fichiers Excelavec la commande (TAR)

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
zipper et dézipper les fichiers de type zip
y compris les fichiers Excel
avec la command "tar"en ligne de commande et piloté par VBA
disponible depuis windows10 V1803

Bonjour à tous
aujourd'hui on va parler de la commande tar de windows
et je vais vous proposer des exemple concrêts sous la forme de fonctions génériques

Important à savoir

MéthodeInclus dans WindowsFacile à installerNotes
Windows 10 ≥1803 / Windows 11✅ Ouitar disponible nativement
Git for Windows❌ Non, dépend de Git✅ FacileAccessible depuis CMD si configuré
WSL❌ Non, dépend de WSL⚠ MoyenTout Linux est disponible, mais commandes WSL dans CMD nécessitent wsl


[

Nb: Vous me direz mais pourquoi n'utilise tu pas l'object shell.application(disponible dans l'environnement VBA)

<<la commande tar>>
les parmètres:
-x Extract – extrait des fichiers ou dossiers d’une archive
tar -xf "monClasseur.xlsm"
-O Stdout – redirige le contenu d’un fichier extrait vers la sortie standard (utile pour rediriger vers un fichier local)
tar -xOf "monClasseur.xlsm" customUI/customUI14.xml > "exemple.xml"
-f File – spécifie le nom de l’archive à traiter
tar -xf "monClasseur.xlsm"
-C Change Directory – permet d’extraire dans un dossier cible spécifique
tar -xf "monClasseur.xlsm" -C "C:\MesProjets"
-t List – affiche le contenu de l’archive sans extraire
tar -tf "monClasseur.xlsm"
-a Auto-compress – crée une archive ZIP si l’extension du fichier de sortie est .zip
tar -a -cf "monArchive.zip" -C "C:\Source" "fichier.txt"
-c Create – crée une archive
tar -a -cf "monArchive.zip" ...
-r Append – ajoute à une archive existante (attention : fonctionne mal avec tar sur certaines versions Windows)on ne l'utilisera pas ici
tar -rf "monArchive.zip" -C "C:\Source" "fichier.txt"
--exclude Exclut certains fichiers/dossiers lors de l’archivage
tar -cf "monArchive.zip" --exclude="*.tmp" ...

Notes spécifiques à Windows et à notre usage VBA


O + > est pratique pour extraire un fichier précis directement dans un fichier local.

-C est obligatoire pour extraire un dossier dans un chemin précis, mais on ne peut pas changer le chemin du contenu interne directement (par ex. extraire customUI/images dans C:\MonProjet\images nécessite un déplacement après extraction).

Mode append (-r) fonctionne rarement avec les ZIP créés par -a, donc il vaut mieux recréer l’archive si on ajoute des fichiers.

Les chemins sous forme relative sont à respecter (mondossier/sousdossier) ; tar conserve la hiérarchie interne.
tar extraira mondossier avec son sous dossier tar ne sais pas dissocier et rediriger le sous dossier vers une destination



les shemas

1°️ Extraire un fichier précis depuis une archive Excel (.xlsm)dans une endroit precis

Commande :

tar -xOf "c:\monClasseur.xlsm" customUI/customUI14.xml > "c:\un_dossier\monfichier.xml"
tar -xOf "chemin source " arborescence du fichier dans le zip > "chemin de destination(fullname"

Archive: monClasseur.xlsm
└─ customUI/
- └─ customUI14.xml ---> extrait vers "c:\un_dossier\exemple.xml"

Explication :
-x : extract
-O : redirige vers stdout
-f : spécifie l’archive
> : redirige et enregistre dans un fichier local "precisé juste après"


2° Extraire un dossier (ex : customUI/images) vers un dossier local

Commande :

tar -xf "monClasseur.xlsm" -C "C:\MesProjets" customUI/images/
tar -xf "monClasseur.xlsm" -C "destination" arborescence dans le zip
Explication :
-C : change directory, extrait dans ce dossier
Important : tar conserve la hiérarchie interne (customUI/images) → pour déplacer images à la racinede la destination
on utilise ensuite FSO ou tout autres outils dispo dans votre envirronnement VBA

3° Extraire tout le contenu de l’archive

Commande :

tar -xf "monClasseur.xlsm" -C "C:\MesProjets\mon dossier"
shemas
Archive: monClasseur.xlsm
- ├─ customUI/
- ├─ docProps/
- ├─ xl/
- └─ [autres fichiers] ---> tout est extrait dans "C:\MesProjets"
Explication :
-xf : extraire l’archive
-C : cible du dossier

4° Lister le contenu de l’archive (avec ou sans filtre)

Commande :

tar -tf "monClasseur.xlsm" | findstr "customUI"
Shemas:
customUI/
customUI/customUI14.xml
customUI/images/
customUI/images/logo.png
Explication :
-t : liste le contenu
-f : archive
findstr "customUI" : filtre les lignes contenant "customUI"


5° Créer une archive ZIP depuis un fichier ou dossier

Commande :

tar -a -cf "monArchive.zip" -C "C:\Source" "fichier.txt"
shemas
C:\monfichier.xlsx
└─ fichier.txt ---> archivé dans monArchive.zip
la compression est de l'ordre de (taille /3.5) ce qui est vraiment pas mal niveau better à l'echelle de 7zip et winrar
Explication :
-c : create
-a : auto-compress (crée un zip si l’extension est .zip)
-C : change directory avant ajout du fichier

limitations
Tar conserve la hiérarchie interne. Pour modifier le chemin, il faut utiliser FSO après extraction.
Mode append -r sur windows ne fonctionne pas bien → mieux vaut recréer l’archive.
La redirection > ne fonctionne que pour un fichier précisavec le paramètre (-O).
Les chemins doivent être relatifs à l’intérieur de l’archive.

assez de blabla passons au choses serieuses
quelques exemples concrêts de fonctions et subs appelantes
dans ces exemples on utilisera
l'object "Wscript.shell" pour lancer les commande avec run ou excec
bien entendu pour eviter de devoir activer la ref on le créera en dynamique avec CreateObject

'Extraction d'un fichier dans le classeur

ici deux exemples de subs appellantes dans deux endroits différents de l'arborescence de fichier dans l'archive
VB:
Sub Test_FileExtraction()
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    fichier = "customUI/customUI14.xml"
    dest = ThisWorkbook.Path & "\customUI14.xml"
    fichier = FileExtraction(fic, fichier, dest)
End Sub

Sub Test2_FileExtraction()
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    fichier = "xl/workbook.xml"
    dest = ThisWorkbook.Path & "\workbook.xml"
    fichier = FileExtraction(fic, fichier, dest)
End Sub

Function FileExtraction(Filepath, extractedFile, direction)
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "cmd /c tar -xOf """ & Filepath & """ " & extractedFile & " > """ & direction & """", 0, True
    Set objShell = Nothing
    If Dir(direction) <> "" Then FileExtraction = Destination Else FileExtraction = False
End Function

'Extraction d'un dossier avec tout son contenu (sous dossier et fichier)
VB:
Sub Test_Folder_Extraction()
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    'folder = "customUI/" 'extraction du dossier customUi et tout son contenu
    folder = "customUI/images" 'extraction du dossier customUI avec juste son dossier images
    dest = ThisWorkbook.Path
    folder = FolderExtraction(fic, folder, dest)
End Sub

Function FolderExtraction(Filepath, ExtractedFolder, direction)
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "cmd /c tar -xf """ & Filepath & """ -C """ & direction & """ " & ExtractedFolder & "/", 0, True
    Set objShell = Nothing
    If Dir(direction & "\" & Replace(ExtractedFolder, "/", "\"), vbDirectory) <> "" Then FolderExtraction = direction Else FolderExtraction = False
End Function

'Extraire le contenu tout entier d'une archive ou fichier Excel
VB:
Sub test_ExtractAllInFile()
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    ExtractAllInFile fic, ThisWorkbook.Path & "\mondossier"
End Sub

Function ExtractAllInFile(Filepath, direction)
    If Dir(direction, vbDirectory) = "" Then MkDir direction
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "tar -xf """ & Filepath & """ -C """ & direction & """", 0, True
    Set objShell = Nothing
End Function

'Lister les fichiers de l'arborescence d'une archive V1 methode exec de l'object wscript.shell
'avantage😛lus rapide
'inconvenient: aparition brève de la fenêtre DOS

VB:
Sub test_ArborescenceZipList()
    Dim x As Variant, fic As String
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    ' x = ArborescenceZipListv2(fic)'sans filtre
    ' x = ArborescenceZipListv2(fic, "customUI/") 'filtre dossier
    x = ArborescenceZipListv2(fic, "customUI") 'filtre tout ce qui contient customUI
    If IsArray(x) Then Debug.Print Join(x, vbCrLf)
End Sub

Function ArborescenceZipList(Filepath As String, Optional Filter As String = "") As Variant
    Dim objShell As Object, objExec As Object, cmdList As String, line As String, results() As String, A As Long
    Set objShell = CreateObject("WScript.Shell")
    ' concat de la commande avec ou sans filtre de dossier
    If Len(Filter) > 0 Then
        cmdList = "cmd /c tar -tf """ & Filepath & """ | findstr """ & Filter & """"
    Else
        cmdList = "cmd /c tar -tf """ & Filepath & """"
    End If
    Set objExec = objShell.exec(cmdList)
    ' Lecture des résultats
    Do While Not objExec.StdOut.AtEndOfStream
        line = objExec.StdOut.ReadLine
        A = A + 1: ReDim Preserve results(1 To A): results(A) = line
    Loop
 
    If A > 0 Then
        ArborescenceZipList = results
    Else
        ArborescenceZipList = False
    End If
End Function

'Lister les fichiers de l'arborescence d'une archive V2 methode run de l'object wscript.shell avec redirection du stdout vers un fichier temporaire
'avantage😛as d'aparition même brève de la fenêtre Dos
'inconvenient: légèrement plus long

VB:
Sub test_ArborescenceZipListv2()
    Dim x As Variant, fic As String
    fic = Application.GetOpenFilename("Excel Files (*.xls*), *.xls*", 1, "Sélectionner un fichier Excel")
    If fic = "Faux" Then Exit Sub
    MsgBox fic
    x = ArborescenceZipListv2(fic) 'sans filtre
    ' x = ArborescenceZipListv2(fic, "customUI/") 'filtre dossier
    ' x = ArborescenceZipListv2(fic, "customUI") 'filtre tout ce qui contient le mot "customUI"
    If Not IsEmpty(x) Then Debug.Print Join(x, vbCrLf)
End Sub

Function ArborescenceZipListv2(Filepath As String, Optional Filter As String = "") As Variant
    Dim tempFile As String, cmdList As String, objShell As Object, f As Integer, lachaine As String, T As Variant
    ' Fichier temporaire
    tempFile = Environ$("TEMP") & "\tarlist.txt"
    If Dir(tempFile) <> "" Then Kill tempFile
 
    ' concat de  la commande tar + findstr
    If Len(Filter) > 0 Then
        cmdList = "cmd /c tar -tf """ & Filepath & """ | findstr """ & Filter & """ > """ & tempFile & """"
    Else
        cmdList = "cmd /c tar -tf """ & Filepath & """ > """ & tempFile & """"
    End If
 
    ' Exécuter en masqué
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run cmdList, 0, True
    Set objShell = Nothing
 
    ' Lire le tempFile dans un tableau
    If Dir(tempFile) <> "" Then
        f = FreeFile: Open tempFile For Binary Access Read As #f: lachaine = String(LOF(f), " "): Get #f, , lachaine: Close #f
        Kill tempFile
        T = Split(lachaine, vbCrLf)
        If Len(T(UBound(T))) = 0 Then ReDim Preserve T(UBound(T) - 1)
    End If
    ' Retourner un tableau si trouvé
    If UBound(T) > 0 Then
        ArborescenceZipListv2 = T
    Else
        ArborescenceZipListv2 = Empty
    End If
End Function

zipper un fichier ou dossier
VB:
Sub Test_ZipFileOrFolder()
    Dim SourcePath As String, zipPath As String
    ' Choisir le fichier ou dossier à zipper
    SourcePath = Application.GetOpenFilename("Tous fichiers (*.*), *.*", , "Sélectionner un fichier à zipper")
    If SourcePath = "False" Then Exit Sub
    zipPath = ThisWorkbook.Path & "\monArchive.zip" ' chemin du ZIP de destination
    If ZipFileWithTar(SourcePath, zipPath) Then ' Appel de la fonction
        MsgBox "ZIP créé : " & zipPath
        Else: MsgBox "Erreur lors de la création du ZIP"
    End If
End Sub

Function ZipFileWithTar(SourcePath As String, ZipDestination As String) As Boolean
    Dim objShell As Object, cmd As String
    Set objShell = CreateObject("WScript.Shell")
    'a garder comme exemple simple
    cmd = "cmd /c tar -a -cf """ & _
           ZipDestination & """ -C """ & _
           Mid(SourcePath, 1, InStrRev(SourcePath, "\") - 1) & """ """ & _
           Mid(SourcePath, InStrRev(SourcePath, "\") + 1) & """"
    On Error Resume Next
    ' Exécuter la commande masquée
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run cmd, 0, True
    Set objShell = Nothing
    ZipFileWithTar = Dir(ZipDestination) <> ""
End Function

tout ces exemples ont été testés
il se peut cependant que (selon vos configs win/excel )y ai des retouches afaire dans les codes

rédigé par patricktoulon
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…