Domanda

Come si ottengono i dati del foglio di calcolo in Excel per ricalcolarlo dall'interno di VBA, senza il kluge di cambiare solo un valore di cella?

È stato utile?

Soluzione

Le seguenti righe faranno il trucco:

ActiveSheet.EnableCalculation = False  
ActiveSheet.EnableCalculation = True  

Modifica: il metodo .Calculate () non funzionerà per tutte le funzioni. L'ho testato su un foglio con funzioni di matrice add-in. Il foglio di produzione che sto usando è abbastanza complesso da non voler testare il metodo .CalculateFull () , ma potrebbe funzionare.

Altri suggerimenti

Questo dovrebbe fare il trucco ...

'recalculate all open workbooks
Application.Calculate

'recalculate a specific worksheet
Worksheets(1).Calculate

' recalculate a specific range
Worksheets(1).Columns(1).Calculate

A volte Excel si inceppa e ha bisogno di un kick-start per riapplicare un'equazione. Ciò accade in alcuni casi quando si utilizzano formule personalizzate.

Assicurati di avere il seguente script

ActiveSheet.EnableCalculation = True

Riapplica l'equazione scelta.

Cells(RowA,ColB).Formula = Cells(RowA,ColB).Formula

Questo può quindi essere ripetuto ciclicamente secondo necessità.

Potresti anche provare

Application.CalculateFull

o

Application.CalculateFullRebuild

se non ti dispiace ricostruire tutte le cartelle di lavoro aperte, piuttosto che solo il foglio di lavoro attivo. ( CalculateFullRebuild ricostruisce anche le dipendenze.)

Ho avuto un problema con la disattivazione di un'immagine di sfondo (una filigrana DRAFT) in VBA. La mia modifica non è stata mostrata (che è stata eseguita con il metodo Sheets (1) .PageSetup.CenterHeader = " " ) - quindi avevo bisogno di un modo per aggiornare. L'approccio ActiveSheet.EnableCalculation ha in parte risolto il problema, ma non ha riguardato le celle non utilizzate.

Alla fine ho trovato quello che mi serviva con un solo liner che faceva svanire l'immagine quando non era più impostata: -

Application.ScreenUpdating = True

Dopo un aggiornamento della connessione dati, alcuni UDF non erano in esecuzione. Usando una subroutine, stavo cercando di ricalcolare una singola colonna con:

Sheets("mysheet").Columns("D").Calculate

Ma la dichiarazione precedente non ha avuto effetto. Nessuna delle soluzioni precedenti ha aiutato, tranne il suggerimento di Kambeeks di sostituire le formule funzionato ed è stato veloce se il ricalcolo manuale è stato attivato durante l'aggiornamento. Di seguito il codice ha risolto il mio problema, anche se non esattamente responsabile di OP "kluge" commento, ha fornito una soluzione veloce / affidabile per forzare il ricalcolo delle celle specificate dall'utente.

Application.Calculation = xlManual
DoEvents
For Each mycell In Sheets("mysheet").Range("D9:D750").Cells
    mycell.Formula = mycell.Formula
Next
DoEvents
Application.Calculation = xlAutomatic
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top