Monshi Postad 11 juni, 2010 Share Postad 11 juni, 2010 (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 14 januari, 2011 av Monshi Tommy H och Henry J reagerade på detta 2 Länk till kommentar Dela på andra webbplatser More sharing options...
Rekommendera Poster