Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:48 Der er 12 kommentarer og
1 løsning

VBA: uge+år til dato

På en formular kan der indtastes et 2 cifret ugenummre [uge] samt et 2 cifret årstal [aar]. Disse data modtages og behandles af noget VBA kode, som skal omregne f.eks. 02-04 til [fra]=05-01-2004 og [til]=09-01-2004.

Her er kaldet til funktionen:
[fra] = UgeTilDato(([aar] Mod 100) * 100 + [uge])
[til] = DateAdd("d", 6, [fra])

Her er selve funktionen:
Function UgeTilDato(uge As Integer) As Date
  Dim Dato As Date
  Dim ugenr As Integer
 
  Dato = DateValue("1-1-" & uge \ 100)
  Dato = DateAdd("d", 2 - WeekDay(Dato), Dato)
  While DatePart("ww", Dato, vbMonday, vbFirstFourDays) <> 1
    ugenr = DatePart("ww", Dato, vbMonday, vbFirstFourDays)
    Dato = DateAdd("ww", 1, Dato)
  Wend
  UgeTilDato = DateAdd("ww", (uge Mod 100) - 1, Dato)
End Function

Problemet opstår bla. her i år 2004, da de returnerede værdier giver
[fra]=10-01-2004
[til]=16-01-2004

Fejlen opstår igen i år 2008! (og i 2020, men da er programmet jo selvfølgelig "obsolete")

Hvordan skal funktionen omskrives, så jeg får noget brugbart for ALLE uge/år kombinationer?
Avatar billede mugs Novice
23. januar 2004 - 15:51 #1
Opstår fejlen også i årene 2012 og 2016?
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:54 #2
Nej, det gør de ikke.
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:56 #3
helt fra 2020 til 2030 er det ok, men i 1992 er der også problemer.
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:57 #4
1980
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:57 #5
1976
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:57 #6
1964
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 15:58 #7
Jeg vil gætte på at det er alle de år hvor der er en uge 53 i.
Avatar billede mugs Novice
23. januar 2004 - 15:59 #8
Det jeg ville ind på var jo skudår:

If år Mod 4 = 0
Avatar billede puppetmaster Nybegynder
23. januar 2004 - 16:00 #9
ja, men det er ikke det der er problemet, vel?
Avatar billede terry Ekspert
25. januar 2004 - 17:57 #10
puppetmaster>This functions expects the year to be formatted YYYY (2004)

Public Function YW2D(YYYY As Integer, WW As Integer, DayOfWeek As Integer) As Variant
Dim v As Variant
Dim lvar1Monday As Variant

    'A couple of checks
    If YYYY < 1800 Or YYYY > 2100 Then
      YW2D = Null
      Exit Function
    End If
    If WW < 1 Or WW > 53 Then
      YW2D = Null
      Exit Function
    End If

    'Find first Monday of Year
    lvar1Monday = DateSerial(YYYY, 1, 1)
    While Weekday(lvar1Monday) <> 2 '2 = vbMonday
      lvar1Monday = DateAdd("d", 1, lvar1Monday)
    Wend

    'Calculate date
    v = DateSerial(YYYY, 1, (WW - 1) * 7 + Day(lvar1Monday))
    If DayOfWeek > 0 And DayOfWeek < 8 Then
      v = DateAdd("d", DayOfWeek - 1, v)
    End If

    'If the first Monday of the year is in week 2 then we must subtract a week
    If Val(Format(lvar1Monday, "ww", vbMonday, vbFirstFourDays)) = 2 Then
        v = DateAdd("d", -7, v)
    End If
 
    YW2D = v

End Function
Avatar billede terry Ekspert
25. januar 2004 - 18:00 #11
Oh! It only returns one date. The last parameter gives the date for the day of the week, 1 being monday and 7 being sunday. So if you make two calls to th efunction first with 1 (monday) and the next with 5 (friday) you will hopefully get the two dates you want.
Avatar billede puppetmaster Nybegynder
26. januar 2004 - 10:21 #12
Thank you very much, Terry, it works like a charm.
Avatar billede terry Ekspert
26. januar 2004 - 15:00 #13
selv tak :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester