10 manieren om uw macros te versnellen

Naarmate uw Excel-macro's steeds robuuster en complexer worden, kunt u merken dat ze prestaties verliezen. Bij het bespreken van macro's is het woord prestatie meestal synoniem met snelheid . Snelheid is hoe snel uw VBA-procedures hun beoogde taken uitvoeren. Hieronder volgen tien manieren om ervoor te zorgen dat uw Excel-macro's optimaal presteren.

Bladberekeningen stoppen

Wist u dat elke keer dat een cel die een formule in uw spreadsheet beïnvloedt, wordt gewijzigd of gemanipuleerd, Excel het hele werkblad opnieuw berekent? In werkbladen met een groot aantal formules kan dit gedrag uw macro's drastisch vertragen.

U kunt de eigenschap Application.Calculation gebruiken om Excel te laten weten over te schakelen naar de handmatige berekeningsmodus. Wanneer een werkmap zich in de handmatige berekeningsmodus bevindt, wordt de werkmap pas opnieuw berekend als u expliciet een berekening activeert door op de F9-toets te drukken.

Zet Excel in de handmatige berekeningsmodus, voer uw code uit en schakel vervolgens terug naar de automatische berekeningsmodus.

Submacro1()
Toepassing.Berekening = xlBerekeningHandmatig
 'Plaats hier je macrocode
Toepassing.Berekening = xlBerekeningAutomatisch
Einde sub

Als u de berekeningsmodus weer instelt op xlCalculationAutomatic, wordt automatisch een herberekening van het werkblad gestart, dus u hoeft niet op F9 te drukken nadat uw macro is uitgevoerd.

Bijwerken van bladscherm uitschakelen

U merkt misschien dat wanneer uw macro's worden uitgevoerd, uw scherm behoorlijk flikkert. Dit flikkeren is dat Excel probeert het scherm opnieuw te tekenen om de huidige staat van het werkblad weer te geven. Helaas, elke keer dat Excel het scherm opnieuw tekent, neemt het geheugenbronnen in beslag.

U kunt de eigenschap Application.ScreenUpdating gebruiken om schermupdates uit te schakelen totdat uw macro is voltooid. Het uitschakelen van schermupdates bespaart tijd en middelen, waardoor uw macro iets sneller kan worden uitgevoerd. Nadat uw macrocode is uitgevoerd, kunt u het bijwerken van het scherm weer inschakelen.

Submacro1()
Toepassing.Berekening = xlBerekeningHandmatig
Application.ScreenUpdating = False
 'Plaats hier je macrocode
Toepassing.Berekening = xlBerekeningAutomatisch
Application.ScreenUpdating = True
Einde sub

Nadat u de eigenschap ScreenUpdating weer op True hebt ingesteld, activeert Excel automatisch een nieuwe tekening van het scherm.

Updates van de statusbalk uitschakelen

De Excel-statusbalk, die onderaan het Excel-venster verschijnt, geeft normaal gesproken de voortgang van bepaalde acties in Excel weer. Als uw macro met veel gegevens werkt, neemt de statusbalk enkele bronnen in beslag.

Het is belangrijk op te merken dat het uitschakelen van schermupdates los staat van het uitschakelen van de statusbalkweergave. De statusbalk wordt nog steeds bijgewerkt, zelfs als u het bijwerken van het scherm uitschakelt. U kunt de eigenschap Application.DisplayStatusBar gebruiken om updates van de statusbalk tijdelijk uit te schakelen, waardoor de prestaties van uw macro verder worden verbeterd:

Submacro1()
Toepassing.Berekening = xlBerekeningHandmatig
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'Plaats hier je macrocode
Toepassing.Berekening = xlBerekeningAutomatisch
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Einde sub

Excel vertellen om gebeurtenissen te negeren

U kunt macro's implementeren als gebeurtenisprocedures en Excel vertellen om bepaalde code uit te voeren wanneer een werkblad of werkmap verandert.

Soms brengen standaardmacro's wijzigingen aan die een gebeurtenisprocedure activeren. Als u bijvoorbeeld een standaardmacro hebt die meerdere cellen op Blad1 manipuleert, moet elke keer dat een cel op dat blad wordt gewijzigd, uw macro pauzeren terwijl de gebeurtenis Worksheet_Change wordt uitgevoerd.

U kunt een ander niveau van prestatieverbetering toevoegen door de eigenschap EnableEvents te gebruiken om Excel te laten weten gebeurtenissen te negeren terwijl uw macro wordt uitgevoerd.

Stel de eigenschap EnableEvents in op False voordat u uw macro uitvoert. Nadat uw macrocode is uitgevoerd, kunt u de eigenschap EnableEvents weer op True zetten.

Submacro1()
Toepassing.Berekening = xlBerekeningHandmatig
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Plaats hier je macrocode
Toepassing.Berekening = xlBerekeningAutomatisch
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Einde sub

Pagina-einden verbergen

Elke keer dat uw macro het aantal rijen wijzigt, het aantal kolommen wijzigt of de pagina-instelling van een werkblad wijzigt, moet Excel de tijd nemen om de pagina-einden op het blad opnieuw te berekenen.

U kunt dit gedrag voorkomen door simpelweg de pagina-einden te verbergen voordat u uw macro start.

Stel de bladeigenschap DisplayPageBreaks in op False om pagina-einden te verbergen. Als u pagina-einden wilt blijven weergeven nadat uw macro is uitgevoerd, stelt u de bladeigenschap DisplayPageBreaks weer in op True.

Submacro1()
Toepassing.Berekening = xlBerekeningHandmatig
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Plaats hier je macrocode
Toepassing.Berekening = xlBerekeningAutomatisch
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
Einde sub

Updates voor draaitabellen opschorten

Als uw macro draaitabellen manipuleert die grote gegevensbronnen bevatten, kunt u slechte prestaties ervaren bij het dynamisch toevoegen of verplaatsen van draaivelden.

U kunt de prestaties van uw macro verbeteren door de herberekening van de draaitabel uit te stellen totdat alle wijzigingen in het draaiveld zijn aangebracht. Stel de eigenschap PivotTable.ManualUpdate in op True om herberekening uit te stellen, voer uw macrocode uit en stel vervolgens de eigenschap PivotTable.ManualUpdate weer in op False om de herberekening te activeren.

Submacro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Plaats hier je macrocode
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Einde sub

Kopieer en plak niet meer

Het is belangrijk om te onthouden dat hoewel Macro Recorder tijd bespaart door VBA-code voor u te schrijven, het niet altijd de meest efficiënte code schrijft. Een goed voorbeeld is hoe Macro Recorder elke kopieer- en plakactie vastlegt die u tijdens het opnemen uitvoert.

U kunt uw macro's een lichte boost geven door de tussenpersoon uit te schakelen en een directe kopie van de ene cel naar een bestemmingscel uit te voeren. Deze alternatieve code gebruikt het argument Destination om het klembord te omzeilen en de inhoud van cel A1 rechtstreeks naar cel B1 te kopiëren.

Bereik ("A1"). Bestemming kopiëren: = Bereik ("B1")

Als u alleen waarden hoeft te kopiëren (geen opmaak of formules), kunt u de prestaties nog verder verbeteren door de kopieermethode helemaal te vermijden. Stel eenvoudig de waarde van de doelcel in op dezelfde waarde als in de broncel. Deze methode is ongeveer 25 keer sneller dan de kopieermethode:

Bereik ("B1"). Waarde = Bereik ("A1"). Waarde

Als u alleen formules van de ene cel naar de andere wilt kopiëren (geen waarden of opmaak), kunt u de formule van de doelcel instellen op dezelfde formule als in de broncel:

Bereik ("B1").Formule = Bereik ("A1").Formule

Het With-statement gebruiken

Bij het opnemen van macro's manipuleert u hetzelfde object vaak meer dan eens. U kunt tijd besparen en de prestaties verbeteren door het With-statement te gebruiken om verschillende acties op een bepaald object in één keer uit te voeren.

De With-instructie die in het volgende voorbeeld wordt gebruikt, vertelt Excel om alle opmaakwijzigingen in één keer toe te passen:

    Met bereik ("A1"). Lettertype
    .Vet = Waar
    .Cursief = True
    .Onderstrepen = xlUnderlineStyleSingle
    Eindigt met

Door de gewoonte aan te nemen om acties in With-statements op te delen, blijven uw macro's niet alleen sneller werken, maar wordt het ook gemakkelijker om uw macrocode te lezen.

De Select-methode vermijden

Macro Recorder gebruikt graag de Select-methode om objecten expliciet te selecteren voordat er actie op wordt ondernomen. Het is over het algemeen niet nodig om objecten te selecteren voordat u ermee gaat werken. U kunt de macroprestaties zelfs drastisch verbeteren door de Select-methode niet te gebruiken.

Maak er na het opnemen van uw macro's een gewoonte van om de gegenereerde code te wijzigen om de Select-methoden te verwijderen. In dit geval ziet de geoptimaliseerde code er als volgt uit:

    Bladen ("Blad1"). Bereik ("A1").FormuleR1C1 = "1000"
    Bladen ("Blad2"). Bereik ("A1").FormuleR1C1 = "1000"
    Bladen ("Blad3"). Bereik ("A1").FormuleR1C1 = "1000"

Merk op dat het niets wordt geselecteerd. De code gebruikt eenvoudig de objecthiërarchie om de benodigde acties toe te passen.

Reizen naar het werkblad beperken

Een andere manier om uw macro's te versnellen, is door het aantal keren dat u naar werkbladgegevens in uw code verwijst, te beperken. Het is altijd minder efficiënt om gegevens uit het werkblad te halen dan uit het geheugen. Dat wil zeggen dat uw macro's veel sneller zullen werken als ze niet herhaaldelijk met het werkblad hoeven te communiceren.

De volgende eenvoudige code dwingt VBA bijvoorbeeld om continu terug te keren naar Spreadsheets ("Sheet1"). Range ("A1") om het nummer te krijgen dat nodig is voor de vergelijking die wordt uitgevoerd in de If-instructie:

Voor ReportMonth = 1 tot 12
     If Range ("A1"). Waarde = ReportMonth Dan
     MsgBox 1000000 / ReportMonth
Stop als
Volgende VerslagMaand

Een veel efficiëntere methode is om de waarde in Spreadsheets ("Sheet1").Range ("A1") op te slaan in een variabele met de naam MyMonth. Op deze manier verwijst de code naar de MyMonth-variabele in plaats van naar het werkblad:

Dim MyMonth als geheel getal
MijnMaand = Bereik ("A1"). Waarde
Voor ReportMonth = 1 tot 12
Als MyMonth = ReportMonth Dan
MsgBox 1000000 / ReportMonth
Stop als
Volgende VerslagMaand

Overweeg om variabelen te gebruiken om met gegevens in het geheugen te werken in plaats van rechtstreeks naar werkbladen te verwijzen.

Vermijd overmatige verwijzingen

Bij het aanroepen van een methode of eigenschap van een object moet deze via de IDispatch-interface van de OLE-component gaan. Het aanroepen van deze OLE-componenten kost tijd, dus het verminderen van het aantal verwijzingen naar OLE-componenten kan de snelheid van de macrocode verbeteren.

Voor het aanroepen van objecteigenschappen of -methoden wordt doorgaans de representatiemethode  Object.Method  gebruikt, dat wil zeggen de "." symbool wordt gebruikt om eigenschappen en methoden aan te roepen.

Daarom kan het aantal methode- of eigenschapaanroepen worden beoordeeld aan de hand van het aantal symbolen ".". Hoe minder de "." symbool, hoe sneller de code wordt uitgevoerd.

De volgende verklaring bevat bijvoorbeeld 3 symbolen ".".

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

De volgende verklaring heeft slechts één symbool ".".

Activewindow.Top = 100

Hier zijn enkele trucs om het aantal symbolen "." sneller te rennen.

Als u herhaaldelijk naar hetzelfde object moet verwijzen, kunt u het object eerst op een variabele instellen om het aantal aanroepen te verminderen. Voor de volgende code zijn bijvoorbeeld twee oproepen per lijn vereist.

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

Omdat er herhaaldelijk naar het  object Sheets("Sheet1")  moet worden verwezen, kan het eerst worden ingesteld op een variabele  sht  , zodat elke code slechts één keer hoeft te worden aangeroepen.

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

Ten tweede: als je een tijdelijke variabele sht niet wilt declareren, kun je ook de  eerder genoemde With-  instructie gebruiken. Zoals blijkt uit het volgende voorbeeld:

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

Ten derde:  als er veel lussen zijn, probeer dan de eigenschappen en methoden buiten de lus te houden.  Wanneer u een eigenschapswaarde van hetzelfde object in een lus hergebruikt, kunt u eerst de eigenschapswaarde toewijzen aan een opgegeven variabele buiten de lus en vervolgens de variabele in de lus gebruiken, waardoor een hogere snelheid kan worden bereikt. Zoals blijkt uit het volgende voorbeeld:

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

Elke lus in dit voorbeeld krijgt de eigenschap Value van de cel Cells(1,2). Als u de eigenschap Value van Cells(1.2) aan een variabele toewijst voordat de lus begint, krijgt u een snellere run. Zoals blijkt uit het volgende voorbeeld:

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

De bovenstaande code roept  ThisWorkbook.Sheets("Sheet1") aan  elke keer dat deze wordt herhaald. U kunt dit sneller doen door de  With-  instructie te gebruiken om de aanroep naar  ThisWorkbook.Sheets("Sheet1")  buiten de lus te verplaatsen. Zoals blijkt uit het volgende voorbeeld:

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

Vermijd het gebruik van varianttypen

Beginners geven er meestal de voorkeur aan variabelen van het Variant-type te gebruiken, wat het voordeel heeft dat ze minder ingewikkeld zijn, omdat elk type gegevens kan worden gebruikt zonder het probleem van geheugenoverloop als de gegevens te groot zijn voor de gegevenstypen Integer of Long. Gegevens van het Varienmt-type vereisen echter meer extra geheugenruimte dan de andere gespecificeerde typen (2 bytes voor integer-gegevens, 4 bytes voor lange gegevens en 16 bytes voor variantgegevens). VBA heeft meer tijd nodig om gegevens van het variant-type te verwerken dan andere gespecificeerde typen Van de gegevens. Zoals het volgende voorbeeld laat zien.

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

In de bovenstaande code voeren de regels 8 tot en met 13 1 miljoen bewerkingen uit op het gebied van optellen, aftrekken, vermenigvuldigen en delen van variantvariabelen, en voeren de regels 17 tot en met 22 1 miljoen bewerkingen uit op het gebied van optellen, aftrekken, vermenigvuldigen en delen van gehele variabelen. Op mijn computer duurde de werking van de Variant-variabele ongeveer  0,09375  seconden, terwijl de werking van de Integer-variabele ongeveer  0,03125  seconden duurde. De resultaten kunnen variëren van computer tot computer, maar  Variantvariabelen zijn aanzienlijk langzamer dan Integer-variabelen .

Om deze reden  wordt aanbevolen om het gebruik van variantvariabelen te vermijden wanneer u expliciet het opgegeven gegevenstype kunt gebruiken .


Smartsheet 9.1.1

Smartsheet 9.1.1

Smartsheet is een dynamisch werkplatform waarmee u projecten kunt beheren, workflows kunt bouwen en kunt samenwerken met uw team.

Deel punt

Deel punt

SharePoint is een webgebaseerd samenwerkingssysteem dat gebruikmaakt van een verscheidenheid aan workflowtoepassingen, “lijst”-databases en andere webcomponenten, evenals beveiligingsfuncties om controle te geven over de samenwerking van bedrijfsgroepen.

Eeuwigdurende kalender 1.0.38/1.0.36

Eeuwigdurende kalender 1.0.38/1.0.36

Van Nien Agenda is een applicatie voor het bekijken van agenda's op uw telefoon, waarmee u snel de lunisolaire datum op uw telefoon kunt zien en zo uw belangrijke werk kunt regelen.

Microsoft Outlook 2021

Microsoft Outlook 2021

Microsoft Outlook is een bedrijfs- en productiviteitsapplicatie ontwikkeld door Microsoft Corporation.

Klik omhoog

Klik omhoog

ClickUp is een van de hoogst gewaardeerde productiviteitsplatforms voor elk bedrijf. Grote bedrijven zoals Google, Booking.com, San Diego Padres en Uber gebruiken allemaal ClickUp om de productiviteit op de werkplek te verhogen.

PDF-XChange-viewer 2.5.322.10

PDF-XChange-viewer 2.5.322.10

PDF is een veelgebruikt formaat geworden voor het lezen, maken en verzenden van tekstdocumenten. Op zijn beurt is er een toename geweest in het aantal programma's dat voor dit soort documentatie wordt gebruikt. PDF-XChange Viewer behoort tot een groeiend aantal PDF-viewers.

Apache OpenOffice

Apache OpenOffice

Apache OpenOffice biedt een compleet pakket Office-applicaties die wedijveren met Microsoft 365, vooral in Excel, PowerPoint en Word. Hiermee kunt u uw projecten effectiever beheren en worden verschillende bestandsformaten ondersteund.

Download iTaxviewer 1.8.7

Download iTaxviewer 1.8.7

iTaxViewer-software is tegenwoordig de populairste software voor het lezen van XML-bestanden. Deze software is een applicatie voor het lezen van elektronische belastingaangiften in XML-formaat van de Algemene Afdeling Belastingen.

Nitro PDF-lezer

Nitro PDF-lezer

Nitro PDF Reader is een handige PDF-editor die alle basistaken dekt die de meeste mensen dagelijks uitvoeren met PDF-documenten.

Foxit-lezer 12

Foxit-lezer 12

Foxit Reader is in de eerste plaats een PDF-lezer en biedt u ook de mogelijkheid PDF-bestanden te maken, te ondertekenen, te bewerken en aantekeningen toe te voegen. Het werkt op besturingssystemen, er zijn plug-ins voor verschillende programma's uit het Microsoft Office-pakket.