Besoin d'automatiser la compression ZIP et la décompression directement depuis Excel ou VBA ?
Voici des codes VBA prêts à l'emploi pour créer un Zip, ajouter des fichiers, déplacer des fichiers dans un Zip existant et extraire une archive.
On s'appuie sur le mécanisme ZIP intégré à Windows (Shell.Application) : pas d'outil externe à installer pour les cas simples.
C'est pratique pour sauvegarder des rapports, joindre des pièces plus légères à un e-mail, ou archiver automatiquement des exports à la fin d'un traitement.
Important : ces macros utilisent des composants système de Windows.
Non compatibles Mac. Pour des besoins avancés (très gros volumes, chiffrement, performances), pensez à des alternatives comme 7-Zip (via ligne de commande) ou PowerShell.
Sommaire
- Archiver/compresser un fichier avec VBA
- Copier un fichier vers un archive existant
- Déplacer un fichier vers un archive existant
- Décompresser le contenu d'un archive Zip avec VBA
- Compresser plusieurs fichiers en une fois
- Compresser un dossier entier
- FAQ – VBA et fichiers Zip
- Aller plus loin (alternatives et ressources)
Archiver/compresser un fichier avec VBA
Ceci est le code VBA de base : on crée une archive si besoin (en écrivant un entête minimal), puis on copie le fichier dedans.
Par défaut, si l'archive existe déjà, on la recrée.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub ArchiverUnFichier() 'par Excel-Malin.com ( https://excel-malin.com ) '--------------------------------------------------------- 'gestion des erreurs On Error GoTo ErreurCompression 'définition des variables Dim ApplicationArchivage As Object Dim FichierAArchiver, FichierZip 'informations sur les fichiers (chemins & noms) FichierAArchiver = "C:\Test\MonFichierWord.docx" FichierZip = "C:\Test\Archives\MonArchive_1.zip" 'créer un nouveau archive If Len(Dir(FichierZip)) > 0 Then Kill FichierZip 'supprime l'archive s'il existe déjà Open FichierZip For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 'copier le fichier à archiver dans l'archive Set ApplicationArchivage = CreateObject("Shell.Application") ApplicationArchivage.Namespace(FichierZip).CopyHere FichierAArchiver 'Message final MsgBox "L'archivage a été lancé..." Exit Sub ErreurCompression: MsgBox "Une erreur s'est produite..." End Sub |
Conseils pratiques
- La copie via
CopyHere
est asynchrone. L'opération continue en arrière-plan ; laissez quelques secondes pour les gros fichiers (unDoEvents
ou uneWait
courte peut être utile). - Vérifiez l'existence des chemins (archive, source) avant de lancer la copie pour éviter des erreurs inutiles.
- Évitez de zipper des fichiers ouverts/verrouillés.
Copier un fichier vers un archive existant
Ici, on ajoute un fichier à un zip existant. Le fichier original reste à sa place.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub CopierFichierDansArchiveExistant() 'par Excel-Malin.com ( https://excel-malin.com ) '--------------------------------------------------------- 'gestion des erreurs On Error GoTo ErreurCompression 'définition des variables Dim ApplicationArchivage As Object Dim FichierAArchiver, FichierZip 'informations sur les fichiers (chemins & noms) FichierAArchiver = "C:\Test\MonFichierWord.docx" FichierZip = "C:\Test\Archives\MonArchive_1.zip" 'copier le fichier à archiver dans l'archive Set ApplicationArchivage = CreateObject("Shell.Application") ApplicationArchivage.Namespace(FichierZip).CopyHere FichierAArchiver 'Message final MsgBox "L'archivage a été lancé.." Exit Sub ErreurCompression: MsgBox "Une erreur s'est produite..." End Sub |
Déplacer un fichier vers un archive existant
Variante précédente : on déplace le fichier dans le zip. Le fichier n'existe plus à l'emplacement d'origine.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub DeplacerFichierDansArchiveExistant() 'par Excel-Malin.com ( https://excel-malin.com ) '--------------------------------------------------------- 'gestion des erreurs On Error GoTo ErreurCompression 'définition des variables Dim ApplicationArchivage As Object Dim FichierAArchiver, FichierZip 'informations sur les fichiers (chemins & noms) FichierAArchiver = "C:\Test\MonFichierWord.docx" FichierZip = "C:\Test\Archives\MonArchive_1.zip" 'copier le fichier à archiver dans l'archive Set ApplicationArchivage = CreateObject("Shell.Application") ApplicationArchivage.Namespace(FichierZip).MoveHere FichierAArchiver 'Message final MsgBox "L'archivage a été lancé.." Exit Sub ErreurCompression: MsgBox "Une erreur s'est produite..." End Sub |
Décompresser le contenu d'un archive Zip avec VBA
Voici le code pour extraire tous les fichiers d'un zip vers un dossier.
L'archive d'origine n'est pas supprimée.
Attention : si le chemin du dossier cible ne se termine pas par “\”, on l'ajoute pour éviter des soucis de chemin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub DecompresserArchiveZip() 'par Excel-Malin.com ( https://excel-malin.com ) '--------------------------------------------------------- 'gestion des erreurs On Error GoTo ErreurDecompression 'définition des variables Dim ApplicationArchivage As Object Dim FichierArchive As Variant Dim DossierDestination As Variant 'informations sur l'archive et le dossier pour les fichiers décompressés FichierArchive = "C:\Test\MonArchive.zip" 'l'archive à décompresser DossierDestination = "C:\Test\Decompresse\" 'le dossier dans lequel les fichiers seront décompressés 'vérification du format du chemin du dossier de destination If Right(DossierDestination, 1) <> "\" Then DossierDestination = DossierDestination & "\" 'Décompression Set ApplicationArchivage = CreateObject("Shell.Application") ApplicationArchivage.Namespace(DossierDestination).CopyHere ApplicationArchivage.Namespace(FichierArchive).items Set ApplicationArchivage = Nothing 'Message final MsgBox "La décompression a été lancée.." Exit Sub ErreurDecompression: MsgBox "Une erreur s'est produite..." End Sub |
Compresser plusieurs fichiers en une fois
Pour compresser une liste de fichiers, bouclez tout simplement sur vos chemins.
Ici, on crée l'archive si besoin puis on y ajoute chaque fichier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Sub ZipperPlusieursFichiers() On Error GoTo Oups Dim sh As Object, zipPath As String, arr, i As Long zipPath = "C:\Test\Archives\Lot_2025.zip" 'Créer ou recréer l'archive If Len(Dir(zipPath)) > 0 Then Kill zipPath Open zipPath For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 'Liste des fichiers à zipper arr = Array( _ "C:\Test\Exports\Janvier.xlsx", _ "C:\Test\Exports\Fev.xlsx", _ "C:\Test\Docs\Notice.pdf" _ ) Set sh = CreateObject("Shell.Application") For i = LBound(arr) To UBound(arr) If Len(Dir(arr(i))) > 0 Then sh.Namespace(zipPath).CopyHere arr(i) DoEvents 'laisser le temps à la copie End If Next i MsgBox "Archive créée : " & zipPath Exit Sub Oups: MsgBox "Erreur : " & Err.Description End Sub |
Compresser un dossier entier
Besoin d'archiver tout le contenu d'un dossier (et éventuellement ses sous-dossiers) ?
On peut s'appuyer sur le namespace Shell du dossier pour pousser son contenu dans l'archive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub ZipperUnDossierEntier() On Error GoTo Oups Dim sh As Object, zipPath As String, srcFolder As String zipPath = "C:\Test\Archives\Sauvegarde_Projet.zip" srcFolder = "C:\Test\Projet" 'dossier source à compresser If Right(srcFolder, 1) <> "\" Then srcFolder = srcFolder & "\" 'Créer ou recréer le zip If Len(Dir(zipPath)) > 0 Then Kill zipPath Open zipPath For Output As #1 Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0) Close #1 Set sh = CreateObject("Shell.Application") sh.Namespace(zipPath).CopyHere sh.Namespace(srcFolder).Items DoEvents MsgBox "Dossier archivé : " & zipPath Exit Sub Oups: MsgBox "Erreur : " & Err.Description End Sub |
Bonnes pratiques
- Ajoutez des contrôles d'existence (dossier, fichiers) pour sécuriser le flux.
- Pour de très gros lots, prévoyez de petites pauses (
Application.Wait
ou boucles avecDoEvents
). - Si vous avez besoin de chiffrer le zip ou de performances supérieures, privilégiez 7-Zip (CLI) ou PowerShell.
FAQ – VBA et fichiers Zip
Aller plus loin (alternatives et ressources)
- Utiliser 7-Zip via ligne de commande : robuste et rapide (site officiel).
- Scripts PowerShell pour zip/unzip : pratiques dans des jobs planifiés.
- Exemples et variantes chez Ron de Bruin (en anglais).
Liens utiles (VBA & fichiers)
- Ouvrir un fichier (de tout type) en VBA
- VBA: Vérifier si le fichier existe
- Copier un dossier et son contenu complet en VBA
- VBA: calculer la taille de fichier (en octets, ko, Mo et Go)
- Liste de toutes les fonctions disponibles en VBA
- Envoyer un email avec VBA
- Débloquer les fichiers venant d'internet avec les macros bloquées
16 commentaires sur “VBA: compresser et décompresser des fichiers Zip (mode d’emploi)”
Merci pour ce code!
Bonjour
déjà, merci pour ce code
mais y a t il moyen de crypter automatiquement aussi le fichier en le zippant comme ça ?
Bonojur Olovier,
il semblerait qu'il n'est pas possible de crypter les fichiers .zip via VBA avec le programme WinZip qui est présent par défaut dans les PC avec Windows.
Par contre il est possible d'utiliser un autre logiciel d'archivage (par exemple le 7Zip qui est gratuit) et utiliser ensuite le mot de passe comme argument de la fonction
Shell
.Voici l'exemple du code qui devrait faire l'affaire:
Sub TestZip()
FichierDestination= "c:\temp\TestZipFile.zip"
FichierSource = "C:\temporaire\mon_fichier_test.pdf"
Chemin7Zip = "C:\Program Files\7-Zip\7z.exe"
MotDePasse = "MonMotDePasse"
MaCommande = Chemin7Zip & " -p" & MotDePasse & " a -tzip """ & FichierDestination & """ """ & FichierSource& """"
Shell MaCommande
End Sub
J'espère que cela vous aide…
Bàv, Martin
Bonjour,
Merci pour ces codes. Concernant le code 7zip, pouvez-vous indiquez comment décompresser un fichier Excel, qui a été compressé avec 7zip et avec un mot de passe dans 7zip?
Bonsoir Diane,
le code VBA de Ron se trouve dans ce fichier: http://www.rondebruin.nl/win/winfiles/7zip_unzipexamples.txt
Vous copiez le tout dans votre module et puis vous lancez la macro – la première vous laisse choisir le fichier à décompresser (
Sub A_UnZip_Zip_File_Browse()
), dans la deuxième, le fichier à décompresser est directement dans le code (Sub B_UnZip_Zip_File_Fixed()
)Pour le mot de passe, il faut remplacer le code:
ShellStr = PathZipProgram & "7z.exe x -aoa -r" _
& " " & Chr(34) & FileNameZip & Chr(34) _
& " -o" & Chr(34) & NameUnZipFolder & Chr(34) & " " & "*.*"
par
ShellStr = PathZipProgram & "7z.exe x -aoa -r" _
& " " & Chr(34) & FileNameZip & Chr(34) _
& " -pMotDePasse" & Chr(34) _
& " -o" & Chr(34) & NameUnZipFolder & Chr(34) & " " & "*.*"
au cas où le mot de passe est MotDePasse. donc le "-p" doit y être juste avant le mot de passe.
Il est aussi possible de faire un pop-up où l'utilisateur doit écrire le mot de passe mais je ne sais pas si vous en avez besoin.
J'espère que cela vous aide.
Cordialement, Martin
Je vous remercie Martin. Tout fonctionne comme je le souhaite.
Bien cordialement,
Diane
Bonjour, est-ce que cette commande est supposée ajouter le fichier dans un fichier zip et créer un mot de passe?
Lorsque je l'exécute mon fichier zip ne se créé pas du tout
Il y a un grave problème dans ce code. Ce message est totalement faux : "L'archivage est terminé…". Il devrait être "L'archivage est peut être terminé ou peut être qu'il est toujours en cours, vous n'avez aucun moyen sérieux d'en être certain à ce point du code"…
Bonjour,
je vais faire abstraction du ton de votre message… Si vous trouvez un problème ou une amélioration à implémenter, il y a moyen d'en avertir de manière constructive me semble-t-il.
J'ai adapté le message (non, pas de la manière que vous suggérez) donc ce "grave problème" est désormais résolu.
Cordialement, Martin
Bonjour,
Le code ne fonctionne pas chez moi. Il ne semble pas reconnaitre l'objet "WINZIP" faut il activer une DLL ? et si oui laquelle ?
Merci d'avance pour le retour
Bonjour Laurent,
normalement, il ne faut aucune référence (DLL) en particulier.
Je viens de re-tester le code pour être sûr: et tout fonctionne (Win 7, Office 2013)…
Êtes-vous sûr que WinZip est installé sur votre machine? Et peut-être vérifiez si le suffixe ".ZIP" est bien associé à l'application WinZip dans votre Windows.
Cordialement, Martin
Bonjour,
Merci beaucoup pour cet article très interessant. ça m'a beaucoup aidé.
Il manque juste un exemple pour renommer un fichier contenu dans un zip. Si par exemple on veut copier un fichier dans un ZIP comme montré ici, mais qu'au passage on veuille le renommer. Vous avez une piste svp ?
Par ailleurs, j'ai lu que vous disiez qu'il n'y a aucune référence à activer. Mais pour ma part, sur ma version 2010, l'auto complétion du NameSpace n'agit pas. "CopyHere" ne m'est pas proposé, et si je le saisi tout en minuscule, la casse reste inchangée. Cela fonctionne tout de même. Mais je tenais à le signaler. J'ai peut-être loupé un truc.
Bonjour,
Je développe une base de donnée Access, et je souhaite archiver un dossier contenant des fichiers afin de les envoyer par mail automatiquement. J'ai utilisé le code de cette page pour archiver un dossier.
Il crée effectivement un fichier ZIP qui porte le nom que je souhaite, mais celui-ci ne contient pas les fichiers présent dans mon dossier.
J'ai alors tenté, d'ajouter les fichiers un par un dans le ZIP, avec le code permettant de copier les fichiers dans une archive existante. Rien à faire, le ZIP est toujours vide.
Est-ce que quelqu'un a déjà rencontré ce problème ? Est-ce un problème d'adaptation entre VBA Excel et VBA Access ? Avez vous une idée d'une solution ?
Cordialement,
Simon
Bonjour, j'ai utilisé le code pour copier un fichier dans un fichier zip, par contre j'aurais besoin de mettre un mot de passe sur le fichier zip, est-ce qu quelqu'un sait comment faire?
Bonjour Monsieur,
je viens de créé de dossiers Zip sur une clé USB selon votre méthode ; apparemment pas de problème mais quand je veux ajouter un dossier manuellement j'ai le message suivant :
Insérer le dernier disque de l'ensemble multi-volumes et cliquer sur OK pour continuer.
Je ne peux pas ouvrir le dossier compressé en cliquant dessus. Je ne comprends pas, qu'est-ce que j'ai zappé
Philippe
Bonjour et merci pour tout le travail faut sur ce site.
Comment peut on faire pour ajouter un dossier dans le .zip?
Je cherche à zipper tout un dossier, fichier à la racine + fichiers dans les sous-dossier.
Merci d'avance.