indicatore di progressione macro
Hai un problema con Excel? 
indicatore di progressione macro
di Textomb data: 28/10/2012 16:41:55
Salve a tutti.
potreste darmi qualche indicazione in merito alla visualizzazione di un indicatore di progressione sulla macro?
Cioè, si può visualizzare la percentuale di progressione di una macro una volta che è stata lanciata?
grazie mille.
grafico
di GIUS (utente non iscritto) data: 28/10/2012 17:26:06
allego un MERCATO con dei dati fasulli e dei nomi fasulli che poi successivamente dovro cambiare. solo l'intestazione è della società a cui lavoro che lascio anche perchè sarebbe una sorta di pubblicita, tra l'altro poi togliendola scompaginerei tutto.
Il problema è che vorrei creare per ogni fogliodei grafici in pila o con linee che uniscono punto per punto, di modo che ho un'impatto visivo di chi contribuisce maggiormente.
Inoltre vorrei che apparisse un foglio finale che chiamo GRAFICI in cui ci fosse un riporto di tutti i grafici che si sovrappongono ( credo che il grafico a linee punto per punto sia il migliore a rendere l'idea) e posso desumere il mese con maggiore entrata di danaro, presumo che l'asse delle ascisse debba avere i nomi di tutti i contribuenti e quello delle ordinate il danaro, ossia €.
Grazie, cordiali saluti
Spero si possa fare
di Vecchio Frac data: 28/10/2012 19:03:51
@Gius
Devi iniziare una discussione nuova, non proseguire una discussione già iniziata per proporre un quesito.
Apri un nuovo thread, grazie.
@Textomb
Se interpreto bene quel che chiedi, ci sono diversi metodi interessanti per visualizzare un progressivo, dalla Statusbar (dove Excel scrive "Pronto" in basso a sinistra) a un riempimento di una cella man mano che la progressione aumenta, fino alla versione più sofisticata che mette in mezzo una userform e un controllo ProgressBar.
Pochi giorni fa per un altro utente avevo studiato e allegato un progettino con le tre possibilità.
Adesso lo cerco :)
di Vecchio Frac data: 28/10/2012 19:09:13
Ho trovato il thread ("Domanda su funzione RND" di Attilio) ma l'allegato purtroppo è sparito perché sono passati alcuni giorni. Dovrei recuperare il file domani in ufficio. Se magari vedi che mi dimentico, fammi un promemoria :)
di Vecchio Frac data: 29/10/2012 08:04:14
Ho allegato il file .rar con gli esempi che dicevo.
di Textomb data: 30/10/2012 08:59:48
Grazie mille Vecchio Frac.
ho visto la routine che mi hai inviato. Mi sarà certamente utile in futuro. Il problema però è che in quella routine sono io che imposto inizialmente il valore in secondi del Tempo che deve trascorrere. cella F2.
Ma, nel mio caso, devo valutare il tempo che impiegherà il processore ad eseguire la macro. Ovviamente il tempo in questo caso è estremamente variabile in funzione della quantità di dati che deve analizzare. Può essere 5 secondi ma anche 2 minuti. Come faccio a calcolarlo in anticipo e passare quel valore alla cella F2?
Esiste un sistema, anche approssimativo, ma efficace...?
Saluti
di Vecchio Frac data: 30/10/2012 10:56:23
Bella domanda.
Penso che non ci sia una risposta facile da darti.
Anzitutto è sempre bene impostare la clessidra all'inizio del lavoro, tanto per informare visivamente l'utente che la macchina è impegnata: application.cursor = xlWait (da ripristinare al termine con xlDefault).
Il tempo di esecuzione dipende da una marea di informazioni variabili: cicli for oppure while o do...loop nel codice, condizioni da verificare con if o iif, attese derivante dal ricalcolo di formule esistenti.
Se devi analizzare una cartella con dei file, aprire i file e leggerne un valore, puoi sapere prima quanti file devi trattare e prevedere una stima di tre-cinque secondi a file.
Se devi eseguire dei filtri, estrarre dati, riordinare i dati, copiarli su altri fogli, salvare i file, puoi stimare sette-otto secondi. Dipende anche dal processore in uso.
Dovresti eseguire alcuni test con quantità minime di dati e quantità massime di dati e poi stimare una media. Excel fornisce la variabile di sistema Timer che puoi consultare all'inizio e alla fine della Sub per sapere quanti secondi-decimi-centesimi sono trascorsi.
Pensa se da qualche parte hai un dato oggettivabile in partenza (devo leggere tot file, devo accedere a una risorsa di rete, devo riempire un milione di celle, ho un ciclo che va da qui a lì etc.).
di Textomb (utente non iscritto) data: 30/10/2012 23:25:36
Ho provato a testare la macro con alcuni esempi di prova come mi hai suggerito impostando il Timer e registrando i tempi di esecuzione delle singole parti di codice.
In effetti la macro esegue diversi cicli nidificati ed elabora parecchi dati.
In base alla richiesta, proveniente da una userform, si attivano dei filtri sulla tabella principale e poi mi restituisce dei risultati. Purtroppo, come dici tu, il tempo di elaborazione è fortemente variabile. Insomma forse mi conviene trovare un metodo per ottimizzare il codice ed evitare di apsettare diversi minuti quando la richesta diventa troppo complessa.
A tal proposito farò un'altra domanda. Ma aprirò una nuova discussione...
Questa la chiudiamo così. La cosa mi pare troppo incasinata.
di Vecchio Frac data: 31/10/2012 09:23:34
Mi vien da suggerirti proprio questo: allega un progetto di esempio (senza dati privati) con tutto il codice coinvolto, così vediamo se si può migliorare l'esecuzione. In questi giorni abbiamo ridotto ad un altro utente sia la dimensione del file (da venti mega a mezzo mega) sia la velocità di esecuzione (da quaranta minuti a pochi secondi) semplicemente ottimizzando il codice ed evitando formule sul foglio (probabilmente quel progetto non è finito, ma la strada intrapresa è buona).
di Textomb data: 31/10/2012 12:43:08
ok. Provo più tardi ad estrarre il codice responsabile delle perdite di tempo e lo mando per una diagnosi completa...
Grazie mille.
di Textomb data: 31/10/2012 13:48:47
Ho allegato il progetto completo senza Dati privati...
La parte di codice responsabile del maggior tempo di attesa pare sia il ciclo Do Loop until che esegue...
In ogni caso, mi scuso per gli "orrori" riscontrati nel corso della vostra disamina. Come detto in precedenza non sono un esperto.
Però curioso di imparare tecniche nuove e migliorare così le mie capacità per il futuro.
Resto in attesa...
cordialità
di Vecchio Frac data: 31/10/2012 15:00:50
Neanche Noi (maiestatico ^_^) siamo degli esperti, cioè non siamo programmatori di professione.
Tanta buona volontà, un pizzico di esperienza sul campo e voglia di aiutare gli altri così come siamo stati a suo tempo aiutati da altri.
Abbi però pazienza, devo completare un verbale urgente altrimenti il Capo mi licenzia :)
di Textomb data: 31/10/2012 16:58:38
nessun problema per l'attesa...
ci mancherebbe.
di Vecchio Frac data: 01/11/2012 18:08:16
Il progetto è particolarmente complesso.
Il codice è stato anche scritto bene, io non avrei molte modifiche da fare se non alcune piccole modifiche stilistiche.
Principalmente occhio a indentare meglio, per una miglior leggibilità :)
In alcuni punti del codice di userform si possono studiare semplici cicli per ridurre il codice.
Un esempio per tutti, in UserForm_Activate invece di ridondare col codice per settare a False in avvio i mesi ti basta un paio di righe come queste:
For i = 1 To 12
Controls("mese" & i) = False
Next
Controls("mese" & Month("1 " & MyMonth)) = True
Soprattutto comunque raccomando ovunque Option Explicit.
Nel merito, non riesco a farlo funzionare correttamente perchè, per dirne una, il mio Excel 2003 non supporta l'Operator xlFilterValues nel filtro Avanzato. Ho ottenuto risultati strani togliendolo :)
Il problema principale, quello dell'esecuzione e della sua misurazione, non è di poco conto.
Suggerisco di utilizzare ove possibile Application.Cursor = xlWait per indicare un'attesa.
Molto probabilmente si otterrebbe un risultato apprezzabile sostituendo tutte le formule che vengono inserite dal codice nelle celle con il valore corrispondente calcolato dal codice stesso.
Per esempio, per centrarne una,
Rec.Cells(recFR, 7).FormulaR1C1 = "=VLOOKUP(RC[-1],tariffe!R3C1:R26C2,2,FALSE)"
potrebbe essere calcolata da WorksheetFunction.VLookup() e quindi inserita in Rec.Cells(recFR,7) direttamente.
Eliminando di inserire le formule nelle celle si dovrebbero ridurre sensibilmente i tempi di esecuzione.
Il progetto è comunque sottilmente complesso e ti lascio la decisione di avviare o meno, magari con il nostro supporto, l'operazione di conversione, visto che potrebbe volerci un tempo piuttosto lungo.
di Textomb data: 01/11/2012 19:46:32
Grazie Vecchio Frac.
Se uno con la tua esperienza mi dice che il codice è stato scritto bene ci credo.
Sinceramente non avevo mai avuto la possibilità fin oggi, di scambiare nel merito del codice che scrivo con chi è più competente di me. Soprattutto perchè ho imparato senza una guida. Ma leggendo qua e la...
Ti ringrazio per i suggerimenti che mi hai dato.
Per esempio a proposito del ciclo sulla userform nei mesi. Io ci avevo provato ma mi dava errore. Pensavo non si potesse fare un ciclo di questo tipo su una userform. Ecco perchè avevo scelto la strada più lunga...
Le formule nelle celle non le posso sostituire con i rispettivi valori perchè, se lo facessi, al cambiare delle tariffe i valori non si aggiornerebbero in tempo reale. Cosa che invece mi serve avere...
Proverò i tuoi suggerimenti... ti farò sapere.
di Vecchio Frac data: 01/11/2012 21:28:11
cit. " Le formule nelle celle non le posso sostituire con i rispettivi valori perchè, se lo facessi, al cambiare delle tariffe i valori non si aggiornerebbero in tempo reale. "
---> Non ho assaggiato che superficialmente tutte le potenzialità del modello, ed è indiscutibile il suo pregio operativo. E' ovviamente adatto alle tue esigenze e evidentemente costruito con pazienza, pezzo per pezzo, nel tempo. Gli intrecci tra codice e formule sono molteplici e ti sconsiglio, alla luce di queste considerazioni, l'intervento che avevo suggerito.
Anch'io ho imparato senza una Guida e conosco la soddisfazione che si ha quando si raggiungono certi risultati ^_^
Torniamo al quesito iniziale.
Per stimare il tempo di esecuzione, e presentare nella status bar una barra di progressione che dia indicazione sul tempo che trascorre durante l'esecuzione dei calcoli, imposta lo scenario più sfavorevole che puoi immaginare, alla maggior complessità possibile, e con un paio di debug.print timer all'inizio e alla fine ottieni i secondi (minuti) necessari. Quindi prima dell'ok sull'userform calcoli la complessità delle operazioni che stai per effettuare pesando le opzioni scelte e il tempo massimo raggiungibile. Sei ingegnere e non vengo a insegnarti il tuo mestiere ;)
di Textomb data: 02/11/2012 14:59:37
Grazie per i tuoi suggerimenti.
Ho abbandonato l'idea della stima del tempo di esecuzione della macro in quanto è troppo complesso da calcolare con una certa precisione. Gli scenari possibili sono molteplici. Tra l'altro, quando cambio computer, si modificano sensibilmente i tempi registrati vanificando tutto il lavoro svolto.
Ho, a questo punto, implementato un sistema che, attraverso la progressBar, indica visivamente, a che punto é il codice eseguito (10%, 20% ...ecc). Ovviamente la progressione viene calcolata in modo proporzionale al numero di cicli da sviluppare e quindi rende perfettamente l'idea di quanto ci vuole ancora per completare. Ritengo questo un buon compromesso.
Resto sempre grato. Alla prossima tematica...
di Textomb data: 02/11/2012 15:04:58
Posso chiederti come mai sei rimasto ancorato al tuo excel 2003?
saluti
di Vecchio Frac data: 02/11/2012 21:55:43
cit. " Ritengo questo un buon compromesso. "
---> Spesso è necessario che siano i nostri utenti a sottostare alle esigenze dei programmatori e non viceversa altrimenti ti fanno impazzire ^_^
cit. " Posso chiederti come mai sei rimasto ancorato al tuo excel 2003? "
---> Non mi piace per niente il restyiling dei nuovi strumenti Office. Conosco a memoria i menu fino alla versione 2003 e mi perdo nel cercare i menu corrispondenti nel nuovo Ribbon. Mi dà gran fastidio l'anteprima dinamica che Word mi fa di formattazione testo e paragrafi. Mi angoscia l'incompatibilità di fondo del nuovo Access. Mi sconcertano i nuovi formati docx, docm, xlsx, xlsm e via dicendo. In ufficio lavoriamo con XP e suite 2003, ma pian piano stanno serpeggiando le nuove versioni :)
Ovviamente ho una suite 2007 installata su macchina virtuale (ho aperto con questa il tuo file e sono rimasto affascinato dalle sparklines che nel tuo file mostrano la percentuale di occupazione dei posti). Prima o poi dovrò decidermi a fare il grande passo e rassegnarmi al nuovo che avanza :P
di Textomb data: 02/11/2012 23:32:25
In effetti ho lavorato per molto tempo anch'io con le versioni precedenti di Office e di excel.
Non avevo mai avuto l'esigenza di spingermi con l'utilizzo delle macro.
Riuscivo sempre a districarmi con le funzionalità di base offerte dalle funzioni in chiaro.
Poi, ho "dovuto" migrare nella versione 2007 e, in ultimo nella 2010. Questo perchè altri colleghi la usavano e quindi mi sono dovuto adeguare.
Devo però ammettere che le caratteristiche innovative sono davvero tante. Per esempio ho risolto molti problemi con l'utilizzo delle tabelle pivot e dei grafici sparkline... Ti consiglio di vincere le tue resistenze. Vedrai resterai soddisfatto.
Vuoi Approfondire?