Le VBA, en tant que langage de script de Windows nous permet d'utiliser d'autres applications (qui ne font pas partie de la suite Microsoft Office) ce qui ouvre toute une gamme de possibilités supplémentaires à la programmation en VBA. Ce qui nous intéresse ici est comment gérer des fichiers Zip en VBA.
Les codes VBA qui suivent permettent de compresser et décompresser les fichiers via le WinZip (le programme d'archivage par défaut dans Windows). Vous pouvez donc utiliser Excel comme interface pour automatiser l'archivage (et désarchivage) de tout type de fichier – fichiers texte, fichiers Word, etc.
Je vous propose quatre codes VBA différents, tous les quatre prêts à l'utilisation – il suffit simplement de les copier/coller dans votre macro et changer les noms de fichiers à utiliser.
Sommaire
Archiver/compresser un fichier avec VBA
Ceci est le code VBA de base qui vous permet d'archiver un fichier. Il suffit d'indiquer le nom du fichier à archiver et le nom de l'archive. Par défaut, si l'archive mentionné existe déjà, la macro va l'effacer avant de le recréer.
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 |
Copier un fichier vers un archive existant
Le code suivant vous permet de copier un fichier (par exemple un document Word ou un PDF) dans un archive existant. Cela implique que le fichier original sera ajouté à l'archive mais restera également dans sa forme originale (non-compressée) à l'endroit 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 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
Il s'agit de la modification du code précédent. Cette fois-ci, le fichier d'origine est déplacé dans l'archive existant. Cela veut donc dire que le fichier d'origine (le fichier non-compressé) ne restera pas à sa place initiale – le seul exemplaire de ce fichier se trouvera compressé dans l'archive mentionné.
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
Après la compression (archivage), voici le code VBA qui vous permettra d'extraire le contenu d'un archive Zip. Il suffit d'indiquer le nom et l'emplacement de l'archive ainsi que le dossier dans lequel le contenu doit être décompressé…
Attention: ce code ne supprime pas l'archive de départ. Vous aurez donc toujours votre archive + une copie décompressée de tout son contenu qui se trouvera dans le dossier de votre choix.
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 |
Utilisation avancée de compression et décompression Zip en VBA
Les codes que vous venez de voir constituent la base – il est possible de les développer et combiner pour en faire une solution tout à fait automatisée. Voici quelques indications pour vous permettre de "personnaliser" le code:
- Vous pouvez transformer ces procédures (
Sub
) en fonctions (Function
) et remplacer les variables (nom de fichier à archiver, nom d'archive etc.) par des arguments des fonctions. Cela rendra le code plus flexible et facilement réutilisable. - Lors de l'extraction, vous pouvez vérifier si le dossier existe et si ce n'est pas le cas, vous pouvez le créer programmaticalement avant de poursuivre l'extraction.
- Pour éviter des erreurs en cas d'utilisation automatique, je vous conseillerai de vérifier si le fichier en question existe (fichier à archiver ou l'archive lui-même).
- Sinon, vous pourriez trouver utiles les codes VBA pour manipuler des fichiers.
Vous trouverez d'autres informations intéressantes sur l'archivage en VBA sur le site de Ron de Bruin (par exemple archivage avec le logiciel 7-Zip). Le site est en anglais.
Pour aller plus loin…
D'autres articles sur Excel-Malin.com pourraient également vous intéresser:
- 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 et Zip: compresser et décompresser des fichiers”
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.