DECOMPRIMERE FILE DA VBA

di il
5 risposte

DECOMPRIMERE FILE DA VBA

Ciao a tutti

dovrei decomprimere dei file gz che scarico da internet con un loop, ma non riesco a scrivere nessun codice che vada bene

Su Internet, ho trovato questo codice che ho cercato di adattare al mio caso, ma attualemente senza successo.
Sub Unzip()
Dim FSO As Object, zip_file As String, destination As String, f As Object
Dim oShell As Shell

Dim file
Dim fileExt
Dim folder As String
Dim fsob As Scripting.FileSystemObject

folder = "C:\Users\xxxxxxx\Desktop\Download"

Set fsob = New Scripting.FileSystemObject
fileExt = "*.gz"
    
    If Right(folder, 1) <> "\" Then
        folder = folder & "\"
    End If

    file = Dir(folder & fileExt)
    
    Debug.Print file
    
    Dim a As Scripting.folder
    
    Set a = fsob.GetFolder(folder)
    Debug.Print a
    
    Debug.Print fsob.BuildPath(a, file)

    zip_file = fsob.BuildPath(a, file)  <-- nome completo di percorso del file zip
    destination = "c:\users\xxxxx\desktop & """       '<-- deve terminare con ""
    If Right(destination, 1) <> "" Then destination = destination & ""

    'crea l'oggetto Shell
    Set oShell = New Shell
    'estrae solo i file *.gz dall'archivio zippato
    With oShell
        '.Namespace() restituisce un oggetto Folder, che contiene dei file
        For Each f In .Namespace((zip_file)).Items  
            If LCase(f) Like LCase("*.gz") Then
                oShell.Namespace((destination)).CopyHere oShell.Namespace((zip_file)).Items.Item(CStr(f))
            End If
        Next
    End With

    On Error Resume Next
    
    'elimina dal disco la cartella temporanea c reata da WInZip durante l'estrazione
    Set FSO = CreateObject("scripting.filesystemobject")
    FSO.DeleteFolder Environ("Temp") & "Temporary Directory*", True
Set FSO = Nothing
Set fsob = Nothing
End Sub
Grazie in anticipo a chiunque si interesserà al discorso

5 Risposte

  • Re: DECOMPRIMERE FILE DA VBA

    Chiarisci quale sia la conclusiva esigenza, perché non si comprende se è legata al codice, alla modalità di espandere i file compressi, od uno specifico applicativo (32/64 bit) da impiegare (7ZIP, WinRAR, WinZIP, ecc.) per decomprimere il file con estensione GZ.
    Magari con l'occasione vedi questi link:
    https://accessexperts.com/blog/2012/02/06/zipandunzipfrommicrosoftvba/
    https://www.experts-exchange.com/articles/31130/Zip-and-unzip-files-and-folders-with-VBA-the-Windows-Explorer-way.html?headerLink=workspace_article
    https://www.rondebruin.nl/win/s7/win002.ht
  • Re: DECOMPRIMERE FILE DA VBA

    Ciao Wlly, innanzitutto grazie per i link.

    Tra tutti i siti in cui avevo cercato, questi non li avevo visti.

    Li ho letti, cercando un po' di capire.

    Ho fatto una prova con il codice proposto dal secondo link, ma ad un certo punto si blocca riportando l'errore di automazione.

    Posto il codice completo precisando che il file zip in questione è diverso ogni volta e pertanto gli passo il nome cercando tra i file .gz presenti nella cartella downloads:
    Sub BDN() '(myvalue As String)    
    
    'ho evitato di inserirvi l'intero codice di accesso al sito e navigazione
    
    'Call ChiudiIstanze("chrome.exe")
    
    Dim IE As ChromeDriver
    
     ------------
     
        IE.FindElementById("ZIP").Click
        IE.SwitchToNextWindow
        Dim a As String
        
    Dim file
    Dim fileExt
    Dim folder As String
    Dim zip_file As String
    Dim fsob As Scripting.FileSystemObject
    Dim f As Scripting.folder
    
                            folder = "C:\Users\marco.cremaschini\Documenti\Downloads"
                            
                            Set fsob = New Scripting.FileSystemObject
                            fileExt = "*.gz"
                                
                                If Right(folder, 1) <> "\" Then
                                    folder = folder & "\"
                                End If
                            
                                file = Dir(folder & fileExt)
                                
                                Debug.Print file
                                
                                Set f = fsob.GetFolder(folder)
                                Debug.Print f
                                
                                Debug.Print fsob.BuildPath(f, file)
                            
                                zip_file = fsob.BuildPath(f, file)
                                
                                Call UnZip(zip_file, "C:\", False)
        
        IE.Window.Close
        IE.SwitchToWindowByTitle ("BDN")
        IE.FindElementByName("Indietro").Click
        i = i + 1
    
    Next
    
    Call LoopCartelle
    
    Call uniscifiles
    End Sub
    
    Public Function UnZip( _
        ByVal Path As String, _
        Optional ByRef Destination As String, _
        Optional ByVal Overwrite As Boolean) _
        As Long
       
        ' Microsoft Scripting Runtime.
        Dim FileSystemObject    As Scripting.FileSystemObject
        ' Microsoft Shell Controls And Automation.
        Dim ShellApplication    As Shell
       
        Set FileSystemObject = New Scripting.FileSystemObject
        Set ShellApplication = New Shell
                   
        ' Extension of a cabinet file holding one or more files.
        Const CabExtensionName  As String = "cab"
        ' Mandatory extension of zip file.
        Const ZipExtensionName  As String = "gz"
        Const ZipExtension      As String = "." & ZipExtensionName
        ' Constants for Shell.Application.
        Const OverWriteAll      As Long = &H10&
        ' Custom error values.
        Const ErrorNone         As Long = 0
        Const ErrorOther        As Long = -1
       
        Dim ZipName             As String
        Dim ZipPath             As String
        Dim ZipTemp             As String
        Dim Result              As Long
       
        If FileSystemObject.FileExists(Path) Then
            ' The source is an existing file.
            ZipName = FileSystemObject.GetBaseName(Path)
            ZipPath = FileSystemObject.GetFile(Path).ParentFolder
        End If
       
        If ZipName = "" Then
            ' Nothing to unzip. Exit.
            Destination = ""
        Else
            ' Select or create destination folder.
            If Destination <> "" Then
                ' Unzip to a custom folder.
                If _
                    FileSystemObject.GetExtensionName(Destination) = CabExtensionName Or _
                    FileSystemObject.GetExtensionName(Destination) = ZipExtensionName Then
                    ' Do not unzip to a folder named *.cab or *.zip.
                    ' Strip extension.
                    Destination = FileSystemObject.BuildPath( _
                        FileSystemObject.GetParentFolderName(Destination), _
                        FileSystemObject.GetBaseName(Destination))
                End If
            Else
                ' Unzip to a subfolder of the folder of the zipfile.
                Destination = FileSystemObject.BuildPath(ZipPath, ZipName)
            End If
               
            If FileSystemObject.FolderExists(Destination) And Overwrite = True Then
                ' Delete the existing folder.
                FileSystemObject.DeleteFolder Destination, True
            End If
            If Not FileSystemObject.FolderExists(Destination) Then
                ' Create the destination folder.
                FileSystemObject.CreateFolder Destination
            End If
           
            If Not FileSystemObject.FolderExists(Destination) Then
                ' For some reason the destination folder does not exist and cannot be created.
                ' Exit.
                Destination = ""
            Else
                ' Destination folder existed or has been created successfully.
                ' Resolve relative paths.
                Destination = FileSystemObject.GetAbsolutePathName(Destination)
                Path = FileSystemObject.GetAbsolutePathName(Path)
                ' Check file extension.
                If FileSystemObject.GetExtensionName(Path) = ZipExtensionName Then
                    ' File extension is OK.
                    ZipTemp = Path
                Else
                    ' Rename the zip file by adding a zip extension.
                    ZipTemp = Path & ZipExtension
                    FileSystemObject.MoveFile Path, ZipTemp
                End If
                ' Unzip files and folders from the zip file to the destination folder.
                ShellApplication.Namespace(Cvar(Destination)).CopyHere ShellApplication.Namespace(Cvar(ZipTemp)).Items, overwriteall    <-- qui da errore
                If ZipTemp <> Path Then
                    ' Remove the zip extension to restore the original file name.
                    FileSystemObject.MoveFile ZipTemp, Path
                End If
            End If
        End If
       
        Set ShellApplication = Nothing
        Set FileSystemObject = Nothing
       
        If Err.Number <> ErrorNone Then
            Destination = ""
            Result = Err.Number
        ElseIf Destination = "" Then
            Result = ErrorOther
        End If
       
        UnZip = Result
         
    End Function
    Il file zippato come spiegato è un .gz
    Come programma di compressione/decompressione ho 7ZIP

    Avevo provato anche a scrivere un file batch, ma non ho nessuna conoscenza in quel campo.

    Il Sistema Operativo è a 64 bit

    L'esigenza è quella di automatizzare un processo di generazione delle pratiche andando a scaricare dei documenti da un sito (nel caso servano) per poterli allegare alla pratica in generazione in quel momento.

    Purtroppo il sito ha previsto che il pdf in queste situazioni si apra con pdfviewer di chrome senza scaricarlo invece automaticamente come fa con ogni altro download (ad esempio quello del file compresso ... valli a capire)

    Pertanto io ricavo il file zip che è presente nella cartella e lo vorrei far unzippare

    Alle volte, bisogna allegare più di un documento e pertanto bisogna unire i file (infatti in seguito richiamo un'altra routine che mi unisce i file tramite un programma di unione pdf)

    Scusate il papiro e spero di essere stato chiaro

    Buona giornata a tutti
  • Re: DECOMPRIMERE FILE DA VBA

    Marcdreamer ha scritto:


    ...Purtroppo il sito ha previsto che il pdf in queste situazioni si apra con pdfviewer di chrome senza scaricarlo invece automaticamente come fa con ogni altro download
    Non vorrei rispondere a questo thread dicendo che "è inutile" perché comunque si può aggirare il problema: basta cambiare un'impostazione di Chrome
    chrome://settings/content/pdfDocuments
    Se questo basta, credo ci sia tutto di guadagnato.
    Se ritieni di proseguire sulla strada del codice per l'estrazione dagli archivi compressi scrivilo pure che vedo di imparare anch'io e mentre imparo ti aiuto a risolvere.
  • Re: DECOMPRIMERE FILE DA VBA

    Philcattivocarattere ha scritto:


    Marcdreamer ha scritto:


    ...Purtroppo il sito ha previsto che il pdf in queste situazioni si apra con pdfviewer di chrome senza scaricarlo invece automaticamente come fa con ogni altro download
    Non vorrei rispondere a questo thread dicendo che "è inutile" perché comunque si può aggirare il problema: basta cambiare un'impostazione di Chrome
    chrome://settings/content/pdfDocuments
    Se questo basta, credo ci sia tutto di guadagnato.
    Se ritieni di proseguire sulla strada del codice per l'estrazione dagli archivi compressi scrivilo pure che vedo di imparare anch'io e mentre imparo ti aiuto a risolvere.
    Ciao Phil

    sei un grande.

    Non mi ricordavo più di questa possibilità! - mi sono scervellato in queste ore per trovare una soluzione complicata ed invece era tutto così semplice

    Mi piacerebbe tuttavia lasciare aperto questo 3d in modo che magari si possa trovare comunque una soluzione per la decompressione dei file zippati da vba

    Grazie mille
  • Re: DECOMPRIMERE FILE DA VBA

    Per cercare di individuare ciò che determina l'inconveniente è consigliabile cercare di suddividere il processo e procedere per gradi.
    Da considerare che il codice impiegato, per l'automazione tramite VBA, si basa sull'oggetto Shell e le sue applicazioni.
    Queste sono state progettate per un uso interattivo dell'utente e trovano difficoltà ad essere automatizzate in quanto non vi è una gestione sugli errori che possono avvenire durante l'attivazione del processo.
    Quindi è da suddividere le operazioni; per prima cosa controllare che i file con estensione .GZ (presenti nella cartella di downloads) possano essere scaricati in locale,
    Su questi file agire con il programma 7ZIP in modo da svolgere l' operazione di decompressione e depositare i file risultanti nella cartella specificata.
    Dopodiché accedere ai file con estensione PDF che sono stati scompattati dal file .GZ e visionare la loro presentazione con PDFVIEWER.
    Quando tutte le operazioni sono verificate è da cercare di riunirle in uno script che possa svolgere l'intero processo.
Devi accedere o registrarti per scrivere nel forum
5 risposte