Sviluppare funzionalita su Microsoft Office con VBA Barra di avanzamento posizione in una macro

Login Registrati
Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
  • Autore
    Articoli
  • #19163 Score: 0 | Risposta

    ildavepablo
    Partecipante

      Ciao a tutti,

      ho una  macro che salva salvare separatamente i fogli di un determinato file excel. 

      Il tread è questo: https://www.excelvba.it/forumexcel/forums/discussione/salvare-fogli-rename-su-un-altro-file/

      Vorrei chiedere una mano perché ho implementato alcune modifiche (la barra è quella con il form) :

      1) vorrei che il "contatore" non fosse legato al valore di una cella, ma ad un parametro variabile del file (ex il numero di fogli da salvare) >> quindi ho aggiunto un paio di comandi nel form (è corretto? Manca qualcosa?):

      Dim n As Integer
      ....
      
      'n = il tempo impostato
      n = Application.Sheets.Count + 10
      ....

      2) ho problemi ad inserire nella giusta posizione della  macro il comando, perché se la metto prima del ciclo parte la barra di aggiornamento e alla fine parte il salvataggio dei foglio, se la metto nel ciclo, ovviamente si ripete ad ogni salvataggio. ho provato a togliere il comando "DoEvents" dal form, ma anche in quel caso non funziona....

       

      perc = ActiveWorkbook.Path & "\"
      percorso = perc & "DIL.xlsx"
      Workbooks.Open percorso
      
      UserForm1.Show
      
      For i = 1 To ActiveWorkbook.Sheets.Count
      With Sheets(i)
      
      If .Range("B8") <> "" Then
      .Cells.Copy 'copia il foglio
      Workbooks.Add 'crea un nuovo file
      ActiveSheet.Paste 'incolla i dati
      
      'rinomina il file e lo salva
      NuovoFile = "DIL " & Range("A3").Value & " " & Range("A6").Value & ".xlsx"
      ActiveWorkbook.SaveAs Filename:=perc & NuovoFile
      ActiveWorkbook.Close 'chiude il file appena salvato
      End If
      End With
      
      Next i
      
      
      perc1 = ActiveWorkbook.Path & "\"
      percorso1 = perc1 & "DIL.xlsx"
      Workbooks.Open percorso
      
      
      NuovoFile1 = "_DIL " & Range("A6") & ".xlsx"
      ActiveWorkbook.SaveAs Filename:=perc1 & NuovoFile1
      
      ActiveWorkbook.Close 'chiude il file appena salvato
      
      End sub

      Grazie mille!!!

      #19166 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        Ciao, già in parte ho risposto nell'ultimo post a Guidoc.

        In questo tuo caso:

        1) l'oggetto Application non possiede la collection Sheets che invece appartiene al Workbook (del resto nel codice sottostante dimostri di saperlo); io poi preferisco l'insieme Worksheets che più propriamente si riferisce ai soli fogli di lavoro, mentre Sheets contiene in sè anche un riferimento ai Grafici (Charts):

        n = ActiveWorkbook.Worksheets.Count + 10
        #19167 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          Santa polenta, il parser si è mangiato il resto del post   

          #19168 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            Uffa sintetizzando il punto 2:

            2) il lavoro lungo deve essere inserito nel loop For Next del Userform (perchè è qui che si governa la progressbar) oppure piloti l'avanzamento della progressbar dentro il tuo codice. Attento in ogni caso ai giusti riferimenti degli oggetti coinvolti.

            #19171 Score: 0 | Risposta

            ildavepablo
            Partecipante

              ciao, non sono assolutamente esperto, sono alle primissime armi, non mi è molto chiaro, ma farò un po di tentativi...

              nel caso non riuscissi potrei per iniziare semplificare e la barra con un valore fisso (2secondi) si ripeterebbe per ogni ciclo ( salvataggio).

              provo

              grazie

              #19183 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                272 pts

                Aggiungendo un form non semplifichi ma complichi (perchè la gestione deve tener conto di oggetti diversi). La Statusbar potrebbe essere una valida alternativa. In ogni caso sarebbe utile lavorare sul file per poter aiutarti in modo più efficace.

                #19198 Score: 0 | Risposta

                ildavepablo
                Partecipante

                  Ciao VF,

                  grazie per il supporto. Il codice della macro (nel MODULO) è quello che trovi un paio di post più in alto.

                  Il codice del FORM, è quello del file che avevi preparato nell'articolo, per completezza te lo allego qui sotto:

                  Private Sub Label1_Click()
                  
                  End Sub
                  
                  Private Sub UserForm_Activate()
                  'visualizza un semplice userform con una progress bar
                  Dim i As Single
                  Dim n As Integer
                  
                  
                      'imposta alcune proprietà dell'userform
                      With UserForm1
                          .Label1.Caption = "Loading ..."
                          .ProgressBar1.Value = 0     'valore minimo della barra progresso
                          .ProgressBar1.Max = 100     'valore masismo
                          .Repaint    'ridisegna il form
                      End With
                  
                      'n = il tempo impostato
                      n = Worksheets.Count
                      
                      
                      'loop per n secondi
                      For i = 1 To n
                          'aggiorna il valore della progress bar simulandone il movimento
                          UserForm1.ProgressBar1.Value = (i / n) * 100
                          
                          'descrizione per l'utente
                          Label1 = "Individual Progress = " & Int((i / n) * 100) & "%"
                          
                          'permette l'esecuzione asincrona con altri eventi Windows
                          DoEvents
                          
                          'attende un secondo e continua
                          Application.Wait Now + TimeValue("00:00:01")
                      Next
                  
                      Unload UserForm1
                  
                  End Sub

                  Fammi sapere se devo fare qualcosa d'altro.

                  Grazie ancora.

                   

                  #19199 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    No, farò io il collage 🙂

                    #19246 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      Ti allego la mia proposta. Spero di non aver fatto errori nel considerare valida l'ultima macro di Supermario 🙂 In ogni caso il concetto è applicato correttamente e funziona.

                      Allegati:
                      You must be logged in to view attached files.
                      #19251 Score: 0 | Risposta

                      ildavepablo
                      Partecipante

                        grazie mille VF, proverò a utilizzare il codice e ti faccio sapere quanto prima!

                        Grazie ancora!

                        #19258 Score: 0 | Risposta

                        ildavepablo
                        Partecipante

                          Ciao VF, premetto che non mi piace il mero copia-incolla, ma cerco sempre di capire un po' il codice, così da poterlo riutilizzare da solo, sto provando a guardare la nuova macro, ma ho subito un dubbio:

                          Option Explicit
                          
                          Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
                          

                          potresti spiegarmi molto velocemente a cosa serve questo comando, non riesco a capirne il significato.

                          sto provando a cercare un po' in rete e, a quanto capito è un po'  come se "rallentasse" la macchina facendola lavorare a 32bit. E' così?

                          Grazie ancora

                          #19259 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            E' solo una comunissima API che serve a sospendere temporaneamente l'esecuzione del codice (valore espresso in millisecondi, così 3000 equivale a 3 sec). Non c'entra il far lavorare la macchina a 32 bit... è proprio uno "sleep" della macro 🙂

                            Mi è servito solo per simulare un pochino l'avanzamento della progressbar in modo credibile... l'esecuzione era troppo veloce sulla mia macchina e non si vedeva niente 😛

                            #19273 Score: 0 | Risposta

                            ildavepablo
                            Partecipante

                              Ciao VF,

                              funziona alla grande! perfetto!!     un ringraziamento  a te e Mario per il supporto!

                              Molto orgoglioso, perchè mi segnava alcuni errori, ma sono riuscito a capire il problema e sistemarli da solo (una cavolata, assegnare la variabile), ho anche aggiunte alcune piccole modifiche come disattiva schermo, msg box.... poca roba ma almeno inzio a muovermi un pochettino!

                              adesso vorrei aggiungere un ulteriore step grazie al quale si crea una copia di back-up del file rinominandolo con il giorno del salvataggio (ma questo dovrei riuscirci da solo)

                              grazie infinite!

                              #19278 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                ildavepablo ha scritto:

                                sono riuscito a capire il problema e sistemarli da solo

                                Ottimo, e io so anche il motivo... Option Explicit 🙂

                                ildavepablo ha scritto:

                                rinominandolo con il giorno del salvataggio

                                Con l'apposita funzione di formattazione delle stringhe puoi anche inserire l'orario nel nome di file salvato. Unico limite: la fantasia 🙂 (ma attento ai caratteri non ammessi da Windows nei nomi di file, come ad esempio due punti, slash, ecc.)

                                #19288 Score: 0 | Risposta

                                ildavepablo
                                Partecipante

                                  ho usato un fantastico....

                                  Format(Date, "dd mmm yy")

                                  e anche dimensionato ben 3 nuove variabili!     

                                  #19290 Score: 0 | Risposta

                                  vecchio frac
                                  Senior Moderator
                                    272 pts

                                    Complimenti finali meritati   

                                    Considera di non lasciare spazi vuoti nel file, potresti avere problemi se per avventura volessi lanciare quel file con una shell per mostrarlo all'utente una volta creato 😉

                                    #19304 Score: 0 | Risposta

                                    ildavepablo
                                    Partecipante

                                      Ciao VF grazie mille!!

                                      mi sa che si è perso il mio ultimo mex... cmq adesso mi hai mandato in sbattimento adesso 

                                      cerco di apportare una modifica cercando un po' in giro... immagno esista un con qualche comando tipo replace stringa " " con "_"

                                       

                                       

                                      #19305 Score: 0 | Risposta

                                      vecchio frac
                                      Senior Moderator
                                        272 pts

                                        ildavepablo ha scritto:

                                        esista un con qualche comando tipo replace stringa

                                        Già, si chiama proprio "Replace" 😀

                                        Ma non complicarti inutilmente la faccenda... se funziona, bene così

                                      Login Registrati
                                      Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
                                      Rispondi a: Barra di avanzamento posizione in una macro
                                      Gli allegati sono permessi solo ad utenti REGISTRATI
                                      Le tue informazioni: