startsida < företaget < organisera < datorer < tips
 
Datumkalkylering II

 
  Kalkylering
Kalkylering I
Kalkylering II
Kalkylering III
Kalkylering IV
Kalkylering V
Kalkylering VI
Kalkylering VII
Villkorsstyrd
kalkylering
Villkorsstyrd
formatering I
Villkorsstyrd
formatering II
Felhanterings-
kalkylering
Matriskalkylering I
Matriskalkylering II
Matriskalkylering III
Matriskalkylering IV
Matriskalkylering V
Datumkalkylering I
Datumkalkylering II
Datumkalkylering III
Datavalidering I
Datavalidering II
Cirkelreferenser
   
  Innehåll
expowera

 

Materialet publicerat med tillstånd från Dennis Wallentin.

Kvartal
För att returnera vilket kvartal ett datum tillhör skapas förutsättningarna i två steg:

  • Skapa en namngiven konstant, vilken kopplar månad och kvartal till varandra.
     
  • Använda konstanten i kombination med funktionerna LETARAD och MÅNAD.

Exemplet i tabellen nedan beskriver kortfattat den tekniska lösningen. Formeln extraherar aktuell månad ur datumet och därefter letar den upp det matchande kvartalet i konstanten "Kvartal".

För att ovanstående formel ska fungera korrekt i version 2000 måste "pipe"-tecknet | ersättas med "backslash"-tecknet, dvs med "\".

Ett betydligare enklare sätt är att använda sig av följande formel:

  • =AVRUNDA.UPPÅT(MÅNAD(A2)/3;0)

Arbetsdagar
Vid installation av tillägget "Analysis Toolpak" får man bl a tillgång till funktionen NETTOARBETSDAGAR. M h a denna funktion kan antal arbetsdagar per period erhållas, även om perioden innehåller allmänna helgdagar. Den kan väl komma till pass vid t ex personalstatistik. I tabellen nedan visas ett exempel på funktionen.

För att beakta helgdagar måste det anges i särskild ordning. Ett tips är att ange dessa separat i ett kalkylblad och referera till de celler som innehåller datumen för helgdagarna såsom:

  • =NETTOARBETSDAGAR(B1;B2;Blad2!B1:B5)

Har man inte tillgång till "Analysis Toolpak" så kan man ändå få fram antal arbetsdagar mellan två datum mha följande formel:

  • =REST(A2-A1+1;7)-OM(VECKODAG(A2;2)>5;VECKODAG(A2;2)-5;
    OM(VECKODAG(A1;2)=6;2;OM(VECKODAG(A1;2)=7;1;0)))
    +HELTAL(((A2-A1+1)/7)*5)

En kortare matrisformel är:

  • {=B2-B1+1-SUMMA(1*(REST(VECKODAG(RAD(INDIREKT
    (B1&":"&B2)));6)=1))}

För att skapa datumserier för arbetsdagar, måndag till fredag, krävs en formel som exkluderar lördagar och söndagar. Självklart (!) kan man även lösa det m h a inbyggda funktioner i XL. Målcellerna måste dock formateras med datumformat:

  • =OM(ELLER(VECKODAG(A1+1)=1;VECKODAG(A1+1)=7);A1+3;A1+1)

Antal dagar per månad

Ibland kan det vara aktuellt att erhålla antal dagar per månad. Det finns ingen inbyggd funktion utan man måste använda ett flertal datumfunktioner till det. Tabellen nedan visar ett exempel.

ÅR-funktionen returnerar 1999 i exemplet medan MÅNAD returnerar 1. DATUM-funktionen returnerar sista datumet för månaden m h a addition med konstanten 1. DAG-funktionens värde är följaktligen 1999-01-31 och returnerar således 31.

Räkna differenser i år, månader veckor eller dagar
XL innehåller många funktioner, även odokumenterade sådana! Bl a är funktionen DATEDIF odokumenterad (dock finns den dokumenterad i XL 2000). Den räknar ut skillnaden mellan två datum, antingen i termer av år, månader eller dagar.

I tabellen ovan visas de tre möjliga utfallen funktionen ger. "D" står för dag, "M" för månad och "Y" för år.

Utöver dessa tre basargument kan de även kombineras! Följande kombinationer är möjliga och exemplifieras i nedanstående tabell:

  • MD = Ger antal dagar mellan två datum, månader och år ignoreras.
     
  • YD = Ger antal dagar mellan två datum, år ignoreras.
  •  
  • YM = Ger antal månader mellan två datum, år ignoreras.

Vill man i en och samma cell få fram skillnaden i år, månader och dagar så löser följande formel det:

  • =DATEDIF(A1;B1;"Y")&" år "&DATEDIF(A1;B1;"YM")&" månader "&DATEDIF(A1;B1;"MD")&" dagar"

DATEDIF-funktionen, såsom den visas i ovanstående exempel, är inte alltid exakt. För nedanstående exempel erhålls 11 månaders skillnad. Utvecklas funktionen kan bättre precision erhållas. I tabellen nedan visas en lösning och där resultatet blir 11,30, dvs 11 månader och 30 dagars differens. En enklare beräkning kan också göras mha faktorn 365.25, vilket ger resultat 11,99, dvs 12 månader. För skottår bör faktorn justeras till 366.

För att erhålla antal veckor mellan två datum behövs inte någon avancerad formel utan följande enkla formel löser uppgiften.

  • =AVRUNDA((Slutdatum-Startdatum)/7;0)

Vill man också fram antal dagar utöver veckantalet sker det bäst med:

  • =REST(Slutdatum-Startdatum;7)

Första & sista dagen i månaden
För att räkna fram sista dagen i varje månad måste vi dels ge XL ett startdatum samt använda oss av flera datumfunktioner. I tabellen nedan visas ett exempel. Genom addition erhålls månad 2 (Månad 1 + 1) men då variabeln "DAG" är lika med "0" så räknar XL fram den sista dagen i föregående månad (Januari) istället för den första dagen i månaden därefter (Februari). Knepigt? Pröva att skriva in formeln =DATUM(ÅR(B2);MÅNAD(B2)+1;1) - resultatet blir då 1999-02-01. Tar vi bort additionen i den ursprungliga formeln så erhålls istället 1998-12-31!

I nästa exempel visas hur vi beräknar fram första dagen i månaden. Formelmässigt bygger exemplena vidare på föregående resonemang.

Har du Analysis Toolpak installerad kan du använda dig av funktionen SLUTMÅNAD.

Antag att du har startdatumet 2000-05-24 och vill erhålla

  • sista datumet i maj: =SLUTMÅNAD(Startdatum;0)
     
  • första datumet i maj: =SLUTMÅNAD(Startdatum;-1)+1
     
  • sista datumet i april: =SLUTMÅNAD(Startdatum;-1)
     
  • sista datumet i juni: =SLUTMÅNAD(Startdatum;1)

Skapa egna datumintervaller
I vissa sammanhang, såsom vid uppföljning och vid rapportering , kan man vara betjänt utav att skapa egna datumintervaller. Exemplet i tabellen nedan visar ett sätt att bygga upp datumintervaller. Den utgår från samma grundformel som i föregående exempel. Här används också KOLUMN-formeln för att få fram formelns kolumnposition (t ex 2) och som reduceras med 1 (2 - 1 ) och som därefter läggs till månad, dvs lägger till ytterligare en månad (t ex månad 1+1=månad 2).

Första måndagen i månaden

Söndagar är dag 1 i veckan för XL, dvs representeras av talet 1. Måndagar representeras följaktligen av talet 2. Givet denna kunskap kan vi bygga upp en formel som beräknar datumet för den första måndagen i en månad. Bilden nedan visar formeln i sin helhet. OM-funktionen används för att utvärdera huruvida startdatumets dag är en söndag eller måndag och beroende utfallet sker en beräkning.

Vill man lösa det på annat sätt sker det bäst med följande formel:

  • =DATUM(ÅR(A1);MÅNAD(A1);1+VÄLJ(VECKODAG(DATUM(ÅR(A1);
    MÅNAD(A1);1));1;0;6;5;4;3;2))

Skottår?
Skottår inträffar var 4:e år, dvs årets dagar blir 366 istället för 365. Men hur får fram om ett år är skottår eller inte? Som vanligt i XL så finns det flera lösningar på problem. För att bestämma om ett år är skottår eller inte kan man vanligtvis nöja sig med att undersöka huruvida årtalet är jämnt delbart med 4. Om ja, så är det ett skottår. Vilken månad är det som får en extra dag? Jo, februari månad får en dag till, dvs 29 dagar istället för 28 dagar. Båda dessa resonemang kan "översättas" till XL för att i XL fastställa huruvida år är skottår eller inte. I det första exemplet nedan utvärderas det aktuella året genom ett påstående om att utfallet av REST-funktionen. I det andra exemplet sker också en utvärdering i kombination med ett flertal datumfunktioner.

Ett mycket enklare sätt att utvärdera huruvida ett år är skottår eller inte är att använda sig av följande formel:

  • =OM(MÅNAD(DATUM(ÅR(A9);2;29))=2;"Sant";"Falskt")

Vill man få fram antal skottår för perioder kan det ske enklast i två steg:

  • Använd formeln =REST(ÅR(Celladress);4)=0
     
  • I en ny kolumn används formeln =ANTAL.OM(Område;"SANT")

En mer komplex lösning är att använda sig av följande formel:

  • {=SUMMA((MÅNAD(DATUM(RAD(INDIREKT
    (ÅR(A1)&":"&ÅR(A2)));2;29))=2)*1)}

Ovanstående formel ger enbart antal skottår mellan två datum. Om man vill beakta vilka datum som anges och utifrån dessa erhålla antal skottår kan det lösas på nedanstående sätt:

  • {=SUMMA((MÅNAD(DATUM(RAD(INDIREKT(ÅR(A1)&":&ÅR
    (A2)));2;29))=2)*1)-((MÅNAD(DATUM(ÅR(A1);2;29))=
    2)*(A1>DATUM(ÅR(A1);2;29)))-(MÅNAD(DATUM(ÅR
    (A2);2;29))=2)*(A2<DATUM(ÅR(A2);2;29))}

Antag att cellen A1 innehåller 1990-02-10 och cell A2 1996-02-12 så blir antal skottår är 1, då cellvärdet i A2 är innan skottdagen (29). Ändras värdet i A2 till 1999-02-29 så blir antalet skottår 2 för denna formel.

Datumkonvertering
Här demonstreras hur OM-funktionen i kombination med TEXT- och DATUM- funktioner kan lösa ett komplext problem.

Utmaningen är att omvandla datum till löpande månadsnummer och med följande förutsättningar:

Startpunkten är 1998-01-01 och där 1999-01-01 utgör den 13:e månaden från startpunkten (12+1). Följaktligen ska 2000-01-01 vara den 25:e månaden (24+1).

Resultatet ska presenteras som t ex "13.Januari 1999".

I tabellen nedan visas exemplet i sin helhet.

Formeln som genererar utfallet är:

  • =OM(OCH(ÅR(A8)=1998;MÅNAD(A8)<10);"0"&MÅNAD(A8)&"."&" "&INITIAL(TEXT(A8; "MMMM"))&" "&ÅR(A8); OM(ÅR(A8)=1999; "12"+MÅNAD(A8)&"."&" "&INITIAL(TEXT(A8; "MMMM"))&" "&ÅR (A8); OM(ÅR(A8)=2000;"24"+MÅNAD(A8)&"."&" "&INITIAL (TEXT (A8; "MMMM"))&" "&ÅR(A8); MÅNAD(A8)&"."&" "&INITIAL (TEXT (A8;"MMMM"))&" "&ÅR(A8))))

Puh! Vad gör formeln egentligen? Jo, följande:

  • Om årtalet är 1998 och månaden mindre än 10 så sammanfogar formeln "0" med "en punkt ", mellanrum och med månad och årtal, dvs "01. Januari 1998". Det sista argumentet i formeln är när månaden är större än 9 (>=10) för årtalet 1998, dvs "12. December 1998".
     
  • För de andra årtalen så adderas månaden med 12 månader respektive 24 månader och ger samma utfall som ovan.

Funktionen DATUMVÄRDE
Om du t ex arbetar med importerad data från en annan miljö kan det uppstå problem med datum, i synnerhet om man ska utföra datumberäkningar.

Det är här som funktionen DATUMVÄRDE kommer in i bilden.

Antag att du har datumangivelser som ser ut på följande sätt: 20000515.

För att erhålla ett konverterat datum, såsom 2000-05-15, kan följande formel ge lösningen.

  • =DATUMVÄRDE(VÄNSTER(A4;4)&"-"&EXTEXT(A4;5;2)
    &"-"&HÖGER(A4;2))

Resultatet visas som ett heltal, såsom 36661 (antal dagar från 1 januari 1900), varför du måste formatera cellerna till ett datumformat.

Antag att du ska räkna förekomsten av värden utifrån ett givet datum. Även här i matrisformler fungerar DATUMVÄRDE-funktionen alldeles utmärkt:

  • {=SUMMA(A1:A24=1)*(B1:B24=DATUMVÄRDE("2000-05-15"))}

I finansiella sammanhang brukar man vanligtvis räkna med 360 dagar. Antag att du vill erhålla antal dagar mellan två datum. M h a funktionerna DAGAR360 och DATUMVÄRDE erhålls snabbt svaret på frågan:

  • =DAGAR360(DATUMVÄRDE("2000-01-14");
    DATUMVÄRDE("2000-12-14"))

Vill man erhålla heltalet för ett viss datum kan det lösas på följande sätt:

  • =DATUMVÄRDE(TEXT(NU();"ÅÅÅÅ-MM-DD"))

Jag fick en förfrågan per e-post som knyter an till DATUMVÄRDE. Personen ville att XL skulle hålla reda på om dag 11 i en månad infaller på en lördag eller söndag. Om ja, så ska formeln visa datumet för den påföljande måndag istället. Därutöver skulle man manuellt mata in månadsangivelse.

Lösningen blev relativ komplex men visar på styrkan med att ha kunskap om funktionen DATUMVÄRDE:

  • =OM(VECKODAG(DATUMVÄRDE(2000&"-"&A1&"-"&11))=1;
    DATUMVÄRDE(2000&"-"&A1&"-"&12);
    OM(VECKODAG(DATUMVÄRDE(2000&"-"&A1&"-"&11))=1;
    DATUMVÄRDE(2000&"-"&A1&"-"&13);
    DATUMVÄRDE(2000&"-"&A1&"-"&11)))

Formeln utgörs av en nästlad OM-funktion och där aktuell månad hämtas från cell A1.

Bestämma betalningsdatum
En del användare nyttjar XL till fakturering. I det sammanhanget kan det vara en poäng att låta betalningsdatumet infalla under arbetsveckodagarna.

Antag att vi har 30 dagar netto som betalningsvillkor. Bilden nedan visar förutsättningarna i övrigt:

För att erhålla förfallodatumet kan följande formel användas:

  • =OM(VECKODAG(C9+30)=1;C9+31;OM(VECKODAG
    (C9+30)=7;C9+29;C9+30))

Cellen som innehållet betalningsdatumet måste formateras mha ett datumformat.

Vill vi även erhålla vilken veckodag förfallodatumet infaller under kan det ske med följande formel:

  • =VÄLJ(VECKODAG(C9);"Må";"Må";"Ti";"Ons";"To";"Fre";"Fre")
Upp
Senast uppdaterad: 2005-10-05 © Dennis Wallentin