IT Fjernundervisning

Fælles kodebase

Beskrivelse

  1. Fælles kodebase

Ofte har man flere kopier af samme regneark ude hos forskellige brugere. Ændring i sådan et regneark - både på VBA siden, men også i selve regnearket - er ofte noget rod, da man skal sikre sig, at alle brugere har den samme version af filen og opdatering af VBA og struktur skal ske i alle filer.

Nedenfor er der en beskrivelse af sådan en konstruktion (hvis du har købt kurset).


Øvelse

Etablering af kodebase

For at etablere sådan en struktur gør man følgende

  1. Start med at oprette en Add-in. Det gør man ved at oprette en tom fil, som man gemmer som "Excel Add-in (*.xlam)". 
    Pas på - Excel har en holdning til, hvor sådan en add-in skal gemmes, så skal den ligge på et netværksdrev (anbefales), skal du huske at ændre EFTER du har valgt datatypen!
    Det kan også godt betale sig at skrive lidt VBA kode i filen, så du har noget at teste imod. Det kan også godt betale sig, at navngive VBA projektet, så du senere kan genkende det.
    PAS PÅ - Når man arbejder med add-in's virker Excels normale advarsel om at gemme IKKE - du skal SELV sørge for at gemme når du har lavet ændringer i din add-in! 
    Jeg ved ikke om det er noget man på et tidspunkt lærer, men selv om jeg arbejder en del med add-in's har jeg gennem tiden mistet mange timers arbejde på denne konto!
  2. Opret din brugerfil - det er "bare" et helt almindeligt regneark, som du gemmer med aktiverede makroer.
  3. Opret reference mellem din brugerfil og din add-in. Det letteste er at åbne de to filer samtidig, i VBA editoren aktiverer du brugerfilen, vælger Tools | References og sætter hak ud for din add-in (derfor navgivningen under 1.)
  4. Du skal nu kunne bruge kode skrevet i din add-in i din brugerfil - test det!
  5. Det skal også gerne være sådan at når du lukker og åbner brugerfilen igen, at din add-in automatisk indlæses samtidig.
  6. Du kan nu oprette lige så mange kopier af brugerfilen som du har brug for og de bør alle trække på kodebasen når de åbnes (uafhængig af, hvor de ligger - naturligvis under forudsætning af, at de kan se den lokation, hvor din add-in ligger).

Du har nu en kodebase, der kan deles af mange brugere og du har kun ét sted du behøver at vedligeholde deres kode.

Opdatering af kodebase

Den eneste lille krølle ved sådan en fælles kodebase er, at du ikke kan rette i kodebasen, hvis der er en bruger, der har sin fil åben. Det er naturligvis ikke super optimalt, men det "hjælper" dig til at få testet dine kodeændringer inden de rulles ud til brugerne. For at ændre i kodebasen gør man fornuftigt det

  1. Tag en kopi af kodebasen
  2. Tag en kopi af en brugerfil
  3. Åben brugerfil 
  4. Åben kopi af kodebasen
  5. I Tools | Refences fjernes det eksisterende hak ud for kodebasen og der sættes hak ud for den nye kopi i stedet

Nu kan man uden bøvl lave ændringer i kopien af kodebasen (husk at gemme!)

Når alt kører som det skal kan man gøre følgende for at lægge den nye kodebase i produktion (forudsætter, at ingen har deres brugerfil åben)

  1. Omdøb den gamle kodebase (eller flyt den til en anden mappe)
  2. Omdøb den nye kodebase, så den hedder præcis det samme som den gamle

Så skulle den nye kode være i produktion!

Versionsstyring af brugerfiler

Ovenstående gør, at VBA koden til et system kan vedligeholdes ét sted - det er virkelig dejligt!

MEN ofte er det ikke kun koden, der udvikler sig - indholdet i brugerfilen udvikler sig også - en ekstra kolonne, der skal udfyldes eller andet...

Der er desværre ikke nogen let løsning på dette (som jeg kender til), men jeg har kodet en lille ting, der kan sørge for at holde filerne opdateret

Dim Versionsbeskrivelse As String  Sub OpdaterFil()     Dim i As Integer     Dim c As Range     Dim found As Boolean     With ActiveWorkbook         If WksExists("Versionsstyring") Then             If TableExists("tblVersionshistorik", Worksheets("Versionsstyring")) Then                 For i = 1 To AktuelVersion                     found = False                     For Each c In [tblVersionshistorik[Version]].Rows                         If c.Value = i Then found = True                     Next                     If found = False Then                         Versionsbeskrivelse = "Default værdi til version " & i                         Run "OpdaterTilVersion" & i                         If [tblVersionshistorik].Rows.Count = 1 And [tblVersionshistorik[Version]].Text = "" Then                             [tblVersionshistorik[Version]].Value = i                             [tblVersionshistorik[Dato]].Value = Now                             [tblVersionshistorik[Beskrivelse]].Value = Versionsbeskrivelse                         Else                             [tblVersionshistorik].Rows(1).Insert                             [tblVersionshistorik[Version]].Rows(1).Value = i                             [tblVersionshistorik[Dato]].Rows(1).Value = Now                             [tblVersionshistorik[Beskrivelse]].Rows(1).Value = Versionsbeskrivelse                         End If                     End If                 Next             Else                 MsgBox "Versionsstyringsstabellen mangler"             End If         Else             MsgBox "Arkfanen til versionsstyring mangler"         End If     End With End Sub

Som du nok allerede har gennemskuet, så forudsætter ovenstående, at der dels findes en arkfane, der hedder "Versionsstyring" og at der på den arkfane er en tabel, der hedder "tblVersionshistorik". Jeg har lidt støttekode:

Function NameExists(N As String) As Boolean     Dim test As Range     On Error Resume Next     Set test = ActiveWorkbook.Names(N).RefersToRange     NameExists = Err.Number = 0     Set test = Nothing End Function  Function TableExists(N As String, wks As Worksheet) As Boolean     Dim test As String     On Error Resume Next     test = wks.ListObjects(N).Name     TableExists = Err.Number = 0 End Function  Function WksExists(N As String) As Boolean   WksExists = Not (IsError(Evaluate(N & "!A1"))) End Function 

Og en global variabel, der angiver den aktuelle version af brugerfilerne (altså, hvor mange versioner, der skal tjekkes for).

Public Const AktuelVersion As Integer = 4

Den kode der knytter sig til den enkelte opdatering skal ligge i en sub med navnet

Sub OpdaterTilVersion1()     MsgBox "Opdater til 1"     Versionsbeskrivelse = "Her skriver man lidt om hvad versionen har lavet af ændringer" End Sub

Endelig skal man i brugerfilen have en lille eventkode, der sørger for at opdateringen bliver kørt

 Private Sub Workbook_Open()     OpdaterFil End Sub

Flytning af kodebase

Hvis du flytter kodebasen til en ny mappe vil brugerfilerne "naturligvis" knække sammen og her bliver man desværre nok nødt til at tage fat i alle brugerfilerne og opdatere deres reference (lidt bøvlet, men skal kun gøres én gang hver gang du flytter kodebasen). For at genetablere refencen til kodebasen gør man følgende

  1. Åben kodebasen (fra den nye position)
  2. Åben brugerfilen 
  3. Tjek at refencen er i orden (mange gange løser Excel det automatisk)
  4. Gem brugerfilen

 

Hent mit eksempel

Ligger her

Brug for hjælp til VBA, VSTO eller SQL?

Scient Data tilbyder professionel IT-konsulentbistand

Kontakt Scient Data →