Sviluppare funzionalita su Microsoft Office con VBA Estrarre file da archivi zip e smistarli in cartelle specifiche

Login Registrati
Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
  • Autore
    Articoli
  • #7167 Risposta

    luilomo
    Partecipante

      Salve ragazzi,

      spero di non andare contro le regole (avevo messo come risolto il caso ma)

      ho terminato l'ntegrazione con il resto del mio codice ma ho qualche altra cosa che mi piacerebbe migliorare.

      1)  ho più macro che lavorano nello stesso file excel alcune sono nei moduli altre (una) all'interno del foglio1

      Ora si attivano con un bottone per ogni singola macro ma vorrei farle eseguire tutte anche con un unico bottone.

       

      2) il codice funziona solo se i file da trattare sono in una cartella locale. Se sono in un server che raggiungo da pc attraverso la maschera di selezione inserita per la scelta dell'orinige il codice entra in debug. (io ora us una cartela di drive ma dovrei poi usare una cartella su un server)

      ho letto in giro e credo di aver compreso che VBA ha bisogno di sapere se si tratta di cartelle locali o su server.

      Se volessi mettere tutto su cartella di un server questa cosa si può fare sia per la cartella di origine (dove diversi utenti depositano i file da trattare) che per le cartelle che crea il codice in cui vengono smistati e archiviati i file?

      Grazie in anticipo.

      _____________________________

      Allego file xmls con file da trattare.

      nel file xmls ci sono due fogli nascosti in cui il codice inserisce i dati dei fogli excel di origine

      NB. i file di origine xls non contengo  dati per motivi di privacy ma hanno tutte le colonne necessarie e le righe che potrebbero essere presenti.

      Luigi

       

      Allegati:
      You must be logged in to view attached files.
      #7169 Risposta

      vecchio frac
      Moderatore
        14 pts

        luilomo wrote:vorrei farle eseguire tutte anche con un unico bottone

        Cosa intendi? che nel codice di evento Click del pulsante vuoi richiamare più di una macro?

        luilomo wrote:Se sono in un server che raggiungo da pc attraverso la maschera di selezione inserita per la scelta dell'origine

        Perchè? ho fatto una prova di selezione file dalla maschera di FileDialog e accede/apre tranquillamente un file sul server. 

        Credo che sia indifferente se il file che contiene la macro sia locale o sul server,ma va verificato. I percorsi dovrebbero iniziare con "\\".

        Adesso guardo il file che hai allegato.

        #7177 Risposta

        luilomo
        Partecipante

          Si esattamente con un bottone solo.

          Ho provato a creare una sub che ruchiami tutte ma mi da errore probabilmente a casua del caos che ho datto tra sub e variabili.  🙄 

           

          Grazie

          #7179 Risposta

          vecchio frac
          Moderatore
            14 pts

            Riesci a mostrare questa sub?

            Perchè davvero, non è una cosa impossibile da fare 🙂

            #7180 Risposta

            luilomo
            Partecipante

              Eccola

              `Public Sub tutto()
              ' sub per eseguire gli aggiornamenti con un solo bottone
              Call manage_zips3
              Call importAllXls
              Call Split_link
              Call Riepilogo
              
              End Sub`

               e nell'immagine il messaggio di errore,

               

               

              Allegati:
              You must be logged in to view attached files.
              #7182 Risposta

              vecchio frac
              Moderatore
                14 pts

                Ecco volevo suggerire proprio una cosa come questa.

                luilomo wrote:una sub che richiami tutte ma mi da errore

                A questo punto devi dirmi che errore ottieni 🙂

                Presumo che non tutte siano sub pubbliche.

                #7183 Risposta

                vecchio frac
                Moderatore
                  14 pts

                  Per favore, la prossima volta fai un nuovo post, non modificarne uno vecchio (come hai fatto allegando l'immagine dell'errore) altrimenti rischia di sfuggire 🙂

                  Comunque il messaggio è chiaro: la sub "importAllXls" non esiste o non è accessibile.

                  Infatti si trova nel foglio1 (consiglio di mettere i moduli pubblici in un modulo).

                  In questo caso la sintassi corretta per chiamare la procedura è la qualifica piena del nome:

                  Call Foglio1.ImportAllXls

                  By the way, hai routine uguali in moduli diversi. Una volta che una routine è definita come pubblica, non serve replicarla perchè è visibile a tutto il progetto. Generalmente non è cosa buona avere routine diverse con lo stesso nome (ci sono due Sub Unzip, per esempio).

                  #7184 Risposta

                  luilomo
                  Partecipante

                    OK.  Gazie mille.

                    Pulisco il file e cancello routine non utili le usavo come bae da cui partire per integrare il codice.

                    Insomma ho creato in Frankestein Junior  "Si Può FAREEEEE"  😆 

                     Domanda se volessi togliere dal foglio1 la Public Sub e metterla in un modulo ci sono probelmi per le variabili etc...?

                    Le variabili in una sub pubblica sono disponibili (dichiarazione, valori etc..) anche nelle altre sub?

                    Al contrario nelle sub non pubbliche restano disponibili solo nella sub specifica e si azzerano quando si giunge a end sub?

                    Luigi

                     

                    #7185 Risposta

                    vecchio frac
                    Moderatore
                      14 pts

                      luilomo wrote: Domanda se volessi togliere dal foglio1 la Public Sub e metterla in un modulo ci sono problemi per le variabili etc...?

                      Assolutamente no. Le variabili devono rispettare  le regole della sintassi prevista ma sono uguali, nel funzionamento, sia che tu le usi nei moduli foglio che nei moduli standard. La cosa importante è che come prima riga di tutti i tuoi codici tu metta la direttiva "Option Explicit", sempre 🙂

                      luilomo wrote:Le variabili in una sub pubblica sono disponibili (dichiarazione, valori etc..) anche nelle altre sub?

                      No. Hanno visibilità solo locale, cioè interna alla sub in cui vengono usate.

                      Puoi però dichiarare variabili globali in testa al modulo, subito sotto Option Explicit: dichiarandole Private sono visibili solo al modulo in cui le dichiari, dichiarandole Global, Public o Dim diventano globali a tutto il progetto.

                       

                      luilomo wrote:Al contrario nelle sub non pubbliche restano disponibili solo nella sub specifica e si azzerano quando si giunge a end sub?

                      Questo è corretto. E' il concetto di visibilità (in inglese scope, si parla anche di "vita") della variabile. Non è che si "azzerano", semplicemente il loro spazio in memoria viene deallocato e reso disponibile per altre variabili. In pratica si annientano (a meno che non siano state dichiarate Static, nel qual caso mantengono il valore tra una chiamata e l'altra della routine).

                       

                      #7187 Risposta

                      luilomo
                      Partecipante

                        Ciao,

                        credo non i sia chiara la spiegazione delle variabili.

                        ok ho creato la sub tutto fuziona ma ora ho problemi nella gestione dei messaggi in base al comportamento dell'utente.

                        Come si vede dal codice presente nel file zip (messaggi precedenti) in ogni sub ho gestito ( a modo mio 🙄 ) i comportamento di "annulla" quando le sub sono avviate singolarmente. Fin qui nessun problema.

                        Ora Però avviando dalla Public sub RunAll, una volta arrivati alla prima Call, se l'utente   fa annulla già nella maschera di scelta dell'origine dei file la RunAll continua la sua esecuzione passando alla sub successiva. no buono

                        Pensavo di mettere in ogni sub il valore della variabile Rispall e fare un controllo con un If then per capire se l'utente ha avviato la procedura da Run All o dalla singola Sub. In questo modo posso bypassare i messaggi che al contrario devono essere presenti ad avvio singolo di ogni sub.

                        Risultato NON riesco a far passare il valore della variabile nelle singole sub.

                        Come faccio ad interrompere la RunAll?

                        Il comando "exit sub" nelel singole sub interrompe la sub singola ma la RunAll continua il suo percorso. 

                        Exit

                         

                        Eventualmente c'è un altro metodo?

                        Public Sub RunALL()
                        '
                        ' RunALL Macro
                        ' sub per eseguire gli aggiornamenti con un solo bottone
                        Dim Rispall As Integer
                            Rispall = MsgBox("AVVIO PROCEDURA AGGIORNAMENTO DATI" & vbNewLine & "Proseguire?", 1 + 48, "Aggiornamento dati")
                                If Rispall = 2 Then
                                 MsgBox "PROCEDURA ANNULLATA", 0 + 64, "Aggiornamento dati"
                                 Exit Sub
                                 Else
                                End If
                           Application.ScreenUpdating = False
                        Call manage_zips3
                        Call Foglio1.importAllXls
                        Call Foglio1.Split_link
                        Call Riepilogo
                        End Sub
                        #7188 Risposta

                        vecchio frac
                        Moderatore
                          14 pts

                          Nei msgbox puoi usare le costanti così non devi ricordarti i numeri 🙂

                          Option Explicit
                          
                          Public answer As Long
                          
                          Public Sub xRunALL()
                          '
                          ' RunALL Macro
                          ' sub per eseguire gli aggiornamenti con un solo bottone
                              If MsgBox("AVVIO PROCEDURA AGGIORNAMENTO DATI" & vbNewLine & "Proseguire?", vbOKCancel + vbExclamation, "Aggiornamento dati") = vbCancel Then
                                   MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                   Exit Sub
                              End If
                              
                              answer = 0
                              Call manage_zips3
                              If answer = vbNo Then
                                  MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                  Exit Sub
                              End If
                              
                              answer = 0
                              Call Foglio1.importallxls
                              If answer = vbNo Then
                                  MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                  Exit Sub
                              End If
                              
                              answer = 0
                              Call Foglio1.Split_link
                              If answer = vbNo Then
                                  MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                  Exit Sub
                              End If
                              
                              answer = 0
                              Call riepilogo
                              If answer = vbNo Then
                                  MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                  Exit Sub
                              End If
                          End Sub

                          per l'aspetto che riguarda la variabile pubblica answer, questa ti serve per far passare una variabile a tutti i moduli del progetto, rendendola pubblica e quindi modificabile da tutte le routine.

                          #7192 Risposta
                          albatros54
                          albatros54
                          Moderatore
                            7 pts

                            io apportere queste modifiche:

                             If answer = 2 Then
                                    MsgBox "PROCEDURA ANNULLATA", vbInformation, "Aggiornamento dati"
                                    Exit Sub

                            a tutte le chiamate

                            e nelle routine di chiamata aggiungerei questo

                            If ris1 = 2 Then
                            MsgBox "PROCEDURA ANNULLATA", 0 + 64, "AGGIORNAMENTO DATI"
                            answer = ris1
                            Exit Sub

                             

                             

                            Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                            Sempre il mare, uomo libero, amerai!
                            ( Charles Baudelaire )
                            #7196 Risposta

                            vecchio frac
                            Moderatore
                              14 pts

                              Tutto dipende dal valore di answer nelle varie subroutine chiamate; io avevo ipotizzato che i pulsanti disponibili fossero Yes e No ma va bene anche Ok e Cancel. Tra parentesi, preferisco l'uso delle costanti perchè sono più leggibili rispetto a "If answer = 2" 🙂

                              #7197 Risposta
                              albatros54
                              albatros54
                              Moderatore
                                7 pts

                                vecchio frac wrote:leggibili rispetto a "If answer = 2"

                                si , ma lui  in tutte le sub per uscire ,esce con il valore 2

                                 

                                 

                                Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                                Sempre il mare, uomo libero, amerai!
                                ( Charles Baudelaire )
                                #7200 Risposta

                                vecchio frac
                                Moderatore
                                  14 pts

                                  Che corrisponde a vbCancel ... l'importante è il concetto e che sappia gestire questo valore a livello di variabile pubblica.

                                Login Registrati
                                Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
                                Rispondi a: Estrarre file da archivi zip e smistarli in cartelle specifiche
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni:



                                albatros54
                                albatros54 - 453 risposte

                                vecchio frac - 412 risposte

                                patel
                                patel - 257 risposte

                                Marius44
                                Marius44 - 257 risposte

                                Luca73
                                Luca73 - 185 risposte