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
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éthode | Inclus dans Windows | Facile à installer | Notes |
Windows 10 ≥1803 / Windows 11 | ✅ Oui | — | tar disponible nativement |
Git for Windows | ❌ Non, dépend de Git | ✅ Facile | Accessible depuis CMD si configuré |
WSL | ❌ Non, dépend de WSL | ⚠ Moyen | Tout 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)
et bien la réponse est simple
parfois il est capricieux et plante des erreurs insensées pour le nameSpace
et quand cela se produit vous pouvez faire ce que vous voulez plus rien ne fonctionnera
et quand il fonctionne correctement les fichier produit il en est propriétaire est ne peuvent etre ouvert ou modifiés ou autres actions dessus ces fichiers
et cela quelques fois même après avoir detruit l'object(Nothing)
et pour finir ,il peut être long
<<la commande tar>>
-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: