10 modi per velocizzare le tue macro

Man mano che le macro di Excel diventano sempre più robuste e complesse, potresti scoprire che perdono prestazioni. Quando si parla di macro, la parola performance è solitamente sinonimo di velocità . La velocità è la velocità con cui le procedure VBA eseguono le attività previste. Di seguito sono riportati dieci modi per mantenere le macro di Excel in esecuzione al loro livello di prestazioni ottimale.

Calcoli del foglio di arresto

Sapevi che ogni volta che una cella che influisce su una formula nel tuo foglio di calcolo viene modificata o manipolata, Excel ricalcola l'intero foglio di lavoro? Nei fogli di lavoro che hanno una grande quantità di formule, questo comportamento può rallentare drasticamente le macro.

È possibile utilizzare la proprietà Application.Calculation per indicare a Excel di passare alla modalità di calcolo manuale. Quando una cartella di lavoro è in modalità di calcolo manuale, la cartella di lavoro non verrà ricalcolata finché non si attiva esplicitamente un calcolo premendo il tasto F9.

Metti Excel in modalità di calcolo manuale, esegui il codice e quindi torna alla modalità di calcolo automatico.

Sottomacro1()
Application.Calculation = xlCalculationManual
 'Inserisci qui il tuo codice macro
Applicazione.Calcolo = xlCalcoloAutomatico
Fine sottotitolo

L'impostazione della modalità di calcolo su xlCalculationAutomatic attiverà automaticamente un ricalcolo del foglio di lavoro, quindi non è necessario premere il tasto F9 dopo l'esecuzione della macro.

Disabilitare l'aggiornamento dello schermo del foglio

Potresti notare che quando vengono eseguite le macro, lo schermo fa una discreta quantità di sfarfallio. Questo sfarfallio è un tentativo di Excel di ridisegnare lo schermo per mostrare lo stato corrente del foglio di lavoro. Sfortunatamente, ogni volta che Excel ridisegna lo schermo, occupa risorse di memoria.

È possibile utilizzare la proprietà Application.ScreenUpdating per disabilitare gli aggiornamenti dello schermo fino al completamento della macro. La disattivazione dell'aggiornamento dello schermo consente di risparmiare tempo e risorse, consentendo alla macro di essere eseguita un po' più velocemente. Al termine dell'esecuzione del codice macro, puoi riattivare l'aggiornamento dello schermo.

Sottomacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 'Inserisci qui il tuo codice macro
Applicazione.Calcolo = xlCalcoloAutomatico
Application.ScreenUpdating = True
Fine sottotitolo

Dopo aver impostato la proprietà ScreenUpdating su True, Excel attiverà automaticamente un ridisegno dello schermo.

Disattivazione degli aggiornamenti della barra di stato

La barra di stato di Excel, che appare nella parte inferiore della finestra di Excel, normalmente mostra lo stato di avanzamento di determinate azioni in Excel. Se la tua macro funziona con molti dati, la barra di stato occuperà alcune risorse.

È importante notare che la disattivazione dell'aggiornamento dello schermo è separata dalla disattivazione della visualizzazione della barra di stato. La barra di stato continuerà ad essere aggiornata anche se disabiliti l'aggiornamento dello schermo. Puoi utilizzare la proprietà Application.DisplayStatusBar per disabilitare temporaneamente gli aggiornamenti della barra di stato, migliorando ulteriormente le prestazioni della tua macro:

Sottomacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'Inserisci qui il tuo codice macro
Applicazione.Calcolo = xlCalcoloAutomatico
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Fine sottotitolo

Dire a Excel di ignorare gli eventi

È possibile implementare le macro come procedure evento, indicando a Excel di eseguire un determinato codice quando un foglio di lavoro o una cartella di lavoro vengono modificati.

A volte, le macro standard apportano modifiche che attiveranno una procedura evento. Ad esempio, se si dispone di una macro standard che manipola più celle su Sheet1, ogni volta che viene modificata una cella su quel foglio, la macro deve essere messa in pausa durante l'esecuzione dell'evento Worksheet_Change.

È possibile aggiungere un altro livello di miglioramento delle prestazioni utilizzando la proprietà EnableEvents per indicare a Excel di ignorare gli eventi durante l'esecuzione della macro.

Impostare la proprietà EnableEvents su False prima di eseguire la macro. Al termine dell'esecuzione del codice della macro, è possibile impostare nuovamente la proprietà EnableEvents su True.

Sottomacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Inserisci qui il tuo codice macro
Applicazione.Calcolo = xlCalcoloAutomatico
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Fine sottotitolo

Nascondere le interruzioni di pagina

Ogni volta che la tua macro modifica il numero di righe, modifica il numero di colonne o altera l'impostazione della pagina di un foglio di lavoro, Excel è costretto a impiegare del tempo per ricalcolare le interruzioni di pagina mostrate sul foglio.

Puoi evitare questo comportamento semplicemente nascondendo le interruzioni di pagina prima di avviare la macro.

Impostare la proprietà del foglio DisplayPageBreaks su False per nascondere le interruzioni di pagina. Se vuoi continuare a mostrare le interruzioni di pagina dopo l'esecuzione della macro, imposta nuovamente la proprietà del foglio DisplayPageBreaks su True.

Sottomacro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Inserisci qui il tuo codice macro
Applicazione.Calcolo = xlCalcoloAutomatico
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
Fine sottotitolo

Sospensione degli aggiornamenti della tabella pivot

Se la tua macro manipola tabelle pivot che contengono origini dati di grandi dimensioni, potresti riscontrare prestazioni scadenti quando esegui operazioni come l'aggiunta o lo spostamento dinamico di campi pivot.

You can improve the performance of your macro by suspending the recalculation of the pivot table until all pivot field changes have been made. Simply set the PivotTable.ManualUpdate property to True to defer recalculation, run your macro code, and then set the PivotTable.ManualUpdate property back to False to trigger the recalculation.

Sub Macro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Place your macro code here
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
End Sub

Steering clear of copy and paste

It’s important to remember that although Macro Recorder saves time by writing VBA code for you, it does not always write the most efficient code. A prime example is how Macro Recorder captures any copy-and-paste action you perform while recording.

You can give your macros a slight boost by cutting out the middleman and performing a direct copy from one cell to a destination cell. This alternate code uses the Destination argument to bypass the clipboard and copy the contents of cell A1 directly to cell B1.

Range("A1").Copy Destination:=Range("B1")

If you need to copy only values (not formatting or formulas), you can improve performance even more by avoiding the Copy method all together. Simply set the value of the destination cell to the same value found in the source cell. This method is about approximately 25 times faster than using the Copy method:

Range("B1").Value = Range("A1").Value

If you need to copy only formulas from one cell to another (not values or formatting), you can set the formula of the destination cell to the same formula contained in the source cell:

Range("B1").Formula = Range("A1").Formula

Using the With statement

When recording macros, you will often manipulate the same object more than once. You can save time and improve performance by using the With statement to perform several actions on a given object in one shot.

The With statement utilized in the following example tells Excel to apply all the formatting changes at one time:

    With Range("A1").Font
    .Bold = True
    .Italic = True
    .Underline = xlUnderlineStyleSingle
    End With

Prendere l'abitudine di suddividere le azioni in istruzioni With non solo manterrà le tue macro più veloci, ma renderà anche più facile leggere il tuo codice macro.

Evitare il metodo Select

Macro Recorder utilizza il metodo Select per selezionare in modo esplicito gli oggetti prima di eseguire azioni su di essi. In genere non è necessario selezionare gli oggetti prima di lavorarci. In effetti, è possibile migliorare notevolmente le prestazioni delle macro non utilizzando il metodo Select.

Dopo aver registrato i tuoi macro, prendi l'abitudine di modificare il codice generato per rimuovere i metodi Select. In questo caso, il codice ottimizzato sarebbe simile al seguente:

    Fogli("Foglio1").Intervallo("A1").FormulaR1C1 = "1000"
    Fogli("Foglio2").Intervallo("A1").FormulaR1C1 = "1000"
    Fogli("Foglio3").Intervallo("A1").FormulaR1C1 = "1000"

Notare che non viene selezionato nulla. Il codice utilizza semplicemente la gerarchia degli oggetti per applicare le azioni necessarie.

Limitare i viaggi al foglio di lavoro

Un altro modo per accelerare i macro è limitare la quantità di volte in cui si fa riferimento ai dati del foglio di lavoro nel codice. È sempre meno efficiente acquisire i dati dal foglio di lavoro che dalla memoria. Vale a dire, le tue macro verranno eseguite molto più velocemente se non devono interagire ripetutamente con il foglio di lavoro.

Ad esempio, il seguente semplice codice forza VBA a tornare continuamente a Sheets ("Sheet1").Range ("A1") per ottenere il numero necessario per il confronto eseguito nell'istruzione If:

Per ReportMonth = da 1 a 12
     If Range("A1").Value = ReportMonth Then
     MsgBox 1000000 / ReportMese
Finisci se
Prossimo ReportMese

Un metodo molto più efficiente consiste nel salvare il valore in Sheets("Sheet1").Range("A1") in una variabile chiamata MyMonth. In questo modo, il codice fa riferimento alla variabile MyMonth anziché al foglio di lavoro:

Dim MyMonth as Integer
MioMese = Intervallo("A1").Valore
Per ReportMonth = da 1 a 12
Se MyMonth = ReportMonth allora
MsgBox 1000000 / ReportMese
Finisci se
Prossimo ReportMese

Prendi in considerazione l'utilizzo delle variabili per lavorare con i dati in memoria anziché fare riferimento direttamente ai fogli di lavoro.

Evitare riferimenti eccessivi

Quando si chiama un metodo o una proprietà di un oggetto, è necessario che passi attraverso l'interfaccia IDispatch del componente OLE. Le chiamate a questi componenti OLE richiedono tempo, pertanto la riduzione del numero di riferimenti ai componenti OLE può migliorare la velocità del codice macro.

Per l'invocazione di proprietà o metodi dell'oggetto viene generalmente utilizzato il metodo di rappresentazione di  Object.Method  , ovvero il "." Il simbolo viene utilizzato per richiamare proprietà e metodi.

Pertanto, il numero di chiamate a metodi o proprietà può essere giudicato in base al numero di simboli ".". Meno "." simbolo, più velocemente viene eseguito il codice.

Ad esempio, la seguente istruzione include 3 simboli ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

La seguente istruzione ha un solo simbolo ".".

Activewindow.Top = 100

Ecco alcuni trucchi per ridurre il numero di simboli "." per correre più veloce.

Innanzitutto, quando è necessario fare riferimento ripetutamente allo stesso oggetto, è possibile impostare l'oggetto su una variabile per ridurre il numero di chiamate. Ad esempio, il codice seguente richiede due chiamate per riga.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Poiché  è necessario fare riferimento ripetutamente all'oggetto Sheets("Sheet1")  , è possibile impostarlo prima su una variabile  sht  , in modo che ciascun codice debba essere chiamato solo una volta.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

In secondo luogo, se non vuoi dichiarare una variabile temporanea sht, puoi anche utilizzare l'  istruzione With  menzionata in precedenza. Come mostrato nel seguente esempio:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

In terzo luogo,  quando sono presenti molti cicli, provare a mantenere le proprietà e i metodi all'esterno del ciclo.  Quando si riutilizza il valore di una proprietà dello stesso oggetto in un ciclo, è possibile prima assegnare il valore della proprietà a una variabile specificata all'esterno del ciclo, quindi utilizzare la variabile nel ciclo, ottenendo così una velocità maggiore. Come mostrato nel seguente esempio:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Ogni ciclo in questo esempio ottiene la proprietà Value della cella Cells(1,2). Se assegni la proprietà Value di Cells(1.2) a una variabile prima dell'inizio del ciclo, otterrai un'esecuzione più veloce. Come mostrato nel seguente esempio:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

Il codice precedente chiama  ThisWorkbook.Sheets("Sheet1")  ogni volta che esegue un ciclo. Puoi farlo più velocemente utilizzando l'  istruzione With  per spostare la chiamata a  ThisWorkbook.Sheets("Sheet1")  all'esterno del ciclo. Come mostrato nel seguente esempio:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Evitare l'uso di tipi di variante

I principianti di solito preferiscono utilizzare le variabili di tipo Variant, che ha il vantaggio di essere meno complicato perché qualsiasi tipo di dati può essere utilizzato senza il problema di overflow della memoria se i dati sono troppo grandi per i tipi di dati Integer o Long. Tuttavia, i dati di tipo Varienmt richiedono più spazio di memoria aggiuntivo rispetto agli altri tipi specificati (2 byte per i dati Integer, 4 byte per i dati Long e 16 byte per i dati Variant), VBA richiede più tempo per elaborare i dati di tipo Variant rispetto ad altri tipi specificati di dati. Come mostra l'esempio seguente.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

Nel codice precedente, le righe da 8 a 13 eseguono 1 milione di operazioni di addizione, sottrazione, moltiplicazione e divisione di variabili Variant e le righe da 17 a 22 eseguono 1 milione di operazioni di addizione, sottrazione, moltiplicazione e divisione di variabili Integer. Sul mio computer, l'operazione della variabile Variant ha richiesto circa  0,09375  secondi, mentre l'operazione della variabile Integer ha richiesto circa  0,03125  secondi. I risultati possono variare da computer a computer, ma  le variabili Variant sono significativamente più lente delle variabili Integer .

Per questo motivo,  si consiglia di evitare di utilizzare le variabili Variant quando è possibile utilizzare esplicitamente il tipo di dati specificato .


Smartsheet 9.1.1

Smartsheet 9.1.1

Smartsheet è una piattaforma di lavoro dinamica che ti consente di gestire progetti, creare flussi di lavoro e collaborare con il tuo team.

SharePoint

SharePoint

SharePoint è un sistema di collaborazione basato sul Web che utilizza una varietà di applicazioni per flussi di lavoro, database di "elenco" e altri componenti Web, nonché funzionalità di sicurezza per fornire controllo ai gruppi aziendali che lavorano insieme.

Calendario perpetuo 1.0.38/1.0.36

Calendario perpetuo 1.0.38/1.0.36

Van Nien Calendar è un'applicazione per la visualizzazione del calendario sul tuo telefono, che ti aiuta a vedere rapidamente la data lunisolare sul tuo telefono, organizzando così il tuo lavoro importante.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook è un'applicazione aziendale e di produttività sviluppata da Microsoft Corporation.

Fare clic su

Fare clic su

ClickUp è una delle piattaforme di produttività più apprezzate per qualsiasi azienda. Grandi aziende come Google, Booking.com, San Diego Padres e Uber utilizzano ClickUp per aumentare la produttività sul posto di lavoro.

Visualizzatore PDF-XChange 2.5.322.10

Visualizzatore PDF-XChange 2.5.322.10

Il PDF è diventato un formato comunemente utilizzato per leggere, creare e inviare documenti di testo. A sua volta, c'è stato un aumento del numero di programmi utilizzati per questo tipo di documentazione. PDF-XChange Viewer fa parte di un numero crescente di visualizzatori PDF.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice offre una suite completa di applicazioni Office che rivaleggiano con Microsoft 365, in particolare in Excel, PowerPoint e Word. Ti consente di gestire i tuoi progetti in modo più efficace e supporta diversi formati di file.

Scarica iTaxviewer 1.8.7

Scarica iTaxviewer 1.8.7

Il software iTaxViewer è il software di lettura di file XML più popolare oggi. Questo software è un'applicazione per la lettura delle dichiarazioni fiscali elettroniche in formato XML del Dipartimento Generale delle Imposte.

Lettore PDF Nitro

Lettore PDF Nitro

Nitro PDF Reader è un pratico editor PDF che copre tutte le attività di base che la maggior parte delle persone esegue ogni giorno con i documenti PDF.

Foxit Reader 12

Foxit Reader 12

Foxit Reader è principalmente un lettore PDF e consente anche di creare file PDF, firmarli, modificarli e aggiungere annotazioni. Funziona su sistemi operativi, ci sono plugin per vari programmi del pacchetto Microsoft Office.