Just nu i M3-nätverket
Gå till innehåll
Monshi

Riktlinjer för bra VBA-kod

Rekommendera Poster

Postad (redigerade)

VBA är ett ganska fritt språk, man kan skriva kod nästan hur som helst men samtidigt är det då lätt att skapa ren spaghettikod som inte alls gör det man tänkt sig. Med några enkla riktlinjer kommer man dock långt.

Deklarerar alltid alla variabler

Ställ i VBA-editorns alternativ, menyn Verktyg -> Alternativ, att variabler alltid måste deklareras. Raden Option Explicit läggs då till i alla (nya) kodmoduler. Att deklarera allt eliminerar en vanligt felkälla, felstavade variabler, samt ger snabbare kod.

Deklarera alltid variabler som en specifik typ, även det ger en snabbare kod och enklare felsökning. Variant-typen är praktisk i vissa fall men bör vanligen undvikas.

 

Select, Activate

Vid inspelning av makron skapas alltid rader i stil med

Range("A3").Select
Selection.Copy
Range("C4").Select
ActiveSheet.Paste

denna kod ska alltid redigeras, det ovan är inte bra kod. Select och Activate-satser ska enbart användas om man vill uppmärksamma användaren på något. Annars slöar de bara ned och orsakar fel.

Koden ovan kan kortare skrivas som, exempelvis

Range("A3").Copy Range("C4")

Men inte heller denna är riktigt bra, se nästa stycke

 

Referera korrekt

Vid arbeta mot celler på blad ska man alltid sträva efter att ha en explicit referens till cellen man vill arbeta med. Skriver man bara Range("A4") = 1 kan man inte vara säker på var detta ämne hamnar

Om koden skriven på ett modulblad hamnar värdet på det för tillfället aktiva bladet, det vill säga samma som att skriva ActiveSheet.Range("A4") = 1

Om koden skriver på ett arbetsblads kodblad refererar koden till arbetsbladet ifråga, det vill säga samma som att skriva Me.Range("A4") = 1

 

Att referera korrekt

Finns tre sätt att referera till blad.

Me

Det kodblad (objekt) som koden finns skriven på.

Worksheets("Bladnamn")

Bladnamn är det namn som visas i fliklisten i Excel, ett namn användaren kan ändra.

Blad1

Det namn ett blad har i VBA-projektet. Om känt bör det eller, när så passar, Me-referens användas.

 

With-satsen

Enklaste sättet att hålla referenserna i styr är att använda With-satsen, exempelvis

With WorkSheets("Blad1")
.Range("A4").Copy .Range("B2")
End With

Notera punkten, .Range, som inleder referenserna. Denna ger att koden ovan är exakt samma som detta

Worksheets("Blad1").Range("A4").Copy Worksheets.Range("B2")

men med With-satsen blir koden tydligare och enklare att hantera.

 

Snabba upp exekveringen

Det som tar mest tid vid exekveringen är när koden ändrar på ett (synligt) arbetsblad. Minimera skrivningarna är alltid bra samt, om möjligt, skriva till flera celler i grupp.

Ett annat sätt att snabba upp är att stänga av grafiska uppdateringarna av Excel

Application.ScreenUpdating = False

innan man börjar skriva till bladet och

Application.ScreenUpdating = True

när det är klart.

 

Namn

Referera till celler på bladet via adresser är lite vanskligt. En liten ändring på utseendet på bladet, en cell flyttas, kan VBA-koden haverera. En enkel lösning är att namnge de celler som VBA-koden ska använda och använda det namnet i koden istället. Namn som definieras i Excel följer med cellen/området, precis som en formel, om området flyttas. Om området raderas returnerar namnet ett felvärde varvid det blir enkelt att hitta var i koden det blir fel.

När man definierat ett namn är det bara att använda det, tar samma exempel som ovan men säg att vi döpt källan till rnSource och målet till rnTarget

 

Range("rnSource").Copy Range("rnTarget")

Redigerad av Monshi

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Gäst
Detta ämne är nu stängt för ytterligare svar.



×
×
  • Skapa nytt...