Just nu i M3-nätverket
Jump to content

Datum till veckonummer


Leifyy

Recommended Posts

Hej

Kan man på något sätt få till följande:

 

Jag skulle i ett formulär vilja ha två kontroller, den ena skall vara en datumväljare typ datepicker och den andra skall vara en textruta.

 

Det jag skulle vilja få till är att om man väljer ett datum med datepicker så skall textrutan visa vilken vecka datumet tillhör...

Går det???

 

Link to comment
Share on other sites

Den är tuff, men kanske detta kan leda dig in på rätt väg.

 

http://www.microsoft.com/office/community/en-us/default.mspx?dg=microsoft.public.access.modulesdaovba&tid=5d3b9b2f-03b8-40c2-b22b-16fd87e18bc2&cat=en-us-office-access&lang=en&cr=US&sloc=en-us&m=1&p=1

 

Har själv inte testat det, utan endast använt mig av veckonummer i rapporter, vilket är mycket enklare.

 

Link to comment
Share on other sites

Jupp den var tuff, förstod inte riktigt hur dessa skulle infogas.

Troligtvis finns det ingen enkel lösning på att ta fram veckodagen direkt efter en update på en datumkontroller

 

Link to comment
Share on other sites

Hej

 

Inte så krångligt.

Gör så att du skapar en funktion med nedanstående kod.

 

Public Function veckoNr() As Integer

Dim dtDate As Date

Dim iFDow As Integer

 

dtDate = InputBox("Enter a date") 'Inmatnings Box för datum visas

iFDow = 2 'Veckan börjar med Måndag

 

veckoNr = fu_WeekNbr(dtDate, iFDow) 'Funktionen fu_WeekNbr anropas

MsgBox veckoNr 'Resultatet visas

 

End Function

 

 

Du skapar också funktionen fu_WeekNbr, lägger in den kod som redovisas på Microsoft-länken.

 

Du startar funktionen veckoNr, anger önskad datum. veckoNr anropar fu_WeekNbr som räkar ut veckonummret och returnerar den till veckoNr som visar resultatet i en meddelande box.

 

Blev intresserad härom dagen och har provat den mot en flerårig Kalender och de verkar stämma.

 

När du fått de att fungera så får du väl fixa till de som du vill din tillämpning skall fungera.

 

/Olle

 

[inlägget ändrat 2008-10-20 14:03:33 av Olle M]

Link to comment
Share on other sites

Hej

 

Nej du måste använda dej av Visual Basic for Application (VBA) och med Visual Basic Editorn. Detta kopplar din kod till Excel bladet/boken. VBA kan användas i alla Office programmen men är utformade i lite olika varianter för de olika programmen. Du kan också använda VBA för att få olika Office program att prata med varandra (hämta och lämna data).

 

Om du är helt grön, så var jag kanske lite för optimistiskt, när jag sa att de inte var så svårt. Du har nog många veckors strulande och läsande framför dej, särskillt när du skall få till det med dina kontroller. Jag gissar att de är bättre att använder en knapp där du startar beräkningen av veckonummret. Att koppla beräkningen direkt, till varje liten ändring av datumen, kommer att resultera i mycke onödigt beräkningsarbete.

 

Börja med att läsa i hjälpfilen till Visual Basic Editorn och titta på dess kodexempel. De finns också många böcker (på så där en 1000 sidor styck) att köpa med kodexempel och förklaringar där du kan lära sej mycke och se hur andra har löst olika problem. Även böcker som behandlar Visual Basic 6.0 och 6.0 kan ge dej insikt i hur man i princip skall jobba med olika procedurer. Kolla på biblioteket om du kan hitta några böcker som behandlar VBA.

 

Har du tänk dej att lära dej VBA så är de viktigt att kan läsa kodexemplen och förstå vad som sker. Kräver en hel del träning och funderande men du har i alla fall fått ett kodexempel som funkar att utgå ifrån.

 

Gör så här:

Starta din Exelfil där du vill använda koden eller kanske bättre en ny tom bok som du kan testa och köra dina försök på.

Välj Verktygs menyn och klicka på Makro.

Sen väljer du Visual Basic Editor.

Ett nytt fönster öppnas där du i den vänstra halvan ser VBAProject.

Under detta ser du de olika Bladen i Boken.

Dubbel klicka på de blad du vill lägga koden i.

På den högra sidan, där din kod skall skrivas in, ser du nu markören.

Välj nu menyn Infoga och klicka på Procedur...

Fönstret Lägg till Procedur öppnas.

Skriv in namnet på din Proceduren (i ditt fall din Funktion).

Välj Funktion och klicka på OK.

Du ser nu på högersida start raden "Public Funktion Namnet()" och slut raden "End Funktionen". Där i mellan skall du skriva in din kod.

Du måste också skriva in de som skall stå inom ().

 

Upprepa och gör likadant med funktionen fu_WeekNbr.

 

Koden för de båda funktionerna kommer att ligga efter varandra i kodfönstret med ett streck imellan. De har ingen betydelse vilken som ligger först.

 

Spara din Excel fil nu, du slipper då risken för att förlora all inskriven kod. De är nämligen så att om du har gjort vissa fel i koden och kör koden så kan programmet i bland hänga sej och du förlorar all kod du skrivit.

 

När du skapat dina 2 Funktioner så är de dags att provköra koden.

Placera markören någonstans i koden till funktionen VeckoNr.

Gå till Kör menyn och välj "Kör Sub/UserForm" så sparkar de hela igång.

 

Ett inmatningsfönster för datum visas (använd formatet 2008-10-21).

När du klickar Ok så hoppar körningen över till fu_WeekNbr och har med sej din datum och uppgiften om att veckan börjar med en måndag. fu_WeekNbr beräknar veckonumret och hoppar tillbaka till veckoNr med uppgiften som där visas i ett meddelande fönster.

 

Om du får felmedelanden eller någon kodrad blir röd så har du trolig skrivit fel. Du måste klicka på Återställ i Kör menyn och rätta koden innan du kan köra ett nytt försök.

 

/Olle

 

 

 

Link to comment
Share on other sites

Hej Phenomen

 

Din kod ger samma resultat som Gaurav Kothari inledningsvis gav i Microsoft Discussion (länken i andra inlägget) och som slutligen landade på funktionen fu_WeekNbr.

 

Men båda formlerna ger massor av fel om man kontrollerar den mot ISO definitionen av Veckonummer. ISO påpekar också att Mikrosofts kod inte är rätt.

 

Om du däremot modifierar din kod till

DataPart("ww", Date, vbMonday, vbFirstFourDays)

så stämmer den bättre mot ISO definitionen. Du får då bara felaktigt veckonummer 53 för 2003-12-29, 2007-12-31 och 2019-12-30, skall vara 1.

 

Om man däremot kör fu_WeekNbr mot ISO för ovanstående 3 datum så får du rätta värden. Har på kul loopat upp till år 2274 och hittar då bara ett fel 2101-01-02.

 

/Olle

 

Link to comment
Share on other sites

Det här visste jag inte om. MS borde fixa buggen för det ska inte vara så svårt antar jag :)

 

 

Det här borde vara buggfritt eller ?

SELECT Int((DatePart("y",Now())/7)+1)

 

[inlägget ändrat 2008-10-21 22:05:21 av Phenomen]

Link to comment
Share on other sites

Hej

 

Nej du kan inte använda "DatePart". Microsoft har inte brytt sej om att fixa felet fast de har varit kännt länge. Finns även i Vista.

 

Gå till http://www.cpearson.com/excel/weeknum.htm och sen ner på sidan till ISO Week Numbers så kan du läsa mera.

Du kan titta även här http://sv.wikipedia.org/wiki/Vecka

De finns massor av sidor som nämner problemet.

 

I USA och Europa så börjar veckan med Söndag respektive Måndag, vilket krånglar till det.

 

/Olle

 

Link to comment
Share on other sites

DatePart("ww", NOW() )

Får jag att fungera i en textruta vid form load Me.trvecka = DatePart("ww", NOW() ) men hur använder jag

SELECT Int((DatePart("y",Now())/7)+1)

 

Link to comment
Share on other sites

Hej båda två

 

Jag har lopar från 1990 till 2022 och testat i min Excel 2002:

* om man använder Int((DatePart("y",Now())/7)+1) så får man 3189 fel.

* om man användr DatePart("ww", Now())så får man 4826 fel.

* om man däremot användr DatePart("ww", Now(), vbMonday, vbFirstFourDays) så får man bara 4 fel.

 

Konstanterna vbMonday och vbFirstFourDays är lika med 2 och är en anpassning till de Europeiska, Svenska datumssystemet.

Utan konstanter är beräkningen anpassad till USA datumsystem.

 

/Olle

 

 

[inlägget ändrat 2008-10-23 10:18:35 av Olle M]

Link to comment
Share on other sites

Det är först nu jag har förståelse för de som var oroade för milleniumbuggen. Hoppas bara att det inte något projekt du gör åt SAS eller något.

 

Olle M

Skicka ditt testprogram till Microsoft & se vad de svarar.

 

 

Link to comment
Share on other sites

Hej Phenomen

 

Nej jag slängde bara ihop en VBA program på några rader där man ger en startdatum. Sen kör programmet beräkningarna för de två olika programförslagen på veckonummer och jämför resultatet. Är resultatet inte lika så stegar jag en räknare. Sen stegar jag upp datumen en dag och kör en ny omgång. När jag loppat färdigt så visas antalet fel.

 

Som referens har jag använt den VBA kod för veckonummer som finns på sidan http://www.cpearson.com/excel/weeknum.htm under rubriken ISO Week Numbers.

 

Inga konstigheter och troligrn utan intressant för MS. Dom vet ju av att de finns fel i veckoberäkningen och felen är ju få, se inlägget 21 oktober.

 

/Olle

 

 

 

[inlägget ändrat 2008-10-23 18:36:12 av Olle M]

Link to comment
Share on other sites

Tittade närmar på functionen DatePart.

Passar man 2 till argument 3&4, så ska funktionen vara "complied with ISO standard 8601, section 3.17"

 

 

Kan du testa en sista gång med följande två...

 

Int((DatePart("y",Now(),2,2)/7)+1)

och

DatePart("ww",Now(),2,2)

 

 

Link to comment
Share on other sites

Hej Phenomen

 

Du har en ISO kalender på http://www.personal.ecu.edu/mccartyr/isowdcal.html där du kan mata in en datum och klicka på Convert så kan du läsa av veckonumret.

 

Jag har ännu en gång lopat från 1990 till 2022 och testat i min Excel 2000 med Int((DatePart("y",Now(),2,2)/7)+1) och får 3189 fel.

T ex för:

2008-12-29 ger v53 skall vara 1

2008-12-30 ger v53 skall vara 1

2008-12-31 ger v53 skall vara 1

2009-01-05 ger v1 skall vara 2

2009-01-06 ger v1 skall vara 2

2009-01-12 ger v2 skall vara 3

2009-01-13 ger v2 skall vara 3

2009-01-19 ger v3 skall vara 4

osv

 

Får lika många fel och för samma datum som ovan med

Int((DatePart("y",Now())/7)+1)

 

Med DatePart("ww", Now(), 2, 2) så får man bara 4 fel vid:

1991-12-30, 2003-12-29, 2007-12-31 och 2019-12-30.

 

 

/Olle

 

 

Link to comment
Share on other sites

Hej Leifyy

 

Nu efter en längre diskution om veckonummersberäkning så undrar jag hur de går för dej.

 

Jag har skapat ett Excel-blad (version 2000) som visar veckonummer där år, månad och dag kan ändras med SpinButtom kontroller. Fyra små VBA subrutiner ingår, resten hanteras på Excel-bladet.

 

Jag har också skapat ett Access formulär (version 2002) med en Calender7 kontroll där man får fram veckonummret genom att dubbel klicka på önskad datum. En liten VBA subrutin ingår.

 

Veckonummersberäkning sker i båda fallen med formeln:

DatePart("WW", önskad_datum, vbMonday, vbFirstFourDays)

Konstanterna vbMonday och vbFirstFourDays gör att formeln räknar enligt ISO och på ett Europeisk sätt. Formeln ger några fel i sista veckan av December (ger v53 i stället för v1).

Felaktiga värden fås för: 2019-12-30, 2031-12-29, 2035-12-31, 2047-12-30, 2059-12-29. Sen är de väl inte så intressant för någon av oss längre.

 

Den bifogade bilden visar hur programfönstren ser ut. Är du intresserad av hur jag gjort hör av dej.

 

/Olle

 

 

 

[bild bifogad 2008-10-26 14:34:12 av Olle M]

1093230_thumb.jpg

Link to comment
Share on other sites

Tack för att du undrar :)

Jag använder mej av Int((DatePart("y",Now())/7)+1) denna fungerar till min application, men efter dina inlägg så har jag lagt ner rapporteringsbiten. Den skulle jag kunna återuppta om jag fick en lite inblick i din senaste lösning kanske

 

 

Link to comment
Share on other sites

Hej Leifyy

 

Jag har Access 2002 och här kommer en lite utförligare beskrivning av vad jag gjort. Jag har antagit: att du jobba i Access eftersom du talar om formulär, att du har en tabell där du vill lägga in veckonummret och att du har ett formulär för datahantering av din tabell.

 

Jag skapade en databas "Veckonummer.mdb" med en tabell "Projekt" motsvarande din aktuella tabell. Min tabell innehåller kolumnerna "Projektnr" (med räknare) samt "IO-nr" (men kan innehålla vad som helst). Jag lade till en ny kolumn i tabellen och gav den namnet "Veckonummer".

 

Jag skapade ett Formulär "VeckoNr" motsvarande ditt formulär. Där jag placerade en Calender7 kontroll. Se bifogade bilden i förra inlägget.

 

Jag har nu jobbat vidare med formuläret "VeckoNr" och lagt till en textruta "Veckonummer" uppe under databasens två befintliga inmatnings rutor. Genom att dubbel klicka på aktuell datum i kalendern kopieras det beräknade Veckonummret till denna textruta. För att de inmatade veckonummret skall sparas i databasen måste du koppla denna textruta till rätt kolumn i tabellen. Detta gör du genom att under Egenskaper för textrutan ange "Veckonummer" som Kontrollkälla.

 

Vidare har jag placerat knappen "I dag" i formuläret med vilken man kan återställa kalendern till dagens datum. Formulärets nuvarande utseende se du på den bifogade bilden.

 

Har använt Följande subrutiner i Formuläret "VeckoNr":

 

Private Sub Form_Load()

'Ställer in kalendern på dagens datum vid start

Me.Calendar7.Value = Date

'Går till Sub Calendar7_Click för beräkning visning av veckonummer

Calendar7_Click

End Sub

 

Private Sub Calendar7_Click()

Dim a As Date

Dim b As Variant

'Tar fram datum i kort form (2008-10-29) för vald dag

a = Format(Me.Calendar7, "Short Date", vbMonday, vbFirstFourDays)

'Beräknar veckonumret

b = DatePart("ww", a, vbMonday, vbFirstFourDays)

'Visar veckonumret i Textruta 9

Form_VeckoNr.Text9.Value = b

End Sub

 

Private Sub Calendar7_DblClick()

'Dubbelklick överför veckonumret till tabellen

Form_VeckoNr.Text12.Value = Form_VeckoNr.Text9.Value

End Sub

 

Private Sub Kommandoknapp11_Click()

'Återställer kalendern till dagens datum

Me.Calendar7.Value = Date

'Går till Sub Calendar7_Click för beräkning av dagens veckonummer

Calendar7_Click

End Sub

 

Du måste ändra i koden så att namnen för; VeckoNr, Text12 och Text9 stämmer med de beteckningar du kommer att använda i ditt formulär. Använder du en annan Calender än Calender7 i din version av Access så får du också justera namnet i koden.

 

Du behöver koppla dessa referenser till databas projektet för att de skall fungera: "Visual Baic For Applications", "Microsoft Access 10.0 Object Library" samt "Microsoft Calender Control 10.0". Du kontrollerar under menyn Verktyg > Referenser i Visual Basic Editor fönstret att dessa rader är förbockade. Använder du en nyare calender kontroll kan du kanske du behöva lägga till ytterliggare något?

 

Hoppas jag inte glömt något. Du får väl titta på de här och höra av dej om du har funderingar eller om de trasslar.

 

*******

 

När du beräknar veckonummer skall du inte använda formeln int((DatePart("y",Now())/7)+1). Den fungerar visserligen men ger ca 1000 gånger flera fel än formeln

DatePart("ww", Now(), vbMonday, vbFirstFourDays). Se felredovisningen i mitt inlägg den 24 oktober.

 

/Olle

 

PS.

Text9 är veckonummer rutan under Calendern.

Text12 är veckonummer rutan som är kopplad till tabellen.

När du enkel klickar på olika datum i calendern så visat veckonumret i rutan Text9 men inget överförs till rutan Text12.

 

[bild bifogad 2008-10-28 08:51:06 av Olle M]

[inlägget ändrat 2008-10-28 09:04:26 av Olle M]

[inlägget ändrat 2008-10-28 09:07:29 av Olle M]

1093660_thumb.jpg

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...