Datorn iFokus

Datorn

Etikettmicrosoft-office
Läst 18212 ggr
johan
9

Datum från veckonummer i Excel

Här är ett bra knep om man vill veta vilket datum ett visst veckonummer inträffar. Formeln förutsätter att veckonumret ligger i cell A1:

=DATUM(ÅR(IDAG()); 1; 1)+((A1-1)*7)

På engelska blir formeln:

=DATE(YEAR(TODAY()); 1; 1)+((A1-1)*7)

Mvh // Johan

Mvh // Johan

JimJ
0
#1

Johan, kan du inte förklara hur det där fungerar egentligen? Jag blir nyfiken på varje kod du kommer med, vad de betyder.

DATE(YEAR(TODAY((); förstår man ju. Men vad betyder det andra?

1; 1)+((A-1)*7).

Det låter som om man måste vara riktigt mattematiskt utav sig om man ska leka med kod i Excel? Eller har det ingenting med matte att göra? :-)

Vänliga hälsningar
- Jim Johansson

johan
0
#2

Formeln DATUM(år, månad, dag) (DATE) skapar ett "riktigt" datum baserat på heltal för år, månad och dag. Så den första delen är alltså för att skapa ett riktigt Excel-datum av den första januari för innevaranda år.

ÅR(IDAG()) hämtar ut vilket år det är just nu, dvs. 2007.

+(A1-1)*7 räknar ut hur många dagar det gått på året för ett veckonummer.

Om vi tänker att det det är vecka 1, skulle formeln addera 0 dagar till den första januari. Om det är vecka 2 skulle formeln adderat 7 (dvs. (2-1)*7) till den första januari, etc, etc.

Det som är så fiffigt med Excel är att en dag är lika med 1 i Excels tidräkning. Om man vill addera eller subtrahera dagar från datum är det alltså bara att lägga till 1, 2, 3, etc.

Vill man lägga till timmar kan man således addera 1/24 för att få en timme.

Det går också lätt att ta reda på hur många dagar det är i en månad med liknande teknik. Jag skapar ett datum för den 1:a i nästa månad och drar sedan av en dag. Excel sköter resten:

=DATUM(ÅR(IDAG()); MÅNAD(IDAG())+1; 1)-1

Skulle säga att det är den sista i denna månad är 2007-08-31.

Man kan göra mycket kul med datum i Excel. Och det är enklare än man tror innan man kommit på knepet.

// Johan

Mvh // Johan

JimJ
0
#3

Ah, då förstår jag lite bättre. Tack Johan! Du skulle bli en utmärkt lärare. :-)

- Jim

johan
1
#4

#3: Vilken tur, eftersom jag hållt Excel-kurser i fem år snart. :)

Mvh // Johan

JimJ
0
#5

#4: Ja det förklarar ju saken. Du är garanterat Sveriges bästa Excel lärare. :-)

Jag har använt Excel för många år sedan när jag skulle skriva kund-listor åt ett företag. Men nu har jag Excel 2007 och jag förstår absolut ingenting. Det finns på tok för mycket knappar och menyer. Det kommer ta en stund att utforska allting som är nytt. Nu kan man ju till och med inkludera bilder. Jag tror inte man kunde det i den äldre versionen som jag använde. Ganska häftigt. :-)

Tack igen Johan!

Kaj
0
#6

Man kan även lägga in Analysis toolpack. Där finns veckonummer med som en funkton.

Gå till excel välj Verktyg ochh tillägg. Klicka sedan i Analysis toolpack.

Om du har ett datum fält i cellen A1 och vill ha veckonummret till cell A2 blir formeln i cell A2 följande =VECKONR(A1,2) Eller WEEKNUM(A1,2) på engelska.
Växlen 2 talar om ifall du vill att veckor skall börja med söndag. Genom att använda växel 1 i stället talar man om att veckor skall börja på måndag. (Svensk standard är oftast växel 2)

Efter att du installerat analysis toolpack har du funktionen veckonr tillgängligt via menyen Infoga, Funktion.

Läs mer hos Microsoft om veckonr weeknum

johan
0
#7

#6: Yes, men min formel gör motsatsen. Den tar ett veckonummer och gör ett datum av det, istället för att plocka ut veckonumret från ett datum.

Mvh // Johan

ThomasJ76
0
#8

Hej!

En liten nätt bump på nått år eller så. :)

Formelskapande och Excel är tyvärr inte min starka sida. Det hindrar mig dock inte från att använda det.

Efter en del sökande efter "vecka till datum" formel så stöter jag på denna. Den gör nääästan det jag skulle vilja, men jag skulle kolla om någon kunde modifiera den att även ta med årtalet.

Jag skulle alltså vilja mata in Året i A1 veckan i A2 och få datumet för ex. måndagen den veckan? Är det möjligt?

johan
0
#9

=DATUM(A1; 1; 1)+((A2-1)*7)

Mvh // Johan

ThomasJ76
0
#10

Tackar för ett snabbt svar! Funkar utmärkt! (Får iofs inte samma dag ex. måndagen men det är av mindre betydelse och förmodligen mer avancerat.)

guraknugen
5
#11

Precis vad jag tänkte skriva. Man får inte alls det resultat som #0 nämner. I och för sig står det bara ”om man vill veta vilket datum ett visst veckonummer inträffar”, men det tolkar i alla fall jag som att man vill åt måndagen, eftersom det är då den nya veckan inträffar. I formeln som anges får man bara ett exempel på ett datum i den aktuella veckan, dock alltså ej nödvändigtvis det första.

Detta går dock att råda bot på:

=DATE(A1; 1; 1)+((B1-1)*7)-(((WEEKDAY(DATE(A1; 1; 1);3)-4)/7-INT((WEEKDAY(DATE(A1; 1; 1);3)-4)/7))*7-3)

Nu föll ju dock en av poängerna här, nämligen den att det skulle vara enkelt…

Nu har jag inte Excel så jag har bara testat detta i OpenOffice.org Calc och där fungerade det. Vet inte exakt hur kompatibla de olika programmen är med varandra. Om WEEKDAY i Excel exempelvis skulle sakna typ 3 (veckan börjar med måndag, måndag=0) går det givetvis att komma runt det med hjälp av att istället använda typ 2 (veckan börjar med måndag, måndag=1) och subtrahera med 1 på lämpliga ställen. Formeln blir då istället så här:

=DATE(A1; 1; 1)+((B1-1)*7)-(((WEEKDAY(DATE(A1; 1; 1);2)-5)/7-INT((WEEKDAY(DATE(A1; 1; 1);2)-5)/7))*7-3)

Måste upp och jobba tidigt och är rätt trött nu, så jag orkar inte förklara formlerna, men om så önskas kan jag förklara imorgon. Eller om någon annan hinner före med en förklaring så går ju det också bra…

Hade det funnits en funktion för det som på många miniräknare heter ”Frac(x)”, det vill säga x-int(x), alltså helt enkelt decimaldelen av x, så hade det blivit en betydligt kortare formel.

Har inte installerat det svenska språkpaketet i OpenOffice.org så jag vet tyvärr inte vad WEEKDAY heter på svenska, men en kvalificerad gissning är ju VECKODAG… och INT heter nog HELTAL, har jag för mig. Övrigt har väl redan framgått i tidigare inlägg.

guraknugen
2
#12

Kanske krånglade till det i onödan där. Kom på en annan variant som är mer logisk och lättare att förklara:

=DATE(A1; 1; 1)+((B1-1)*7)-IF(WEEKDAY(DATE(A1;1;1);3)>3;WEEKDAY(DATE(A1;1;1);3)-7;WEEKDAY(DATE(A1;1;1);3))

Det första, DATE(A1; 1; 1)+((B1-1)*7) har redan förklarats. I A1 har jag manuellt skrivit in önskat år och DATE(A1; 1; 1) blir då första januari det året. I B1 har jag lagt veckonumret och att en vecka har 7 dagar är ju ingen större hemlighet. Är det exempelvis vecka 1, så adderas (1-1)·7, alltså 0, precis som väntat.

Efter detta har jag bara lagt till en enkel IF-sats som returnerar ett tal som ska subtraheras från det vi fick fram. I IF-satsen ser vi åter vår datumuträkning för att få fram första januari aktuellt år. Det är ju nämligen så, att om första januari inträffar tidigast på en måndag och senast på en torsdag så är det ju bara att dra bort den veckodagen (måndag=0, tisdag=1 och så vidare) från resultatet av DATE(A1; 1; 1)+((B1-1)*7). Detta kommer att ske om villkoret WEEKDAY(DATE(A1;1;1);3)>3 inte är uppfyllt, det vill säga om vecodagen för första januari inte är fredag eller senare.

Skulle villkoret WEEKDAY(DATE(A1;1;1);3)>3 vara uppfyllt, och det är det ju lite då och då, innebär det att första januari inträffar någon gång under andra halvan av vecka 53 föregående år. Detta måste då tas hänsyn till och det gör vi med hjälp av WEEKDAY(DATE(A1;1;1);3)-7. Vi lägger alltså till sju dagar eftersom första januari som sagt ”tjuvstartat”, så att säga. Eftersom vi subtraherar hela IF-satsen måste vi ju dra av 7 från delresultatet då -(-7)=+7, som bekant.

Har testat med hjälp av några stickprov. Valde vecka 1, 13 och 53 för alla år från 1990 till och med 2020 och alla stämde med kalendern.

Om min förklaring fortfarande känns luddig, kommer här ett försök att skriva om formeln på ett annat ”språk”, något sorts påhittat pseudospråk:

A1: År

B1: Vecka

C1: = FörstaJanuari(År) + ((Vecka-1)*7) - OM(Veckodag(FörstaJanuari(År)>Torsdag, RETURNERA Veckodag(FörstaJanuari(År)-7, ANNARS RETURNERA Veckodag(FörstaJanuari(År))

Hm… vet inte om det blev mer lättläst nu… kanske lite.

Den förra formeln jag hade, i #11, gör i princip samma sak, men denna kändes lite enklare att förklara, som sagt.