Ottenere Excel per aggiornare i dati sul foglio dall'interno di VBA
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?
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