› Sviluppare funzionalita su Microsoft Office con VBA › Barra di avanzamento posizione in una macro
-
AutoreArticoli
-
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 subGrazie mille!!!
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 + 10Santa polenta, il parser si è mangiato il resto del post
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.
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
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.
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 SubFammi sapere se devo fare qualcosa d'altro.
Grazie ancora.
No, farò io il collage 🙂
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.grazie mille VF, proverò a utilizzare il codice e ti faccio sapere quanto prima!
Grazie ancora!
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
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 😛
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!
sono riuscito a capire il problema e sistemarli da solo
Ottimo, e io so anche il motivo... Option Explicit 🙂
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.)
ho usato un fantastico....
Format(Date, "dd mmm yy")e anche dimensionato ben 3 nuove variabili!
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 😉
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 "_"
esista un con qualche comando tipo replace stringa
Già, si chiama proprio "Replace" 😀
Ma non complicarti inutilmente la faccenda... se funziona, bene così
-
AutoreArticoli
