XL 2021 Transformer fichier zip en xlsm

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Bonjour à tous,
Suite à ma demande précédente, comment transformer mon fichier zip en xlsm
En vous remerçiant.

VB:
    Dim Source, Destination, MyHex, MyBinary
    Dim oShell, oApp, oFolder, oCTF, oFile
    Dim oFileSys
    
    'Spécifiez le répertoire
    Source = "D:\Users\Nicolas\Desktop\TestZip"
    Destination = "D:\Users\Nicolas\Desktop\maSauvegarde.zip"
    
    MyHex = _
    Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    
    For i = 0 To UBound(MyHex)
        MyBinary = MyBinary & Chr(MyHex(i))
    Next
    
    Set oShell = CreateObject("WScript.Shell")
    Set oFileSys = CreateObject("Scripting.FileSystemObject")
    
    'Création de la base du fichier zip.
    Set oCTF = oFileSys.CreateTextFile(Destination, True)
    oCTF.Write MyBinary
    oCTF.Close
    Set oCTF = Nothing
    
    Set oApp = CreateObject("Shell.Application")
    
    Set oFolder = oApp.Namespace(Source)
    If Not oFolder Is Nothing Then _
        oApp.Namespace(Destination).CopyHere oFolder.Items
    
    Set oFile = Nothing
    On Error Resume Next
    
    Do While (oFile Is Nothing)
        'Attention: provoque une erreur 70 si un des fichiers à zipper
        'est toujours ouvert.
        Set oFile = oFileSys.OpenTextFile(Destination, ForAppending, False)
        
        If Err.Number <> 0 Then
            Err.Clear
        End If
    Loop

Merci
Nicolas
 

patricktoulon

XLDnaute Barbatruc
Exellent @jurassic pork
j'ai tester cette sorte de shell And wait et elle fonctionne très bien
@job75
  1. prend un classeur change l'extension en zip
  2. crée un nouveaudossier (nomme le comme tu veux)
  3. glisse le contenu du zip dedans
  4. vire le zip
  5. lance la sub en modifiant le chemin pour toi bien évidemment
@jurassic pork j'ai a peu pres la même chose sauf que c'est pour pour lancer un cmd ou un bath
VB:
'fonction shell améliorée avec gestion d'attente de fin de processus
'pratique quand on lance un bath ou cmd
Function ShellAndwaitingEndProcess(ByVal CheminComplet As String) As Long
    Dim ProcessHandle As Long
    Dim ProcessId As Long
    ProcessId = Shell(CheminComplet, vbHide)
    ProcessHandle = ExecuteExcel4Macro("CALL(""Kernel32"",""OpenProcess"",""JJJJ"",""" & 2031616 & """,""" & 0 & """,""" & ProcessId & """)")
    ShellAndwaitingEndProcess = ExecuteExcel4Macro("CALL(""Kernel32"",""WaitForSingleObject"",""JJJJJ"",""" & ProcessHandle & """,""" & &HF0000 & """)")
End Function

je n'aurais jamais penser à aller chercher le stdout qui forcement est accessible à la fin de l'opération Bravo!! ;) 👍
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
arf tu compresses le fichier xlsm lui-même . C'est ce qu'il y a à l'intérieur du fichier xlsm qu'il faut mettre dans un .zip. L'utilisation de 7zip est conseillé pour faire les opérations
Décompresser le classeur .xlsm comme un .zip et extraire les fichiers dans un répertoire. C'est ce qu'il y a dans ce répertoire qu'il faudra mettre dans un .zip
 

TooFatBoy

XLDnaute Barbatruc
L'utilisation de 7zip est conseillé pour faire les opérations
Décompresser le classeur .xlsm comme un .zip et extraire les fichiers dans un répertoire.
Toutafé ! Et ça fonctionne du tonnerre ! 👍


Juste pour info : perso, quand je dois modifier un fichier d'une archive xlsm, j'ouvre l'archive avec 7zip, je n'extrais que le fichier à modifier, puis le modifie avec NotePad++ ou autre, et le réintègre dans l'archive, et enfin je ferme 7zip.
 

patricktoulon

XLDnaute Barbatruc
re
j'ai quand même testé la méthode shell.namespace
avec création du zip en partant de zero
chez moi ça fonctionne le xlsm à la fin est bien fonctionnel
exemple
VB:
Sub test()
   Dim zipFile, Folder, x&, oApP As Object 'Attention zipFile et folder doivent être en variant et non en string
   ' chemin du dossier
    Folder = "C:\Users\patricktoulon\Desktop\aaaaa"
    'chemin de l'archive
    zipFile = "C:\Users\patricktoulon\Desktop\xlaaaaa.zip"
    
    'création de l'archive
    x = FreeFile: Open zipFile For Output As #x: Print #x, "PK" & Chr$(5) & Chr$(6) & String$(18, 0): Close #x
    
    'object shell
    Set oApP = CreateObject("Shell.Application") 'object shell
    DoEvents
    
    Dim nbElems As Integer
    nbElems = oApP.Namespace(Folder).Items.Count 'nombre d'items dans le dossier(dossiers ou fichiers confondus)


    'Intégration dans l'archive
    oApP.Namespace(zipFile).moveHere oApP.Namespace(Folder).Items

    'boucle tant que le nombre d'items dans l'archive n'est pas identique a celui du dossier source
    Do While oApP.Namespace(zipFile).Items.Count < nbElems
        ExecuteExcel4Macro ("CALL(""kernel32"",""Sleep"",10)") ' tempo 10 ms
        DoEvents
        'Debug.Print "Wait"
    Loop
    Set oApP = Nothing ' fermeture du shell pour libérer l'archive
    
    'renomage du zip en xlsm puisque dispo car il n'est plus en ecriture
    Name zipFile As Replace(zipFile, "zip", "xlsm")
End Sub
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Tiens donc, tu vois mes messages maintenant ? Bizarre... mais tant mieux. 👍
hé mon Jacky, ça va pas aujourd'hui ?

Capture d’écran 2024-06-29 125500.jpg


Tu lis entre les lignes ? ;)
 

Nicolas JACQUIN

XLDnaute Impliqué
Supporter XLD
Re tout le monde,

En fin de compte, avant que j'ailles plus loin, mon idée ne fonctionne pas du tout, même encore moins,
parce que là le fichier xlsm (modifié) ne s'ouvre même pas.

Suite à mon post précédent,


le fichier se compressait bien en ZIP avec tout les fichiers à l'intérieur,
mais maintenant que je l'ai transformé en xlsm, il ne s'ouvre même plus,

test form6.gif


du coup je l'ai converti manuellement en zip, je l'ouvre (le zip) et tout est vide, aucun fichier, rien du tout.
Donc je ne sais pas ou ça a merdé (désolé du language), mais je m'attendait pas à ça, peut-être que j'aurai eu des message d'erreur (pas étonnant), mais au moins qu'il s'ouvre

C'était pour changer la méthode sur mon projet de programme pour tout ouvrir (je sais pas si s'en est une bonne mais bon.


Je vous joint les bout de codes que j'ai commencé à assembler (c'est le fouilli mais j'ai pas d'erreur dans le code), il y a du boulot je sais 😞😞

VB:
Sub Cracker()
    Dim fso As Object
    Dim zipPath As String
    Dim xlsmPath As String
    Dim xlsmCopyPath As String
    Dim extractFolder As String
    Dim ApplicationArchivage As Object
    Dim FichierArchive As Variant
    Dim DossierDestination As Variant
    Dim cheminFichier As String
    Dim fichier As Integer
    Dim contenuFichier() As Byte
    Dim chaineRecherchee As String
    Dim nouvelleChaine As String
    Dim i As Long
    Dim j As Long
    Dim trouve As Boolean
    Dim FichierASupprimer As String
    Dim Wbk As Workbook
    Dim dossier As Object
    Dim fichierr As Object

    Set Wbk = ActiveWorkbook

    'convertion en zip
    xlsmPath = "D:\Users\Nicolas\Desktop\" & Wbk.Name
    zipPath = "D:\Users\Nicolas\Desktop\Temp.zip"
    ' Dossier où le contenu du .zip sera extrait
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CopyFile xlsmPath, zipPath

    'extraction dans dossier
    FichierArchive = zipPath 'l'archive à décompresser
    DossierDestination = "D:\Users\Nicolas\Desktop\TestZip" '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

    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    ' Spécifiez le chemin du fichier
    cheminFichier = "D:\Users\Nicolas\Desktop\TestZip\xl\vbaProject.bin"

    ' Spécifiez la chaîne à rechercher et la nouvelle chaîne
    chaineRecherchee = "..." 'pas mis exprès pour le forum
    nouvelleChaine = "..." 'pas mis exprès pour le forum

    ' Ouvrir le fichier en mode binaire
    fichier = FreeFile
    Open cheminFichier For Binary Access Read Write As #fichier

    ' Lire tout le fichier dans un tableau de bytes
    ReDim contenuFichier(LOF(fichier) - 1)
    Get #fichier, , contenuFichier

    ' Recherche de la chaîne
    For i = 0 To UBound(contenuFichier) - Len(chaineRecherchee)
        trouve = True
        For j = 0 To Len(chaineRecherchee) - 1
            If contenuFichier(i + j) <> Asc(Mid(chaineRecherchee, j + 1, 1)) Then
                trouve = False
                Exit For
            End If
        Next j

        If trouve Then
            ' Remplacer la chaîne
            For j = 0 To Len(nouvelleChaine) - 1
                contenuFichier(i + j) = Asc(Mid(nouvelleChaine, j + 1, 1))
            Next j
            Exit For
        End If
    Next i

    ' Réécrire le fichier avec les modifications
    Put #fichier, , contenuFichier

    ' Fermer le fichier
    Close #fichier

    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    FichierASupprimer = zipPath '<- le nom du fichier à supprimer
    If Len(Dir(FichierASupprimer)) > 0 Then Kill FichierASupprimer

    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    ZipRepertoire

    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  
    'RenommerZipEnXlsm
  
    Dim cheminDossier As String
    Dim nomFichierZip As String
    Dim nomFichierXlsm As String
    Dim cheminCompletZip As String
    Dim cheminCompletXlsm As String

    ' Spécifiez le chemin du dossier contenant le fichier zip
    cheminDossier = "D:\Users\Nicolas\Desktop\"  ' Modifier le chemin selon votre configuration

    ' Spécifiez le nom du fichier zip
    nomFichierZip = "MaSauvegarde.zip"  ' Modifier le nom du fichier zip

    ' Spécifiez le nom du fichier xlsm
    nomFichierXlsm = "MaSauvegarde.xlsm"  ' Modifier le nom du fichier xlsm

    ' Construire les chemins complets des fichiers
    cheminCompletZip = cheminDossier & nomFichierZip
    cheminCompletXlsm = cheminDossier & nomFichierXlsm

    ' Vérifiez si le fichier zip existe
    If Dir(cheminCompletZip) <> "" Then
        ' Renommer le fichier zip en fichier xlsm
        Name cheminCompletZip As cheminCompletXlsm
        MsgBox "Le fichier a été renommé avec succès.", vbInformation
    Else
        MsgBox "Le fichier zip spécifié n'existe pas.", vbExclamation
    End If
  
    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""

    'Chemin du dossier dont vous voulez supprimer le contenu
  
    cheminDossier = "D:\Users\Nicolas\Desktop\TestZip"

    ' Créer une instance de FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' Obtenir le dossier
    Set dossier = fso.GetFolder(cheminDossier)

    ' Supprimer tous les fichiers dans le dossier
    For Each fichierr In dossier.Files
        fichierr.Delete
    Next fichierr

    ' Supprimer tous les sous-dossiers dans le dossier
    Dim sousDossier As Object
  
    For Each sousDossier In dossier.SubFolders
        sousDossier.Delete True
    Next sousDossier
  
      
    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  
    'Spécifiez le chemin complet du fichier ( ZIP ) à supprimer
  
    nomFichierZip = "D:\Users\Nicolas\Desktop\MaSauvegarde.zip"
  
    ' Vérifiez si le fichier existe avant de tenter de le supprimer
    If Dir(nomFichierZip) <> "" Then
        ' Supprimez le fichier
        'Kill nomFichierZip
        MsgBox "Le fichier a été supprimé avec succès.", vbInformation
    Else
        MsgBox "Le fichier spécifié n'existe pas.", vbExclamation
    End If

    '""""""""""""""""""""""""""""""""""""""""""""""""""""""""


    ' Libérer les objets
    Set fichierr = Nothing
    Set dossier = Nothing
    Set fso = Nothing

  
End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub ZipRepertoire()

    Const ForReading = 1, ForWriting = 2, ForAppending = 8

    Dim Source, Destination, MyHex, MyBinary, i
    Dim oShell, oApP, oFolder, oCTF, oFile
    Dim oFileSys

    'Spécifiez le répertoire
    Source = "D:\Users\Nicolas\Desktop\TestZip"
    Destination = "D:\Users\Nicolas\Desktop\MaSauvegarde.zip"

    MyHex = _
    Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

    For i = 0 To UBound(MyHex)
        MyBinary = MyBinary & Chr(MyHex(i))
    Next

    Set oShell = CreateObject("WScript.Shell")
    Set oFileSys = CreateObject("Scripting.FileSystemObject")

    'Création de la base du fichier zip.
    Set oCTF = oFileSys.CreateTextFile(Destination, True)
    oCTF.Write MyBinary
    oCTF.Close
    Set oCTF = Nothing

    Set oApP = CreateObject("Shell.Application")

    Set oFolder = oApP.Namespace(Source)
    If Not oFolder Is Nothing Then _
           oApP.Namespace(Destination).CopyHere oFolder.Items

    Set oFile = Nothing
    On Error Resume Next

    Do While (oFile Is Nothing)
        'Attention: provoque une erreur 70 si un des fichiers à zipper
        'est toujours ouvert.
        Set oFile = oFileSys.OpenTextFile(Destination, ForAppending, False)

        If Err.Number <> 0 Then
            Err.Clear
        End If
    Loop

    Set oFile = Nothing
    Set oFileSys = Nothing
End Sub

Si vous avez une idée du pourquoi j'ai ce résultat
Merci.
Nicolas.
 
Dernière édition:

Statistiques des forums

Discussions
315 093
Messages
2 116 139
Membres
112 669
dernier inscrit
Guigui2502