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

  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 : 116
Taille : 16,0 Ko
    Nom : 2.png
Affichages : 113
Taille : 7,4 Ko

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    369
    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 : 369
    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 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 245
    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 : 92
Taille : 6,6 Ko

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 245
    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:

  7. #7
    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
    J'ai résolu mon problème en esquivant cet objet ZIP bloqué à "Nothing". Pour cela, j'ai utilisé l'ouverture d'une invite de commande SHELL et j'ai réalisé la compression automatiquement comme ci-dessous.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    '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 fso As Object
        Dim objZIP As Object
        Dim cmd As String
        Dim CheminZIP As String
        Dim ListeFichier As Variant
        Dim nb As Integer
     
        'Liste des fichiers
        ListeFichier = Array(Fichier1, Fichier2, Fichier3)
        nb = 0
     
        'Définition le chemin du ZIP final
        CheminZIP = "C:\Temp\ArchiveDebug_MacroControle_" & Format(Now, "yyyymmdd_hhmmss") & ".zip"
     
        'Creation du fichier d'archive ZIP
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set objZIP = fso.CreateTextFile(CheminZIP, True)
        objZIP.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) ' En-tête ZIP vide
        objZIP.Close
     
        'Attente Windows
        Application.Wait Now + TimeValue("0:00:02")
     
        'Ecriture de la ligne de commande SHELL
        cmd = "powershell -command ""Compress-Archive -Path "
        For Each fichier In ListeFichier
            If fichier <> "" Then
                If nb <> 0 Then
                    cmd = cmd & ","
                End If
                cmd = cmd & "'" & fichier & "'"
                nb = nb + 1
            End If
        Next fichier
        cmd = cmd & " -DestinationPath '" & CheminZIP & "' -Force"""
     
        'Execution de la commande SHELL en cachant la fenetre
        Shell cmd, vbHide
     
        'Attente Windows
        Application.Wait Now + TimeValue("0:00:03")
     
        MsgBox ("Fichiers trop lourds ! Compression et création d'un fichier .ZIP terminée.")
     
        ZipFiles = CheminZIP
     
    End Function
    La partie écriture de la ligne de commande s'adapte en fonction de si je dois compression un, deux ou trois fichiers selon la situation.
    La compression se réalise bien et je peux envoyer mon archive ZIP par mail, un problème qui n'en est plus un !

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 717
    Par défaut
    Bonjour,

    Dans le cas où il n'y a qu'un seul fichier à zipper, le zip est en fait inutile puisque le xlsm (tout comme le xlsx) est déjà un format auto-compressé.
    Cela ne vaut la peine que s'il y a plusieurs fichiers.

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 245
    Par défaut
    Hello,
    Citation Envoyé par Loukassosial Voir le message
    J'ai résolu mon problème en esquivant cet objet ZIP bloqué à "Nothing". Pour cela, j'ai utilisé l'ouverture d'une invite de commande SHELL et j'ai réalisé la compression automatiquement comme ci-dessous.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    '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 fso As Object
        Dim objZIP As Object
        Dim cmd As String
        Dim CheminZIP As String
        Dim ListeFichier As Variant
        Dim nb As Integer
     
        'Liste des fichiers
        ListeFichier = Array(Fichier1, Fichier2, Fichier3)
        nb = 0
     
        'Définition le chemin du ZIP final
        CheminZIP = "C:\Temp\ArchiveDebug_MacroControle_" & Format(Now, "yyyymmdd_hhmmss") & ".zip"
     
        'Creation du fichier d'archive ZIP
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set objZIP = fso.CreateTextFile(CheminZIP, True)
        objZIP.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) ' En-tête ZIP vide
        objZIP.Close
     
        'Attente Windows
        Application.Wait Now + TimeValue("0:00:02")
     
        'Ecriture de la ligne de commande SHELL
        cmd = "powershell -command ""Compress-Archive -Path "
        For Each fichier In ListeFichier
            If fichier <> "" Then
                If nb <> 0 Then
                    cmd = cmd & ","
                End If
                cmd = cmd & "'" & fichier & "'"
                nb = nb + 1
            End If
        Next fichier
        cmd = cmd & " -DestinationPath '" & CheminZIP & "' -Force"""
     
        'Execution de la commande SHELL en cachant la fenetre
        Shell cmd, vbHide
     
        'Attente Windows
        Application.Wait Now + TimeValue("0:00:03")
     
        MsgBox ("Fichiers trop lourds ! Compression et création d'un fichier .ZIP terminée.")
     
        ZipFiles = CheminZIP
     
    End Function
    La partie écriture de la ligne de commande s'adapte en fonction de si je dois compression un, deux ou trois fichiers selon la situation.
    La compression se réalise bien et je peux envoyer mon archive ZIP par mail, un problème qui n'en est plus un !
    Il y a plusieurs inconvénients dans ton code :
    1 - Il n'est pas nécessaire de créer le fichier zip avec fso car le Compress-Archive du powerShell s'en charge.
    2 - On peut passer un nombre variable de noms de fichiers avec le type ParamArray.
    2 - Il y a plus simple pour générer la commande Powershell
    3 - Si la commande de compression se passe mal , il n'y a pas de retour
    4 - Le Shell est Asynchrone , c'est pour cela que l'on met un Wait derrière mais avec un temps d'attente arbitraire.

    Voici ce que je te propose :
    Utilisation de ParamArray pour avoir un nombre variable de fichiers en argument de la fonction
    Utilisation d'un Join pour construire la commande PowerShell
    Utilisation d'une fonction ShellAndWait qui :
    - Attend la fin du processus lancé.
    - Avec un TimeOut au cas où le processus lancé ne se termine pas.
    - Qui teste le code de sortie du processus pour savoir si il s'est bien déroulé.
    Le code :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #If VBA7 Then
        Private Declare PtrSafe Function OpenProcess Lib "kernel32" ( _
            ByVal dwDesiredAccess As Long, _
            ByVal bInheritHandle As Long, _
            ByVal dwProcessId As Long) As LongPtr
     
     
        Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" ( _
            ByVal hHandle As LongPtr, _
            ByVal dwMilliseconds As Long) As Long
     
        Private Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" ( _
            ByVal hProcess As LongPtr, _
            lpExitCode As Long) As Long
     
     
        Private Declare PtrSafe Function CloseHandle Lib "kernel32" ( _
            ByVal hObject As LongPtr) As Long
    #Else
        Private Declare Function OpenProcess Lib "kernel32" ( _
            ByVal dwDesiredAccess As Long, _
            ByVal bInheritHandle As Long, _
            ByVal dwProcessId As Long) As Long
     
     
        Private Declare Function WaitForSingleObject Lib "kernel32" ( _
            ByVal hHandle As Long, _
            ByVal dwMilliseconds As Long) As Long
     
        Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
            ByVal hProcess As Long, _
            lpExitCode As Long) As Long
     
     
        Private Declare Function CloseHandle Lib "kernel32" ( _
            ByVal hObject As Long) As Long
    #End If
    Private Const SYNCHRONIZE = &H100000
    Private Const PROCESS_QUERY_INFORMATION = &H400
    Private Const WAIT_TIMEOUT = &H102&
    Private Const INFINITE = &HFFFFFFFF
     
    'Fonction qui permet de Zip un fichier et de le renvoyer
    Function ZipFiles(ParamArray Listefic() As Variant) As String
        Dim cmd As String, CheminZIP As String, fichiers As String
        'Définition le chemin du ZIP final
        CheminZIP = "C:\Temp\ArchiveDebug_MacroControle_" & Format(Now, "yyyymmdd_hhmmss") & ".zip"
        ' Liste des fichiers
        fichiers = "'" & Join(Listefic, "','") & "'"
         'Ecriture de la ligne de commande SHELL
        cmd = "powershell -command ""Compress-Archive -Path " & fichiers & _
              " -DestinationPath '" & CheminZIP & "' -CompressionLevel Fastest  -Force"""
        Debug.Print cmd
        If Not ShellAndWait(cmd, vbHide, 5000) Then
           ZipFiles = "ERREUR"
           Exit Function
        End If
        MsgBox ("Fichiers trop lourds ! Compression et création d'un fichier .ZIP terminée.")
        ZipFiles = CheminZIP
    End Function
     
    Function ShellAndWait(cmd, windowStyle, timeOutMs As Long) As Boolean
        Dim taskID As Long, exitCode As Long, waitResult As Long
        #If VBA7 Then
        Dim hProc As LongPtr
        #Else
        Dim hProc As Long
        #End If
        ShellAndWait = False
        On Error GoTo ErrHandler
        'Exécution de la commande SHELL , récupération du PID
        taskID = Shell(cmd, vbHide)
        ' Ouverture du Processus
        hProc = OpenProcess(SYNCHRONIZE Or PROCESS_QUERY_INFORMATION, 0, taskID)
        If hProc = 0 Then
            Err.Raise vbObjectError + 2, , "Impossible d'ouvrir le processus."
        End If
        ' Attendre avec timeout
        waitResult = WaitForSingleObject(hProc, timeOutMs)
        If waitResult = WAIT_TIMEOUT Then
            MsgBox "Le programme n'a pas terminé dans le délai imparti (" & timeOutMs & " ms).", vbExclamation
            Exit Function
        Else
           ' Récupérer le code de sortie
            GetExitCodeProcess hProc, exitCode
        End If
     
    Sub TestZipFiles()
    Dim Fic1, Fic2, Fic3, FicZip
    Fic1 = "D:\temp\test.html"
    Fic2 = "D:\temp\PDF\testepure.pdf"
    Fic3 = "D:\Dev\Office\Excel\ClasseurN.xlsm"
    Debug.Print "ZipFiles : " & ZipFiles(Fic1, Fic2, Fic3)
    End Sub
    Citation Envoyé par Promethee25 Voir le message
    Dans le cas où il n'y a qu'un seul fichier à zipper, le zip est en fait inutile puisque le xlsm (tout comme le xlsx) est déjà un format auto-compressé.
    Cela ne vaut la peine que s'il y a plusieurs fichiers.
    Oui mais la compression n'est pas maximale pour ces raisons là :
    Performance : un taux de compression maximal serait plus lent à l’enregistrement et à l’ouverture.
    Compatibilité : Excel utilise la compression "Deflate" standard ZIP, mais avec des réglages rapides.
    Fichiers internes : certaines parties (images, binaires VBA) ne sont pas compressées autant qu’elles pourraient.


    J'ai fait un essai sur un classeur xlsm de taille 5768 Ko composé essentiellement de données dans des feuilles :
    Si je le zippe la taille passe à 3049 Ko
    Si je le compresse en 7z avec 7zip la taille passe à 2068 Ko
    Si il n'y avait pas de compression à l'intérieur du classeur il ferait environ 70000 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko :zen:

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 717
    Par défaut
    Ok, merci pour les infos!

+ 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