Logning af ændringer

 

Log til Excel som logger alle ændringer som er foretaget i dit regneark

 

Dette lille script, forsyner Excel med en logningsfunktion som er savnet af mange.
Der er tale om en makro, som naturligvis kun kører hvis makroer er slået til i Excel, så brugeren kan, hvis de er kyndige nok, undlade at få logget deres ændringer. Hvis du vil undgå dette, kan Excel-regneark.dk være behjælpelig med en løsning.
Scriptet er kompatibelt med både 32 og 64 bit version af Excel.
 
Scriptet kan modificeres i mange retninger, men som standard logges følgende:
 

  1. Hvornår er filen åbnet (dato klokkeslet)
  2. Hvem har åbnet filen (brugernavn på den bruger som er logget ind)
  3. Hvor var filen placeret da den blev åbnet
  4. Hvornår er filen gemt (dato klokkeslet)
  5. Hvem har gemt filen (brugernavn på den bruger som er logget ind)
  6. Hvornår er filen lukket (dato klokkeslet)
  7. Hvem har lukket filen ((brugernavn på den bruger som er logget ind)
  8. Hvor var filen placeret da den blev lukket
  9. Hvornår er det sidst udskrevet på printeren (dato klokkeslet)
  10. Hvem har udskrevet regnearket på printeren  (brugernavn på den bruger som er logget ind)
  11. Er der ændret i filen (dato klokkeslet)
  12. Hvem har ændret i filen (brugernavn på den bruger som er logget ind)
  13. Hvor har brugeren ændret i filen (arknavn og adressen på cellen)
  14. Hvad har brugeren ændret i filen (før værdi, og til værdi)
  15. Hvilke faner brugeren har aktiveret og dermed har set.

Ud over dette, kan du også bestemme hvor logfilen skal placeres, om den skal være skrivebeskyttet og/eller skjult.

 

Logningen sker i en lille tekstfil, navngivet med filens navn og "_brugere.log". Som standard er logfilen placeret i samme mappe som den fil du logger.
Filen oprettes automatisk.

Logfilen ser således ud

Logning af ændringer i Excel

 

Implementering af loggen i dit regneark er meget simpel:

  1. Kopier alt i kodeboksen herunder
  2. Åben den Excel-fil du vil logge
  3. Hold tasten ALT neden og tryk på F11 for at starte VBA-Editoren
  4. Find din fil på listen til venstre, og find THISWORKBOOK (som hedder 'Denne_projektmappe' i Excel 2010 og nyere) som tilhører din fil, klik på den.
  5. Sæt koden ind i det hvide område til højre.
  6. Gem filen.
    Nu er loggen klar til brug.

Alternativt kan du downloade en fil hvor loggen allerede er implementeret, klik her:

'***Copyright Allan Thustrup Mortensen - Excel-regneark.dk ***
 '*************************************************************
 Option Explicit
 Private Const LogFilNavn = "brugere.log" 'Logfilen navngives som standard: filnavn_brugere.log
 Private Const LogFilPlacering = "" 'Hvis tom, gemmes i samme mappe som moderfilen, ellers HUSK at afslutte stien med backslash
 Private Const Gem = True 'Skal Gem indgå i logfilen
 Private Const Åben = True  'Skal Åben indgå i logfilen
 Private Const Luk = True  'Skal Luk indgå i logfilen
 Private Const Udskriv = True  'Skal Udskriv indgå i logfilen
 Private Const Ændring_i_Celle = True  'Skal Ændringer i celler indgå i logfilen
 Private Const AktiveFane = True  'Skal faneskift indgå i logfilen
 Private Const OutputFormat_txt = False 'Sæt denne til 'True' hvis du ønsker at logge tid og datofelter i det rigtige format.
 Private Const SkjulLogfil = False 'Sæt denne til 'True' hvis du ønsker at skjule logfilen (egenskaber for filen)
 Private Const SkrivebeskytLogfil = False 'Sæt denne til 'True' hvis du ønsker at skrivebeskytte logfilen (egenskaber for filen)

'*************************************************************
 Public GammelVærdi As Variant
 #If Win64 Then
    Private Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
 #Else
    Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
 #End If
 
 Function Brugernavn() As String
     Application.Volatile
     Dim Buffer As String * 100
     Dim BuffLen As Long
     BuffLen = 100
     GetUserName Buffer, BuffLen
     Brugernavn = Left(Buffer, BuffLen - 1)
 End Function
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
 If Gem = True Then
     On Error Resume Next
     Call SetFilegenskaber(False)
     If LogFilPlacering = "" Then
         Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     Else
         Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     End If
     Print #1, Brugernavn, "LUK", Now, ThisWorkbook.FullName
     Close #1
     Call SetFilegenskaber(True)
 End If
 End Sub
 Private Sub Workbook_BeforePrint(Cancel As Boolean)
 If Udskriv = True Then
     On Error Resume Next
     Call SetFilegenskaber(False)
     If LogFilPlacering = "" Then
         Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     Else
         Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     End If
     Print #1, Brugernavn, "Udskriv", Now
     Close #1
     Call SetFilegenskaber(True)
 End If
 End Sub
 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 If Gem = True Then
     On Error Resume Next
     If ThisWorkbook.Saved = False Then
         Call SetFilegenskaber(False)
         If LogFilPlacering = "" Then
             Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
         Else
             Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
         End If
         Print #1, Brugernavn, "GEM", Now
         Close #1
     End If
     Call SetFilegenskaber(True)
 End If
 End Sub
 Private Sub Workbook_Open()
 If Åben = True Then
     On Error Resume Next
     Call SetFilegenskaber(False)
     If LogFilPlacering = "" Then
         Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     Else
         Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     End If
     Print #1, Brugernavn, "ÅBEN", Now, ThisWorkbook.FullName
     Close #1
     Call SetFilegenskaber(True)
 End If
 End Sub
 Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 On Error Resume Next
 If AktiveFane = True Then
     Call SetFilegenskaber(False)
     If LogFilPlacering = "" Then
         Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     Else
         Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     End If
     Print #1, Brugernavn, "Aktiv fane ", Now, Sh.Name
     Close #1
     Call SetFilegenskaber(True)
 End If
 End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 On Error Resume Next
 If Ændring_i_Celle = True Then
     Call SetFilegenskaber(False)
     If LogFilPlacering = "" Then
         Open ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     Else
         Open LogFilPlacering & ThisWorkbook.Name & "_" & LogFilNavn For Append As #1
     End If
     If OutputFormat_txt = True Then
         Print #1, Brugernavn, "Ændring", Now, ActiveSheet.Name & " " & Target.AddressLocal, "Fra: " & GammelVærdi, "Til: " & Target.Text
     Else
         Print #1, Brugernavn, "Ændring", Now, ActiveSheet.Name & " " & Target.AddressLocal, "Fra: " & GammelVærdi, "Til: " & Target.Value
     End If
     Close #1
     Call SetFilegenskaber(True)
 End If
 End Sub
 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 On Error Resume Next
 If ActiveCell.Address <> Target.Address Then Exit Sub
 Call SetFilegenskaber(False)
 If OutputFormat_txt = True Then
     GammelVærdi = Target.Text
 Else
     GammelVærdi = Target.Value
 End If
 Call SetFilegenskaber(True)
 End Sub
 Private Sub SetFilegenskaber(Switch As Boolean)
 Dim LogSti As String
 If LogFilPlacering = "" Then
     LogSti = ThisWorkbook.Path & Application.PathSeparator & ThisWorkbook.Name
 Else
     LogSti = LogFilPlacering
 End If
 If Dir(LogSti & "_" & LogFilNavn) <> "" Then
     If Switch = False Then
         SetAttr LogSti & "_" & LogFilNavn, 0
     End If
     If Switch = True Then
         If SkjulLogfil = True And SkrivebeskytLogfil = True Then SetAttr LogSti & "_" & LogFilNavn, 1 + 2
         If SkjulLogfil = False And SkrivebeskytLogfil = True Then SetAttr LogSti & "_" & LogFilNavn, 1
         If SkjulLogfil = True And SkrivebeskytLogfil = False Then SetAttr LogSti & "_" & LogFilNavn, 2
     End If
 End If
 End Sub


 

Opdateret 10-02-2017 14:57:44