Sviluppare funzionalita su Microsoft Office con VBA Application.Calculation = xlManual – Application.Calculation = xlAutomatic

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

    ABRAMO48
    Partecipante
      1 pt

      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!

       

      #27247 Score: 0 | Risposta

      tanimon
      Partecipante
        16 pts

        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

        #27248 Score: 1 | Risposta

        Luca73
        Partecipante
          58 pts

          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

          #27253 Score: 0 | Risposta

          zer0kelvin
          Partecipante
            5 pts

            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
            `
          Login Registrati
          Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
          Rispondi a: Application.Calculation = xlManual – Application.Calculation = xlAutomatic
          Gli allegati sono permessi solo ad utenti REGISTRATI
          Le tue informazioni: