I forbindelse med mange af mine kurser og review-opgaver ser jeg ofte, at man bruger ActiveSheet flittigt i sin kode. Det er generelt en dårlig ide, da ActiveSheet jo refererer til det aktive ark, hvilket svarer til det ark, som man sidst har klikket på, og man kan hurtigt komme galt af sted, hvis dette så ikke er det ønskede ark.
Det er langt bedre at bruge explicitte navne ved fx at henvise til navnet på det ønskede ark:
' Henvis explicit til det ønskede ark ThisWorkBook.Worksheets("Ark1").xxxx
Hvis du sjældne gange alligevel har brug for at arbejde med det aktive ark, skal du sørge for at vælge det først:
' Aktiver et ark med et bestemt navn ThisWorkBook.Workshees("Ark1").Activate ' Gør noget med det aktive ark ActiveSheet.xxxx
ActiveWorkbook og ThisWorkbook
På samme måde bør du undgå ActiveWorkbook og igen bruge navnet på projektmappen a la Workbooks(“minmappe.xlsx”). Hvis du vil referere til den projektmappe, der indeholder din makrokode, kan du med fordel bruge ThisWorkbook.
Arkets objektnavn (kodenavn)
En af de store ulemper ved at bruge arknavne i sin kode er, at man jo skal undgå at man selv eller andre omdøber arkene, da koden så ikke længere vil virke. Dette undgår du ved at give arket et beskrivende navn i feltet (name) i egenskabsvinduet – ikke at forveksle med feltet name, der er det navn der vises på arkfanen (at det så er lidt modsat i projektstifindervinduet må vi leve med).
Arket har fået kodenavnet shSales og navnet Salg, hvor sidstnævnte både vises på arkfanen og i parentesen i projektstifinderen, ligesom du selvfølgelig kan referere til det ved hjælp af navnemetoden.
' Aktiver arket ved hjælp af navnemetoden ThisWorkBook.Workshees("Salg").Activate ' Aktiver arket ved hjælp af kodenavnet shSales.Activate
Hvis brugeren omdøber arket, så det ikke længere hedder Salg, vil den første del af koden ikke virke, men det vil den nederste!
Erklær evt. et regnearksobjekt
Hvis du har flere regneark og/eller mange henvisninger til det samme regneark, kan du med fordel erklære og anvende Worksheet-objekter.
' Opret regnearksbobjekter Dim shRead as Worksheet Dim shWrite as Worksheet ' Brug regnearksobjekterne til to eksisterende ark Set shRead = ThisWorkbook.Worksheets("Ark1") Set shWrite = ThisWorkbook.Worksheets("Ark2") ' Eksempel på kode shWrite.Range("A1").Value = shRead.Range("A1").Value
Eksempelkoden er noget nemmere at læse end ThisWorkbook.Worksheets(“Ark2”) = ThisWorkbook.Worksheets(“Ark1”), og gør faktisk også koden hurtigere i stedet for mange referencer ved hjælp af samlingen Worksheets (selvfølgelig ikke i dette simple eksempel).
Lær mere
Du kan lære meget mere om makroer i min bog om VBA-programmering i Excel. Bogen fås både som e-bog og som i hardcopy som kursusmateriale.