VBA: snelheid verbeteren en andere best practices

In deze zelfstudie wordt besproken hoe u VBA-macro's en andere VBA-best practices kunt versnellen.

Instellingen om VBA-code te versnellen

Hieronder vind je enkele tips om je VBA-code te versnellen. De tips zijn losjes geordend op belangrijkheid.

De eenvoudigste manier om de snelheid van uw VBA-code te verbeteren, is door ScreenUpdating uit te schakelen en Automatische berekeningen uit te schakelen. Deze instellingen moeten in alle grote procedures worden uitgeschakeld.

Scherm bijwerken uitschakelen

Excel zal standaard wijzigingen in werkmappen in realtime weergeven terwijl VBA-code wordt uitgevoerd. Dit veroorzaakt een enorme vertraging van de verwerkingssnelheid, aangezien Excel de meeste wijzigingen voor elke regel code interpreteert en weergeeft.

Scherm bijwerken uitschakelen:

1 Application.ScreenUpdating = False

Aan het einde van uw macro moet u Scherm bijwerken weer inschakelen:

1 Application.ScreenUpdating = True

Terwijl uw code actief is, moet u mogelijk het scherm "verversen". Er is geen "vernieuwen" commando. In plaats daarvan moet u Scherm bijwerken weer inschakelen en weer uitschakelen.

Berekeningen instellen op Handmatig

Telkens wanneer een celwaarde wordt gewijzigd, moet Excel de "berekeningsboom" volgen om alle afhankelijke cellen opnieuw te berekenen. Bovendien moet Excel, wanneer een formule wordt gewijzigd, de "berekeningsboom" bijwerken en alle afhankelijke cellen opnieuw berekenen. Afhankelijk van de grootte van uw werkmap, kunnen deze herberekeningen ertoe leiden dat uw macro's onredelijk traag worden uitgevoerd.

Berekeningen instellen op Handmatig:

1 Toepassing. Berekening = xlHandmatig

De hele werkmap handmatig opnieuw berekenen:

1 Berekenen

Merk op dat u ook alleen een blad, bereik of individuele cel kunt berekenen, indien nodig voor een betere snelheid.

Automatische berekeningen herstellen (aan het einde van uw procedure):

1 Toepassing.Berekening = xlAutomatisch

Belangrijk! Dit is een Excel-instelling. Als u berekeningen niet opnieuw instelt op automatisch, wordt uw werkmap pas opnieuw berekend als u dit aangeeft.

Je zult de grootste verbeteringen van de bovenstaande instellingen zien, maar er zijn verschillende andere instellingen die een verschil kunnen maken:

Evenementen uitschakelen

Gebeurtenissen zijn "triggers" die speciale gebeurtenis procedures rennen. Voorbeelden zijn: wanneer een cel op een werkblad verandert, wanneer een werkblad wordt geactiveerd, wanneer een werkmap wordt geopend, voordat een werkmap wordt opgeslagen, enz.

Het uitschakelen van gebeurtenissen kan kleine snelheidsverbeteringen veroorzaken wanneer macro's worden uitgevoerd, maar de snelheidsverbetering kan veel groter zijn als uw werkmap gebeurtenissen gebruikt. En in sommige gevallen is het uitschakelen van gebeurtenissen nodig om te voorkomen dat er eindeloze lussen ontstaan.

Gebeurtenissen uitschakelen:

1 Application.EnableEvents = False

Gebeurtenissen weer inschakelen:

1 Application.EnableEvents = True

Pagina-onderbrekingen uitschakelen

Het uitschakelen van PageBreaks kan in bepaalde situaties helpen:

  • U hebt eerder een PageSetup-eigenschap ingesteld voor het relevante werkblad en uw VBA-procedure wijzigt de eigenschappen van veel rijen of kolommen
  • OF Uw VBA-procedure dwingt Excel om pagina-einden te berekenen (afdrukvoorbeeld weergeven of eigenschappen van PageSetup wijzigen).

PageBreaks uitschakelen:

1 ActiveSheet.DisplayPageBreaks = False

PageBreaks opnieuw inschakelen:

1 ActiveSheet.DisplayPageBreaks = True

Best practices om de VBA-snelheid te verbeteren

Vermijd activeren en selecteren

Wanneer u een macro opneemt, ziet u veel activerings- en selectiemethoden:

12345678 Sub Slow_Example()Bladen ("Blad2"). SelecteerBereik ("D9"). SelecteerActiveCell.FormulaR1C1 = "voorbeeld"Bereik ("D12"). SelecteerActiveCell.FormulaR1C1 = "demo"Bereik ("D13"). SelecteerEinde sub

Het activeren en selecteren van objecten is meestal niet nodig, ze maken je code rommelig en ze kosten veel tijd. U moet deze methoden waar mogelijk vermijden.

Verbeterd voorbeeld:

1234 Sub Fast_Example()Spreadsheets ("Blad2").Bereik ("D9").FormulaR1C1 = "voorbeeld"Spreadsheets ("Blad2").Bereik ("D12").FormuleR1C1 = "demo"Einde sub

Vermijd kopiëren en plakken

Kopiëren vereist veel geheugen. Helaas kun je VBA niet vertellen om het interne geheugen te wissen. In plaats daarvan zal Excel het interne geheugen wissen met (schijnbaar) specifieke intervallen. Dus als u veel kopieer- en plakbewerkingen uitvoert, loopt u het risico te veel geheugen in beslag te nemen, wat uw code drastisch kan vertragen of zelfs Excel kan laten crashen.

Overweeg om de waarde-eigenschappen van cellen in te stellen in plaats van te kopiëren en te plakken.

123456789 Sub CopyPaste()'Langzamer'Bereik ("a1:a1000"). Bereik kopiëren ("b1:b1000")'Sneller'Bereik ("b1: b1000"). Waarde = Bereik ("a1: a1000"). WaardeEinde sub

Gebruik de For Each-loops in plaats van For Loops

Bij het doorlopen van objecten is de For Each-lus sneller dan de For-lus. Voorbeeld:

Dit voor lus:

123456 Sublus1()dim i als bereikVoor i = 1 tot 100Cellen (i, 1). Waarde = 1volgende iEinde sub
Is langzamer dan dit Voor elke lus:
123456 Sublus2()Dim cel als bereikVoor elke cel binnen bereik ("a1:a100")cel.Waarde = 1Volgende celEinde sub

Variabelen declareren / optie expliciet gebruiken

VBA vereist niet dat u uw variabelen declareert, tenzij u Option Explicit bovenaan uw module toevoegt:
1 Optie expliciet
Het toevoegen van Option Explicit is een best practice voor codering omdat het de kans op fouten verkleint. Het dwingt je ook om je variabelen te declareren, wat de snelheid van je code iets verhoogt (de voordelen vallen meer op naarmate een variabele meer wordt gebruikt).Hoe voorkomt Option Explicit fouten?Het grootste voordeel van Option Explicit is dat het u zal helpen spellingsfouten van variabele namen op te sporen. In het volgende voorbeeld hebben we bijvoorbeeld een variabele met de naam 'var1' ingesteld, maar later verwijzen we naar een variabele met de naam 'varl'. Variabele 'varl' is niet gedefinieerd, dus het is leeg, wat onverwachte resultaten oplevert.
1234 SuboptieExplicit()var1 = 10MsgBox varlEinde sub

Gebruik met - Eindig met instructies

Als u meerdere keren naar dezelfde objecten verwijst (bijv. Bereiken, Werkbladen, Werkmappen), kunt u overwegen de Met-instructie te gebruiken. Het is sneller te verwerken, kan uw code leesbaarder maken en vereenvoudigt uw code.Met verklaring voorbeeld:
12345678 Sub Faster_Example()Met bladen ("Blad2").Bereik ("D9").FormuleR1C1 = "voorbeeld".Bereik ("D12").FormuleR1C1 = "demo".Bereik("D9").Lettertype.Bold = True.Bereik ("D12"). Lettertype. Vet = TrueEindigt metEinde sub
Is sneller dan:
123456 Sub Slow_Example()Spreadsheets ("Blad2").Bereik ("D9").FormulaR1C1 = "voorbeeld"Spreadsheets ("Blad2").Bereik ("D12").FormuleR1C1 = "demo"Bladen ("Blad2"). Bereik ("D9"). Lettertype. Vet = TrueBladen ("Blad2"). Bereik ("D12"). Lettertype. Vet = TrueEinde sub

Geavanceerde praktische tips

Alleen gebruikersinterface beveiligen

Het is een goede gewoonte om uw werkbladen te beschermen tegen het bewerken van onbeveiligde cellen om te voorkomen dat de eindgebruiker (of u!) Per ongeluk de werkmap beschadigt. Dit zal echter ook de werkblad (en) beschermen tegen VBA om wijzigingen aan te brengen. U moet de beveiliging van werkbladen dus opheffen en opnieuw beveiligen, wat erg tijdrovend is wanneer u dit op veel vellen doet.

12345 Sub UnProtectSheet()Spreadsheets ("sheet1"). Beveiliging van "wachtwoord" opheffen'Blad1 bewerken'Spreadsheets ("sheet1"). Bescherm "wachtwoord"Einde sub

In plaats daarvan kunt u werkbladen beveiligen met de instelling UserInterfaceOnly:=True. Hierdoor kan VBA wijzigingen aanbrengen in bladen, terwijl ze nog steeds worden beschermd tegen de gebruiker.

1 Spreadsheets ("sheet1").Bescherm wachtwoord:="wachtwoord", UserInterFaceOnly:=True

Belangrijk! UserInterFaceOnly wordt elke keer dat de werkmap wordt geopend, opnieuw ingesteld op False. Dus om deze geweldige functie te gebruiken, moet u de gebeurtenissen Workbook_Open of Auto_Open gebruiken om de instelling in te stellen telkens wanneer de werkmap wordt geopend.

Plaats deze code in de module Thisworkbook:

123456 Privé subwerkboek_Open()Dim ws als werkbladVoor elke ws In werkbladenws.Protect Password:="wachtwoord", UserInterFaceOnly:=TrueVolgende wsEinde sub

of deze code in een reguliere module:

123456 Privé Sub Auto_Open()Dim ws als werkbladVoor elke ws In werkbladenws.Protect Password:="wachtwoord", UserInterFaceOnly:=TrueVolgende wsEinde sub

Arrays gebruiken om grote bereiken te bewerken

Het kan erg tijdrovend zijn om grote reeksen cellen te manipuleren (bijv. 100.000+). In plaats van door celbereiken te bladeren en elke cel te manipuleren, kunt u de cellen in een array laden, elk item in de array verwerken en de array vervolgens terug naar hun oorspronkelijke cellen uitvoeren. Het laden van de cellen in arrays voor manipulatie kan veel sneller zijn.

1234567891011121314151617181920212223242526272829303132 Sub LoopBereik()Dim cel als bereikDim tStart als dubbeltStart = TimerVoor elke cel binnen bereik ("A1:A100000")cel.Waarde = cel.Waarde * 100Volgende celDebug.Print (Timer - tStart) & "seconden"Einde subSub LoopArray()Dim arr As VariantDim item als variantDim tStart als dubbeltStart = Timerarr = Bereik ("A1:A100000"). WaardeVoor elk item In aankomstartikel = artikel * 100Volgende itemBereik ("A1:A100000"). Waarde = arrDebug.Print (Timer - tStart) & "seconden"Einde sub

U zal helpen de ontwikkeling van de site, het delen van de pagina met je vrienden

wave wave wave wave wave