Datumstämpel med kryssruta i Excel

Datumstämpel med kryssruta – så får du datumet att stanna kvar

I en kort video visade vi nyligen hur du kopplar ihop en kryssruta med en automatisk datumstämpel i Excel – med en OM-formel och funktionen IDAG (eller NU, om du även vill ha med klockslag). Kryssar du i rutan visas dagens datum, och kryssar du ur försvinner det igen. Smidigt och fullt tillräckligt i många lägen.

IDAG och NU är dock flyktiga funktioner som räknas om varje gång arbetsboken öppnas. Datumet visar därför alltid dagens datum – inte den dag då raden faktiskt klarmarkerades. Vill du i stället ha en stämpel som ligger kvar, en riktig logg över när något blev klart, behöver datumet skrivas in som ett fast värde. Så här gör du.

Lösningen: ett fast datum med lite VBA

Knepet är att låta Excel skriva in ett fast datum i samma stund du kryssar i rutan – och sedan låta det vara. Det klarar ingen formel, men det går utmärkt med en kort bit VBA.

Utgångsläget är en vanlig Exceltabell med två kolumner: en kolumn Klar med kryssrutor, och en kolumn Datum. (I mitt exempel heter tabellen tbl_Tabellnamn – byt det mot namnet på din egen tabell.)

Koden lägger du i kodmodulen för själva bladet, eftersom den ska reagera på när något ändras just där:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim tbl As ListObject
    Dim klarKol As Range, datumKol As Range
    Dim traff As Range, cell As Range, dCell As Range

    ' Hämta tabellen på det här bladet
    On Error Resume Next
    Set tbl = Me.ListObjects("tbl_Tabellnamn")
    On Error GoTo 0
    If tbl Is Nothing Then Exit Sub

    ' Datakolumnerna (utan rubrikrad)
    Set klarKol = tbl.ListColumns("Klar").DataBodyRange
    Set datumKol = tbl.ListColumns("Datum").DataBodyRange
    If klarKol Is Nothing Or datumKol Is Nothing Then Exit Sub

    ' Berör ändringen kolumnen Klar?
    Set traff = Intersect(Target, klarKol)
    If traff Is Nothing Then Exit Sub

    On Error GoTo Aterstall
    Application.EnableEvents = False

    For Each cell In traff.Cells
        Set dCell = Intersect(cell.EntireRow, datumKol)
        If Not dCell Is Nothing Then
            If cell.Value = True Then
                dCell.Value = Date        ' Statiskt dagens datum – uppdateras aldrig av sig självt
            Else
                dCell.ClearContents       ' Rensar datumet när rutan kryssas ur
            End If
        End If
    Next cell

Aterstall:
    Application.EnableEvents = True
End Sub

Så lägger du in koden

  1. Tryck Alt+F11 för att öppna VBA-editorn.
  2. Dubbelklicka på rätt blad under Microsoft Excel Objects i projektträdet till vänster – det är viktigt att koden hamnar i bladets modul, inte i en vanlig modul.
  3. Klistra in koden.
  4. Spara arbetsboken som Excel-makroaktiverad arbetsbok (.xlsm). En vanlig .xlsx kan nämligen inte spara makron.

datumstämpel i excel

Hur det fungerar

Koden använder händelsen Worksheet_Change, som körs automatiskt varje gång ett värde ändras på bladet – och en kryssruta som växlar mellan i- och urkryssad ändrar just ett cellvärde (SANT eller FALSKT). Skriptet kontrollerar om ändringen skedde i kolumnen Klar. Blev rutan ikryssad skrivs dagens datum in med VBA-funktionen Date, som ger ett statiskt datum utan klockslag.

Eftersom det är ett vanligt värde och inte en formel ligger datumet kvar – oavsett hur många dagar som kommer och går. Kryssar du ur rutan rensas datumet igen.

Två enkla varianter om du vill ändra beteendet:

  • Vill du även ha med klockslag, byt Date mot Now.
  • Vill du att datumet ska ligga kvar även efter att du kryssat ur, ta bort raden med ClearContents.