10 moduri de a vă accelera macrocomenzile

Pe măsură ce macrocomenzile dvs. Excel devin din ce în ce mai robuste și complexe, este posibil să constatați că își pierd performanța. Când discutăm despre macrocomenzi, cuvântul performanță este de obicei sinonim cu viteză . Viteza este cât de repede procedurile dvs. VBA își îndeplinesc sarcinile propuse. Următoarele sunt zece moduri de a vă ajuta să vă mențineți macrocomenzile Excel care rulează la nivelul lor optim de performanță.

Oprirea calculelor de foaie

Știați că de fiecare dată când o celulă care afectează orice formulă din foaia dvs. de calcul este schimbată sau manipulată, Excel recalculează întreaga foaie de lucru? În foile de lucru care au o cantitate mare de formule, acest comportament poate încetini drastic macrocomenzile.

Puteți utiliza proprietatea Application.Calculation pentru a spune Excel să treacă la modul de calcul manual. Când un registru de lucru este în modul de calcul manual, registrul de lucru nu se va recalcula până când nu declanșați în mod explicit un calcul apăsând tasta F9.

Plasați Excel în modul de calcul manual, rulați codul și apoi reveniți la modul de calcul automat.

Sub Macro1()
Application.Calculation = xlCalculationManual
 „Plasați codul macro aici
Application.Calculation = xlCalculationAutomatic
End Sub

Setarea modului de calcul înapoi la xlCalculationAutomatic va declanșa automat o recalculare a foii de lucru, deci nu este nevoie să apăsați tasta F9 după rularea macrocomenzii.

Dezactivarea actualizării ecranului foii

Este posibil să observați că atunci când macrocomenzile dvs. rulează, ecranul dvs. pâlpâie destul de mult. Această pâlpâire este Excel care încearcă să redeseneze ecranul pentru a afișa starea curentă a foii de lucru. Din păcate, de fiecare dată când Excel redesenează ecranul, ocupă resurse de memorie.

Puteți utiliza proprietatea Application.ScreenUpdating pentru a dezactiva actualizările de ecran până când macrocomanda este finalizată. Dezactivarea actualizării ecranului economisește timp și resurse, permițând macrocomenzii să ruleze puțin mai rapid. După ce codul macrocomandă a terminat de rulat, puteți reactiva actualizarea ecranului.

Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fals
 „Plasați codul macro aici
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Adevărat
End Sub

După ce setați proprietatea ScreenUpdating înapoi la True, Excel va declanșa automat o redesenare a ecranului.

Se dezactivează actualizările barei de stare

Bara de stare Excel, care apare în partea de jos a ferestrei Excel, afișează în mod normal progresul anumitor acțiuni în Excel. Dacă macrocomanda funcționează cu multe date, bara de stare va ocupa anumite resurse.

Este important să rețineți că dezactivarea actualizării ecranului este separată de oprirea afișajului barei de stare. Bara de stare va continua să fie actualizată chiar dacă dezactivați actualizarea ecranului. Puteți utiliza proprietatea Application.DisplayStatusBar pentru a dezactiva temporar orice actualizări ale barei de stare, îmbunătățind și mai mult performanța macrocomenzii dvs.:

Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fals
Application.DisplayStatusBar = Fals
 „Plasați codul macro aici
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Adevărat
Application.DisplayStatusBar = Adevărat
End Sub

Spuneți lui Excel să ignore evenimentele

Puteți implementa macrocomenzi ca proceduri de eveniment, spunând Excel să ruleze un anumit cod atunci când o foaie de lucru sau un registru de lucru se modifică.

Uneori, macrocomenzile standard fac modificări care vor declanșa o procedură de eveniment. De exemplu, dacă aveți o macrocomandă standard care manipulează mai multe celule din Sheet1, de fiecare dată când o celulă din acea foaie este schimbată, macrocomanda dvs. trebuie să se întrerupă în timp ce rulează evenimentul Worksheet_Change.

Puteți adăuga un alt nivel de creștere a performanței utilizând proprietatea EnableEvents pentru a spune Excel să ignore evenimentele în timp ce macrocomanda rulează.

Setați proprietatea EnableEvents la False înainte de a rula macrocomanda. După ce se termină rularea codului macrocomenzii, puteți seta proprietatea EnableEvents înapoi la True.

Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fals
Application.DisplayStatusBar = Fals
Application.EnableEvents = Fals
 „Plasați codul macro aici
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Adevărat
Application.DisplayStatusBar = Adevărat
Application.EnableEvents = Adevărat
End Sub

Ascunderea pauzelor de pagină

De fiecare dată când macrocomanda modifică numărul de rânduri, modifică numărul de coloane sau modifică configurarea paginii unei foi de lucru, Excel este forțat să-și ia timp pentru a recalcula pauzele de pagină afișate pe foaie.

Puteți evita acest comportament ascunzând pur și simplu întreruperile de pagină înainte de a începe macrocomanda.

Setați proprietatea foii DisplayPageBreaks la False pentru a ascunde pauzele de pagină. Dacă doriți să continuați să afișați întreruperi de pagină după rularea macrocomenzii, setați din nou proprietatea foii DisplayPageBreaks la True.

Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Fals
Application.DisplayStatusBar = Fals
Application.EnableEvents = Fals
Activesheet.DisplayPageBreaks = Fals
 „Plasați codul macro aici
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Adevărat
Application.DisplayStatusBar = Adevărat
Application.EnableEvents = Adevărat
Activesheet.DisplayPageBreaks = Adevărat
End Sub

Se suspendă actualizările tabelului pivot

Dacă macrocomanda manipulează tabele pivot care conțin surse mari de date, este posibil să aveți performanțe slabe atunci când faceți lucruri precum adăugarea dinamică sau mutarea câmpurilor pivot.

Puteți îmbunătăți performanța macrocomenzii dvs. suspendând recalcularea tabelului pivot până când au fost efectuate toate modificările câmpului pivot. Pur și simplu setați proprietatea PivotTable.ManualUpdate la True pentru a amâna recalcularea, rulați codul macro și apoi setați proprietatea PivotTable.ManualUpdate înapoi la False pentru a declanșa recalcularea.

Sub Macro1()
ActiveSheet.PivotTables(„PivotTable1”).ManualUpdate=True
 „Plasați codul macro aici
ActiveSheet.PivotTables(„PivotTable1”).ManualUpdate=False
End Sub

Evitați copierea și lipirea

Este important să rețineți că, deși Macro Recorder economisește timp scriind cod VBA pentru dvs., nu scrie întotdeauna cel mai eficient cod. Un prim exemplu este modul în care Macro Recorder surprinde orice acțiune de copiere și inserare pe care o efectuați în timpul înregistrării.

Puteți oferi macrocomenzilor dvs. un ușor impuls prin decuparea intermediarului și efectuând o copie directă de la o celulă la o celulă de destinație. Acest cod alternativ folosește argumentul Destinație pentru a ocoli clipboard-ul și pentru a copia conținutul celulei A1 direct în celula B1.

Interval(„A1”). Copiați destinația:=Interval(„B1”)

Dacă trebuie să copiați numai valori (nu formatare sau formule), puteți îmbunătăți și mai mult performanța evitând metoda Copy toate împreună. Pur și simplu setați valoarea celulei de destinație la aceeași valoare găsită în celula sursă. Această metodă este de aproximativ 25 de ori mai rapidă decât utilizarea metodei Copiere:

Interval(„B1”).Valoare = Interval(„A1”).Valoare

Dacă trebuie să copiați doar formule dintr-o celulă în alta (nu valori sau formatare), puteți seta formula celulei de destinație la aceeași formulă conținută în celula sursă:

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

Folosind instrucțiunea With

Când înregistrați macrocomenzi, veți manipula adesea același obiect de mai multe ori. Puteți economisi timp și îmbunătăți performanța utilizând instrucțiunea With pentru a efectua mai multe acțiuni asupra unui obiect dat dintr-o singură lovitură.

Declarația With utilizată în exemplul următor îi spune Excel să aplice toate modificările de formatare simultan:

    Cu Interval("A1").Font
    .Bold = Adevarat
    .Italic = Adevarat
    .Underline = xlUnderlineStyleSingle
    Se termina cu

Obișnuința de a împărți acțiunile în instrucțiuni With nu numai că va menține macrocomenzile să ruleze mai rapid, ci și va face mai ușor să citiți codul macro.

Evitarea metodei Select

Macro Recorder îi place să folosească metoda Select pentru a selecta în mod explicit obiectele înainte de a lua măsuri asupra lor. În general, nu este nevoie să selectați obiectele înainte de a lucra cu ele. De fapt, puteți îmbunătăți dramatic performanța macrocomenzilor fără a utiliza metoda Select.

După înregistrarea macrocomenzilor, obișnuiți să modificați codul generat pentru a elimina metodele Select. În acest caz, codul optimizat ar arăta astfel:

    Sheets(„Sheet1”).Range(„A1”).FormulaR1C1 = „1000”
    Sheets(„Sheet2”).Range(„A1”).FormulaR1C1 = „1000”
    Sheets(„Sheet3”).Range(„A1”).FormulaR1C1 = „1000”

Rețineți că nimic nu este selectat. Codul folosește pur și simplu ierarhia obiectelor pentru a aplica acțiunile necesare.

Limitarea călătoriilor la foaia de lucru

O altă modalitate de a vă accelera macrocomenzile este să limitați numărul de ori când faceți referire la datele din foaia de lucru în cod. Este întotdeauna mai puțin eficient să luați date din foaia de lucru decât din memorie. Adică, macrocomenzile dvs. vor rula mult mai repede dacă nu trebuie să interacționeze în mod repetat cu foaia de lucru.

De exemplu, următorul cod simplu forțează VBA să revină în mod continuu la Sheets(„Sheet1”).Range(„A1”) pentru a obține numărul necesar pentru compararea efectuată în instrucțiunea If:

Pentru ReportMonth = 1 - 12
     If Range("A1").Value = ReportMonth Atunci
     MsgBox 1000000 / ReportMonth
Încheiați dacă
Următorul RaportLuna

O metodă mult mai eficientă este salvarea valorii în Sheets(„Sheet1”).Range(“A1”) într-o variabilă numită MyMonth. În acest fel, codul face referire la variabila MyMonth în loc de foaia de lucru:

Dim MyMonth ca număr întreg
Luna mea = Interval("A1").Valoare
Pentru ReportMonth = 1 - 12
Dacă MyMonth = ReportMonth Atunci
MsgBox 1000000 / ReportMonth
Încheiați dacă
Următorul RaportLuna

Luați în considerare utilizarea variabilelor pentru a lucra cu datele din memorie, spre deosebire de referirea directă a foilor de lucru.

Evitați referința excesivă

Când apelați o metodă sau o proprietate a unui obiect, acesta trebuie să treacă prin interfața IDispatch a componentei OLE. Apelurile către aceste componente OLE necesită timp, astfel încât reducerea numărului de referințe la componentele OLE poate îmbunătăți viteza codului macro.

Pentru invocarea proprietăților sau metodelor obiectului, se folosește în general metoda de reprezentare a  Object.Method  , adică „." simbolul este folosit pentru a invoca proprietăți și metode.

Prin urmare, numărul de apeluri de metodă sau de proprietate poate fi judecat în funcție de numărul de simboluri „.”. Cu cât "." simbol, cu atât mai repede rulează codul.

De exemplu, următoarea declarație include 3 simboluri „.”.

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

Următoarea afirmație are un singur simbol „.”.

Activewindow.Top = 100

Iată câteva trucuri pentru a reduce numărul de simboluri "." a alerga mai repede.

În primul rând, când trebuie să vă referiți la același obiect în mod repetat, puteți seta obiectul la o variabilă pentru a reduce numărul de apeluri. De exemplu, următorul cod necesită două apeluri pe linie.

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

Deoarece  obiectul Sheets(„Sheet1”)  trebuie să fie referit în mod repetat, acesta poate fi setat mai întâi la o variabilă  sht  , astfel încât fiecare cod să fie apelat o singură dată.

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

În al doilea rând, dacă nu doriți să declarați o variabilă temporară sht, puteți utiliza și  instrucțiunea With  menționată mai devreme. După cum se arată în exemplul următor:

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

În al treilea rând,  când există o mulțime de bucle, încercați să păstrați proprietățile și metodele în afara buclei.  Când reutilizați o valoare de proprietate a aceluiași obiect într-o buclă, puteți mai întâi să atribuiți valoarea proprietății unei variabile specificate din afara buclei și apoi să utilizați variabila în buclă, care poate atinge o viteză mai mare. După cum se arată în exemplul următor:

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

Fiecare buclă din acest exemplu primește proprietatea Value a celulei Cells(1,2). Dacă atribuiți proprietatea Value a Cells(1.2) unei variabile înainte de a începe bucla, veți obține o rulare mai rapidă. După cum se arată în exemplul următor:

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

Codul de mai sus apelează  ThisWorkbook.Sheets(„Sheet1”)  de fiecare dată când se execută în buclă. Puteți face acest lucru mai rapid folosind  instrucțiunea With  pentru a muta apelul la  ThisWorkbook.Sheets("Sheet1")  în afara buclei. După cum se arată în exemplul următor:

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

Evitați utilizarea tipurilor de variante

Începătorii preferă, de obicei, să folosească variabile de tip Variant, ceea ce are avantajul de a fi mai puțin complicat, deoarece orice tip de date poate fi folosit fără problema depășirii memoriei dacă datele sunt prea mari pentru tipurile de date Integer sau Long. Cu toate acestea, datele de tip Varienmt necesită mai mult spațiu de memorie suplimentar decât celelalte tipuri specificate (2 octeți pentru date întregi, 4 octeți pentru date lungi și 16 octeți pentru date variante), VBA necesită mai mult timp pentru procesarea datelor de tip variantă decât alte tipuri specificate de date. După cum arată următorul exemplu.

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

În codul de mai sus, liniile de la 8 la 13 fac 1 milion de operații de adunare, scădere, înmulțire și împărțire a variabilelor Variant, iar liniile 17 la 22 fac 1 milion de operații de adunare, scădere, înmulțire și împărțire a variabilelor întregi. Pe computerul meu, funcționarea variabilei Variant a durat aproximativ  0,09375  secunde, în timp ce funcționarea variabilei Integer a durat aproximativ  0,03125  secunde. Rezultatele pot varia de la computer la computer, dar  variabilele Variant sunt semnificativ mai lente decât variabilele Integer .

Din acest motiv,  se recomandă să evitați utilizarea variabilelor Variant atunci când puteți utiliza în mod explicit tipul de date specificat .


Smartsheet 9.1.1

Smartsheet 9.1.1

Smartsheet este o platformă de lucru dinamică care vă permite să gestionați proiecte, să creați fluxuri de lucru și să colaborați cu echipa dvs.

SharePoint

SharePoint

SharePoint este un sistem de colaborare bazat pe web care utilizează o varietate de aplicații pentru fluxul de lucru, baze de date „liste” și alte componente web, precum și caracteristici de securitate pentru a oferi control grupurilor de afaceri care lucrează împreună.

Calendar perpetuu 1.0.38/1.0.36

Calendar perpetuu 1.0.38/1.0.36

Calendarul Van Nien este o aplicație de vizualizare a calendarului pe telefonul dvs., care vă ajută să vedeți rapid data lunisolară pe telefon, aranjandu-vă astfel munca importantă.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook este o aplicație de afaceri și productivitate dezvoltată de Microsoft Corporation.

ClickUp

ClickUp

ClickUp este una dintre cele mai bine cotate platforme de productivitate pentru orice afacere. Companiile mari precum Google, Booking.com, San Diego Padres și Uber folosesc toate ClickUp pentru a crește productivitatea la locul de muncă.

PDF-XChange Viewer 2.5.322.10

PDF-XChange Viewer 2.5.322.10

PDF a devenit un format folosit în mod obișnuit pentru citirea, crearea și trimiterea documentelor text. La rândul său, s-a înregistrat o creștere a numărului de programe utilizate pentru acest tip de documentație. PDF-XChange Viewer se numără printre un număr tot mai mare de vizualizatoare PDF.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice oferă o suită completă de aplicații Office care rivalizează cu Microsoft 365, în special în Excel, PowerPoint și Word. Vă permite să vă gestionați proiectele mai eficient și acceptă mai multe formate de fișiere.

Descărcați iTaxviewer 1.8.7

Descărcați iTaxviewer 1.8.7

Software-ul iTaxViewer este cel mai popular software de citire a fișierelor XML în prezent. Acest software este o aplicație de citire a declarațiilor fiscale electronice în format XML ale Direcției Generale de Fiscalitate.

Nitro PDF Reader

Nitro PDF Reader

Nitro PDF Reader este un editor PDF la îndemână care acoperă toate sarcinile de bază pe care majoritatea oamenilor le efectuează în fiecare zi cu documente PDF.

Foxit Reader 12

Foxit Reader 12

Foxit Reader este în primul rând un cititor PDF și vă permite, de asemenea, să creați fișiere PDF, să le semnați, să le editați și să adăugați adnotări. Functioneaza pe sisteme de operare, exista plugin-uri pentru diverse programe din pachetul Microsoft Office.