Se si desidera visualizzare un esempio abbastanza chiaro del motivo per cui ScreenUpdating
è importante, eseguire il seguente codice. In Excel 2011 ci vogliono circa 45 volte più a lungo per eseguire questo swap senza ScreenUpdating = false
! Questa è una differenza enorme nel tempo.
Sub testScreenUpdating()
Dim i As Integer
Dim numbSwitches As Integer
Dim results As String
'swap between sheets this number of times
numbSwitches = 1000
'keep track of time
Dim startTime As Double
startTime = Time
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
'get results
results = "Screen Updating not disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
startTime = Time
'scenario 2 - screenupdating disabled
Application.ScreenUpdating = False
'swap between sheets 1/2 (need both sheets or this will crash)
For i = 1 To numbSwitches
Sheets(1 + (i Mod 2)).Select
Next i
Application.ScreenUpdating = True
'get results for part two
results = results & vbCrLf & "Screen Updating IS disabled: " & Format(Time - startTime, "hh:mm:ss") & " seconds"
'show results
MsgBox results
End Sub
Inoltre, già che siamo in tema di modi per aumentare l'efficienza, un altro punto chiave è che Select
, Selection
, e Activate
sono raramente (se non mai) necessario. Quando si registrano i macro, verranno sempre utilizzati, ma ci sono pochissime situazioni in cui è necessario utilizzarli effettivamente nel codice. Allo stesso modo, qualsiasi cosa con Active
nel titolo (ad esempio ActiveCell
) è normalmente un'indicazione che si avrà codice più lento perché si presume che si selezionino le celle.
Si può quasi sempre fare riferimento a celle/fogli di lavoro in modo specifico ed evitare di selezionare.Ad esempio:
msgbox (Worksheets(1).Range("A1").value)
funzionerà indipendentemente dal fatto che si sia attualmente sul primo foglio di lavoro. Un nuovo errore VBA comune è quello di fare qualcosa di più simile:
Worksheets(1).Select
msgbox (Range("A1").value)
che è un passaggio non necessario.
Questo aggiunge un tempo significativo al codice in runtime.
A seconda di cosa sta facendo il codice, l'impostazione di "Application.Calculation" su "manual" spesso ti darà anche un grande incremento di velocità. In genere esegui entrambe le operazioni per una macro con esecuzione prolungata. Non dimenticare di resettare il calcolo, è un'impostazione persistente. –
Inoltre, con l'esecuzione di 'Screenupdating' disattivato è possibile consentire all'utente di conoscere l'avanzamento tramite' Application.Statusbar = '. Quindi imposta 'False' per riportarlo alla normalità. Alcune persone hanno bisogno di vedere i progressi altrimenti pensano che il loro computer si sia bloccato e costretto a chiudere tutto. – Rory
Ho anche letto che il formato dati predefinito in Excel è effettivamente Valuta, quindi è preferibile utilizzare Valuta come valore di dati anziché Double quando possibile per evitare la conversione dei dati. –