› Sviluppare funzionalita su Microsoft Office con VBA › Application.Calculation = xlManual – Application.Calculation = xlAutomatic
-
AutoreArticoli
-
Buongiorno.
L'utilizzo delle due istruzioni in oggetto prima e dopo l'esecuzione di un codice permette di velocizzare al massimo l'esecuzione dello stesso.
Idealmente si potrebbe piazzare "sistematicamente" la xlManual all'inizio di ogni sub e la xlAutomatic prima di "qualsiasi" uscita dalla stessa.
Ma, se all'interno di una sub aggiorniamo la cella A9 e poi testiamo la cella XX99 (per dire ...) che dipende dalla ..., che dipende dalla ..,. che dipende, che dipende dalla A9, il risultato del test è falsato poiché essendo il calcolo"sospeso" la cella XX99 non è aggiornata. Giusto?
E, in una sub complessa (in una architettura di dati complessa), l'intreccio delle dipendenze può essere complicato e difficile da controllare, e poi è sempre possibile che, in un aggiornamento successivo, un'altra cella testata diventi dipendente dalla A9 (nell'esempio sopra) mentre prima non lo era.
Da queste considerazioni si arriverebbe alla conclusione che usare le xlManual/xlAutomatic sia molto pericoloso e quindi sia meglio lasciar perdere e tenerci i tempi lunghi ma "sicuri".
E anche infarcire la sub di continue coppie di xlManue/xlAutomatic (sperando di non saltarne qualcuna, prima o poi) non sembrerebbe molto pratico.
Però, in molte ricerche in merito trovo molto consigliato l'utilizzo di questo sistema (otre agli altri noti: screenUpadating, enableEvents, ...) per accelerare l'esecuzione.
Ma io dico: in un'architettura di cartelle, fogli e celle complessa può essere "infernale" prevenire le interdipendenze (attivando la xlAutomatic e poi ripristinando la xlManual) e facile non prevenirle tutte, prima o poi.
E' sbagliato il mio ragionamento? Che mi dite?
Grazie!
ciao,
in linea di principio concordo in buona parte con te, ma ovviamente dipende dalla struttura dei fogli del file in esame.
Se zeppo di formule è consigliabile "sospendere" il calcolo automatico con le relative conseguenze.
Viceversa secondo il mio parere, se sono presenti poche o nessuna formula, in tempi di esecuzione l'elaborazione del codice non ne trae nessun beneficio.
Frank
Ciao,
secondo me dipende molto da ciò che la macro deve fare.
se deve elaborare o modificare dati è chiaro che non far ricalcolare falsa i dati mentre se la macro non ha lo scopo di modificare dati allora è funzionale.
Se penso di avere una tabella piena di dati e formule che non modifico e uso la macro senza toccare i dati il vantaggio sarà notevole.
chiaramente se la macro è una serie di algoritmi per trovare soluzioni numeriche allora sicuramente non può essere usato.
Non penso si possa generalizzare.
Ciao
Luca
Ciao a tutti.
Basta un
Application.Calculate
oppure
Worksheet.Calculate
se si deve ricalcolare un solo foglio.
PS:
In generale è scorretto ripristinare una proprietà ad un valore di default che non è noto a priori.
Per esempio: l'utilizzatore potrebbe aver deciso, per motivi suoi, di impostare il ricalcolo manuale.
Eseguendo la macro che tu descrivi, il ricalcolo verrebbe reimpostato su automatico, e l'utilizzatore potrebbe non apprezzare.
E' più corretto memorizzare lo stato di Application.Calculation in una variabile e usare la variabile per ripristinare lo stato precedente all'esecuzione della macro
` Dim Clc As XlCalculation Clc = Application.Calculation Application.Calculation = xlCalculationManual ' 'altre istruzioni della macro ' Application.Calculation = Clc ` -
AutoreArticoli
