Il tuo file contiene circa 30mila volte la funzione OGGI; questa e' "volatile", cioe' si ricalcola in continuazione, e con ciò si porta dietro il ricalcolo di tutte le celle "subordinate"; un lavoro immane.
D'altra parte un Cerca.Vert su 1000-10mila righe sarebbe un'operazione assolutamente normale.
Facciamo cosi':
-in File /Opzioni /Formule imposta transitoriamente il ricalcolo della cartella di lavoro = Manuale
-usiamo la cella Dati!A1 per inserirvi la data odierna; metti per ora la data manualmente, da tastiera
-col comado Trova, cerca "oggi()", senza virgolette; usa le opzioni
In = Cartella di lavoro e
Cerca in = Formule; non eseguire ancora il comando
-sul tab Sostituisci inserisci "Dati!A1", senza virgolette
-premi
Sostituisci tutto e aspetta qualche secondo fino al messaggio di completamento
-in File /Opzioni /Formule riporta il ricalcolo della cartella di lavoro = Automatico
A questo punto tutti i ricalcoli dovrebbero essere grandemente velocizzati
Per popolare la cella Dati!A1 con la data, possiamo aggiungere questo codice all'interno del modulo "QuestaCartellaDiLavoro /ThisWorkbook" del vba:
- Codice: Seleziona tutto
Private Sub Workbook_Open()
Sheets("Dati").Range("A1") = Int(Now)
End Sub
Per identificare la posizione del modulo vba, vedi
viewtopic.php?f=26&t=103893&p=647675#p647675In questo modo la data viene compilata automaticamente all'apertura del file (se invece tieni il file aperto da un giorno all'altro allora troveremo un altro "evento" con cui aggiornare la data)
Vedo che la tua "Tabella_articoli" (la matrice usata nel Cerca.Vert) e' il ordine crescente: questo potrebbe farci usare un'altra formulazione del Cerca.Vert, con una formula pero' leggermente piu' complicata. Ma con le righe in gioco secondo me il gioco non vale la candela.
Inoltre le versioni piu' recenti (da un anno a questa parte) hanno ridotto il divario di prestazioni tra elenchi ordinati e disordinati
Le modifiche cosi' fatte secondo me avranno gia' impatto sull'esecuzione di INSERIMENTO_DATI; per ulteriore precauzione possiamo aggiungere questi blocchi di informazioni in queste due posizioni:
- Codice: Seleziona tutto
'.. codice esistente
'..
MsgBox (" Dati Incompleti")
End
End If
'PRIMO BLOCCO DA AGGIUNGERE >>>
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'<<< FINE BLOCCO
Range("Riga_dati").Select
Selection.Copy
'..
'..
'..
'..
Range("A1").Select
'Range("Data").Select
'SECONDO BLOCCO DA AGGIUNGERE >>>
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculate
'<<< FINE BLOCCO
End Sub
Ci sarebbero ulteriori miglioramenti che potrebbero essere apportati, principalmente evitare gli spostamenti tra i fogli, ma richiede una migliore conoscenza di cosa dovrebbe fare la macro quindi mi lascio questa opzione nel caso che i miglioramenti (con quanto fin qui suggerito) non siano adeguati.
Ciao