IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Dev VBA - Compression de fichier .xlsm


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2025
    Messages : 4
    Par défaut Dev VBA - Compression de fichier .xlsm
    Bonjour à tous, j'essaie de programmer une fonction de compression de fichier excel dans une archive dont le chemin est ici "CheminZIP". Le probleme étant qu'à l'exécution, la fonction bloque sur la création de l'objet. En effet, la ligne "Set objZip = objShell.Namespace(CheminZIP)" ne semble pas fonctionner correctement et ne renvoie rien, je me retrouve au final avec objZIP = Nothing... Pourtant le fichier d'Archive .ZIP a bien été créé à chaque fois mais puisque l'objet est vide, je ne peux pas ajouter mes fichier à l'intérieur. Sauriez-vous m'aider à y voir plus clair ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    '//=========================================================================================================//
    'Fonction qui permet de Zip un fichier et de le renvoyer
    Function ZipFiles(ByVal Fichier1 As String, ByVal Fichier2 As String, ByVal Fichier3 As String) As String
        Dim objShell As Object, objZip As Object
        Dim CheminZIP As String
        Dim ListeFichier As Variant
        
        ' --- Liste des fichiers à inclure ---
        ListeFichier = Array(Fichier1, Fichier2, Fichier3)
        
        ' --- Définir le chemin du ZIP final ---
        CheminZIP = "C:\Temp\ArchiveDebug_MacroControle_" & Format(Now, "yyyymmdd_hhmmss") & ".zip"
        
        
        ' --- Créer un ZIP vide si inexistant ---
        If Dir(CheminZIP) = "" Then
            Open CheminZIP For Output As #1
            Print #1, "PK" & Chr$(5) & Chr$(6) & String$(18, vbNullChar)
            Close #1
        End If
        
        ' --- Préparer l'objet Shell ---
        Set objShell = CreateObject("Shell.Application")
        Set objZip = objShell.Namespace(CheminZIP)
        
        ' --- Ajouter les fichiers un par un ---
        For Each Fichier In ListeFichier
            If Dir(Fichier) <> "" Then ' vérifier si le fichier existe
                objZip.CopyHere Fichier
                ' pause pour laisser Windows compresser avant d'ajouter le suivant
                Application.Wait Now + TimeValue("0:00:02")
            End If
        Next Fichier
        
        MsgBox ("Fichiers trop lourds ! Compression et création d'un fichier .ZIP terminée.")
        
        ZipFiles = CheminZIP
        
    End Function
    '//=========================================================================================================//
    En entrée de ma fonction, trois chemins de fichiers .xlsm que je veux compresser et ajouter à l'archive ZIP. En sortie, le chemin du fichier ZIP pour que je puisse transférer l'archive plus tard par mail.
    Voici la preuve que mon fichier a bien été créé ainsi que l'erreur qui me bloque en pièce jointe.
    Nom : 1.PNG
Affichages : 105
Taille : 16,0 Ko
    Nom : 2.png
Affichages : 102
Taille : 7,4 Ko

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 366
    Par défaut
    Bonjour,
    Pour le code merci de le mettre

    Merci
    Un problème sans solution est un problème mal posé. (Albert Einstein)

  3. #3
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2025
    Messages : 4
    Par défaut
    C'est fait désolé je n'étais pas au courant !

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Hello,
    c'est bizarre que le fichier soit créé car :
    Pourquoi CreateObject("Shell.Application").Namespace("D:\Temp\newFile.zip") ne fonctionne pas ?

    La méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set dossierZip = CreateObject("Shell.Application").Namespace("D:\Temp\newFile.zip")

    ne fonctionne pas si le fichier newFile.zip :

    1. n'existe pas du tout,
    2. n’est pas un vrai fichier ZIP valide.


    🔍 Détails techniques


    • La méthode Namespace(...) de Shell.Application sert à accéder à des dossiers, y compris :
      • Des dossiers normaux (C:\Users\...)
      • Des dossiers spéciaux (Bureau, Documents, etc.)
      • Des archives ZIP valides, que Windows considère comme des dossiers compressés

    ➡️ Mais : si le fichier .zip n’existe pas ou n’est pas un vrai fichier ZIP, Namespace(...) retourne Nothing.

    ✅ Solution : Créer un vrai fichier .zip valide (même vide)

    Avant d'utiliser Namespace(...), il faut créer un fichier .zip avec l'en-tête ZIP standard, sinon Windows ne le reconnaîtra pas comme une archive.
    Exemple : Créer un fichier .zip vide et valide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub CreerZipValide()    Dim cheminZip As String
        cheminZip = "D:\Temp\newFile.zip"
     
     
        Dim fso As Object
        Set fso = CreateObject("Scripting.FileSystemObject")
     
     
        Dim fichier As Object
        Set fichier = fso.CreateTextFile(cheminZip, True)
        fichier.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) ' En-tête ZIP vide
        fichier.Close
     
     
        MsgBox "ZIP vide créé. Vous pouvez maintenant utiliser Namespace()."
    End Sub
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  5. #5
    Invité de passage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2025
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2025
    Messages : 4
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    c'est bizarre que le fichier soit créé car :
    Pourquoi CreateObject("Shell.Application").Namespace("D:\Temp\newFile.zip") ne fonctionne pas ?
    J'ai essayé de créer le fichier ZIP avec entête standard en amont comme tu me l'as expliqué mais ça ne change pas grand chose.
    Le programme bloque encore sur objZip = Nothing... Alors que le fichier ZIP est bien créé au bon chemin et que je peux bien l'ouvrir manuellement sans qu'il soit corrompu ou autre, c'est à n'y rien comprendre !
    Nom : 3.PNG
Affichages : 81
Taille : 6,6 Ko

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    Citation Envoyé par Loukassosial Voir le message
    J'ai essayé de créer le fichier ZIP avec entête standard en amont comme tu me l'as expliqué mais ça ne change pas grand chose.
    Le programme bloque encore sur objZip = Nothing...
    Tu crées un fichier .zip valide (avec l'en-tête PK...)
    ➤ Puis tu tentes immédiatement :


    Set dossierZip = Shell.Namespace("D:\Temp\newFile.zip")


    Mais... dossierZip est Nothing, même si le fichier .zip a été créé correctement.

    ❗ Pourquoi cela se produit

    Windows (explorateur + Shell.Application) a besoin d’un court délai pour détecter que le fichier .zip est devenu un fichier ZIP valide.
    ➡️ Cela peut prendre une fraction de seconde, donc si tu accèdes immédiatement avec Namespace(...), il est encore trop tôt.

    ✅ Solution : Attendre que Windows "reconnaisse" le ZIP

    ✅ Exemple : Boucle d’attente jusqu’à ce que Namespace() fonctionne




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    Sub AttenteNamespaceZip()
        Dim cheminZip As String
        cheminZip = "D:\Temp\newFile.zip"
     
     
        ' Créer un zip vide (en-tête)
        Dim fso As Object
        Set fso = CreateObject("Scripting.FileSystemObject")
     
     
        Dim fichier As Object
        Set fichier = fso.CreateTextFile(cheminZip, True)
        fichier.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
        fichier.Close
     
     
        ' Attendre que Windows reconnaisse le ZIP
        Dim shell As Object
        Set shell = CreateObject("Shell.Application")
     
     
        Dim dossierZip As Object
        Dim t As Single
        t = Timer
     
     
        Do
            DoEvents
            Set dossierZip = shell.Namespace(cheminZip)
            If Timer - t > 5 Then Exit Do ' max 5 secondes d'attente
        Loop While dossierZip Is Nothing
     
     
        If Not dossierZip Is Nothing Then
            MsgBox "Le ZIP est prêt. Vous pouvez l'utiliser."
        Else
            MsgBox "Échec : le ZIP n’a pas été reconnu après 5 secondes."
        End If
    End Sub


    🔍 Pourquoi Timer + DoEvents ?


    • Timer mesure le temps (en secondes).
    • DoEvents permet à Windows de faire d’autres tâches pendant la boucle (comme reconnaître le fichier ZIP).
    • On attend jusqu’à 5 secondes, mais le fichier est souvent reconnu en moins d'une seconde.


    ✅ Ce que ça permet


    • Tu peux enchaîner tout ton code (copie dans le ZIP, etc.) sans erreur.
    • Tu évites que Shell.Application.Namespace(...) te renvoie Nothing.


    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA consolider plusieurs fichiers .csv vers .xlsm avec conditions
    Par ProjetRH dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/04/2017, 10h40
  2. Lecture d'un fichier .xlsm en vba
    Par the_reward dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/12/2015, 10h14
  3. VBA enregistrer le fichier d'xlsm en xlsx
    Par JACK7460 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/04/2015, 19h29
  4. [AC-2007] Ouverture d'un fichier *.xlsm en vba
    Par ezequielfranck dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/09/2014, 11h45
  5. [XL-2010] VBA enregistrer le fichier d'xlsm en xlsx
    Par Anna_2013 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 25/11/2013, 04h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo