Skottårsbuggen i Excel

Excel använder en tidsseriekod för att räkna med datum. Med start 1:a januari 1900 (om du inte har Excel för Macintosh – se tidigare inlägg) som utgör tidsseriekod 1, 2:a januari är lika med 2 och så vidare. Första januari 2013 är tidsseriekod 41275. Den första januari inträffade således 41275 dagar efter första januari. Eller? Inte riktigt! Först måste man ju justera för att den 1 januari har talet 1. Dagen efter inträffar 2-1=1 dag efter, och första januari 41275-1=41274 dagar efter första januari. Eller?

Inte heller det stämmer riktigt på grund av en liten bugg när man programmerade denna funktion. Man missade att 1900 inte var ett skottår. I Excel finns således 29:e februari 1900 trots att den inte finns i vår kalender. Detta är den så kallade skottårsbuggen i Excel.

Med andra ord inträffade 1 januari 2013 41274 minus 1 = 41273 dagar efter den första januari 1900.

Skottårsbuggen var inte ens en miss utan snarare en medveten bugg. När Excel släpptes i slutet av 1980-talet så gjorde man allt man kunde för sno åt sig Lotus 1-2-3 användare. Lotus 1-2-3 var det dominerande kalkylprogrammet när Excel gjorde entré. Lotus 1-2-3 behandlade år 1900 som ett skottår och därför gjorde Excel det också, så att användare enkelt skulle kunna öppna sina Lotus 1-2-3 ark i Excel.

Att Microsoft inte justerat skottårsbuggen nu när man är den dominanta aktören beror helt enkelt på att problemen som en ändring skulle orsaka anses större än fördelarna med en ändring. Problem uppstår egentligen bara för de som arbetar med datum före 1:a mars 1900. Till exempel så ger VECKODAG fel resultat för datum före 1/3-1900 (28 februari 1900 var en onsdag, inte en tisdag som VECKODAG ger).

Men inträffar inte skottår vart fjärde år? Och 1904 var det ju ett skottår! Varför är då inte 1900 ett skottår? Detta är frågor som någon kan komma med och jag tänkte därför nörda ner mig lite i ”skottårsteori” och förklara både vad ett skottår är och hur man kan hålla reda på det i Excel. Hur många dagar det finns på ett år kan till exempel ha betydelse när man skall räkna ut exakta årsräntor, dröjsmålsräntor eller för produktionsplanering (inköp per dag) etc.



Ett skottår inträffar nästan alltid vart fjärde år och då lägger man till en extra dag i februari (den 29:e). Anledningen till detta är att vårt år med 365 dagar skall representera den tid det tar för jorden att gå ett varv runt solen. Nu råkar det dock vara så att ett varv tar lite längre tid än 365 dagar, mer exakt 365,25635 dagar. Fyra jordvarv runt solen tar således lite drygt en dag mer (1461,0254 dagar) jämfört med fyra år enligt vår gregorianska kalender (4 x 365 = 1460). Genom att lägga till en dag vart fjärde år så kompenserar vår gregorianska kalander problemet att vårt gregorianska år inte är exakt överensstämmande med ett sideriskt år (som ett jordvarv runt solen kallas). Därav följer grundregeln att år som är jämnt delbara med 4 är skottår, vilket innebär att exempelvis 2004, 2008 och 2012 är skottår (2012/4 blir det jämna talet 503, jämfört med 2011/4 som blir decimaltalet 502,75).

Den observante (och något petnoga) läsaren kan dock ana att denna korrigering inte heller är helt perfekt.  För som jag skrev så tar fyra sideriska år ”lite drygt” en dag mer än ett gregorianskt år – 0,25635 dagar mer för att vara exakt. Därför blir inte exakt alla år som är jämnt delbara med fyra ett skottår. År som är jämnt delbara med 100 (1800, 1900, 2000) är enbart skottår om året också är delbart med 400 (1800/400=4,5, 1900/400=4,75, 2000/400=5,00). Med andra ord är år 2000 ett skottår, men inte 1800 eller 1900.

Excels skottårsbugg uppstod helt enkelt för att man enbart tog hänsyn till om året var jämnt delbart med fyra eller inte.

Man räknar således ut om ett år är ett skottår med följande beslutssteg:

  • Steg 1: Om året är jämnt delbart med 4 går du till steg 2. Annars går du till steg 5.
  • Steg 2. Om året är jämnt delbart med 100 går du till steg 3. Annars går du till steg 4.
  • Steg 3. Om året är jämnt delbart med 400 går du till steg 4. Annars går du till steg 5.
  • Steg 4. Året är ett skottår (det har 366 dagar).
  • Steg 5. Året är inte ett skottår (det har 365 dagar).

Den här formeln testar om ett årtal (ett heltal som motsvararar ett år i cell A1) är ett skottår eller inte:

=OM(DAG(DATUM(A1;3;0))=29;”Skottår”;”INTE Skottår”)

Engelska: =IF(DAY(DATE(A1;3;0))=29;”Skottår”;”INTE Skottår”)

DATUM(A1;3;0) ger oss datumet för dag 0 för mars aktuellt år. Dag 1 är månadens första, vilket gör att dag 0 är den sista dagen i månaden före. Sen använder vi funktionen DAG för att bryta ut dagen som ett heltal. Om detta heltal är lika med 29 är året ett skottår. Testar du den på år 1900 får du det felaktiga svaret ”skottår”. Men det är som sagt ett fel som de flesta kan bortse från.

Följande formel är inte beroende av Excels datumfunktioner och ger oss korrekt resultat även för år 1900:

=OM(ELLER(REST(A1;400)=0;OCH(REST(A1;4)=0;REST(A1;100)<>0));”Skottår”; ”INTE skottår”)

Engelska: =IF(OR(MOD(A1;400)=0;AND(MOD(A1;4)=0;MOD(A1;100)<>0));”Skottår”; ”INTE skottår”)

Avslutningsvis: Följande formel kollar om det år vi befinner oss i idag är ett skottår och om så är fallet returneras 366 annars 365.

=OM(DAG(DATUM(ÅR(IDAG());3;0))=29;366;365)

Engelska: =IF(DAY(DATE(YEAR(TODAY());3;0))=29;366;365)

(Visited 771 times, 1 visits today)

2 comments

  • Hej, Anders!

    Tack för att du delar med dig av dina kunskaper genom den här sajten(även om det också är marknadsföring)! Det har hjälpt mig ett antal gånger.
    Tänkte bidra med en lite petig iakttagelse. I andra stycket, andra meningen, skriver du:
    ”I Excel finns således 29:e januari 1900 trots att den inte finns i vår kalender.”
    Jag förmodar att du menar den 29:e februari.

    Mvh
    Jonas