• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

ISO weeknummer

  • Onderwerp starter Onderwerp starter snb
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
20.224
Code:
Function isoweeknr(d1 as Date)
   isoweeknr=Datepart("ww",d1,2,2)
End Function

deze funktie houdt onvoldoende rekening met schrikkeljaren zodat 11 of 12 data per eeuw een verkeerd weeknummer toebedeeld krijgen.
Dat is te ondervangen met de volgende aanpassing:
Code:
Function isoweeknr(d1 as Date)
   isoweeknr=Datepart("ww",d1+4 -weekday(d1,2),2,2)
End Function
 
Laatst bewerkt:
achterhaald
 
Laatst bewerkt:
't is een erg vaak voorkomend iets deze dagen:
http://office.microsoft.com/nl-nl/excel/HA102581001043.aspx

Richard


Hallo SNB ik snap dat je een andere versie bent gaan maken.
wat daar staat vind ik allemaal maar raar opgebouwd ( ben nog geen expert in VBA maar beginner )
en ik heb al meerdere topics van jou gezien en jij wil het kort en krachtig houden en vooral duidelijk.
Ik vind de oplossing die jij hiervoor geschreven hebt zeer mooi.
Super gedaan :thumb:

Vr Gr, Kuilman
 
@SNB:

Als eerste de allerbeste wensen voor 2010.

Ik heb onderstaande code eens ergens gevonden op het internet (auteur weet ik niet meer)

Code:
Public Function ISOweeknumNaarDatum(ByVal Jaar As Integer, ByVal Week As Integer) As Date
  Dim Maandag As Date, IsoWeek As Integer

  Maandag = EersteMaandagJaar(Jaar)
  IsoWeek = ISOweeknum(Maandag)
  If IsoWeek = 53 Then IsoWeek = 1
  
  ISOweeknumNaarDatum = ((Week - IsoWeek) * 7) + Maandag
End Function

Public Function ISOweeknum(ByVal Datum As Date) As Integer
  ISOweeknum = DatePart("ww", Datum, vbMonday, vbFirstFourDays)
End Function

Private Function EersteMaandagJaar(ByVal Jaar As Integer) As Date
  Const DONDERDAG = 4
  Dim Nieuwjaar As Date, Weekdag As Integer

  Nieuwjaar = DateSerial(Jaar, 1, 1)
  Weekdag = DatePart("w", Nieuwjaar, vbMonday, vbFirstFourDays) - 1
  EersteMaandagJaar = Nieuwjaar - Weekdag
  If Weekdag > DONDERDAG Then EersteMaandagJaar = EersteMaandagJaar + 7
End Function
 
niet meer actueel
 
Laatst bewerkt:
Let op:

Public Function ISOweeknum(ByVal Datum As Date) As Integer
ISOweeknum = DatePart("ww", Datum, vbMonday, vbFirstFourDays)
End Function

Heeft een BUG!!

Probeer maar eens:
29-12-2003
31-12-2007
30-12-2019

Uitkomst allemaal week 53 dit moet week 1 zijn.

Gebruik liever:

Public Function IsoWeekNumber(d1 As Date) As Integer
' Attributed to Daniel Maher
Dim d2 As Long
d2 = DateSerial(Year(d1 - WeekDay(d1 - 1) + 4), 1, 3)
IsoWeekNumber = Int((d1 - d2 + WeekDay(d2) + 5) / 7)
End Function

zie ook de bron:
http://www.rondebruin.nl/isodate.htm

Mvg,

Buzz
 
Die bug heeft niets met ISO-criteria te maken, maar met vergeten schrikkeljaren: om de 12,12, 4 jaren krijgt 1 dag het verkeerde weeeknummer met de funktie ISOweeknum = DatePart("ww", Datum, 2, 2).

Het verbaast mij dat in de funktie IsoWeekNumber = Int((d1 - d2 + WeekDay(d2) + 5) / 7) gebruik gemaakt wordt van Int(.../7) terwijl \7 in VBA hetzelfde effekt heeft.

Correct is bijvoorbeeld:

Code:
Function isoweek1(d1)
  isoweek1=(format(d1+4-weekday(d1,2),"y")+6)\7
End Sub

mijn voorkeur heeft
Code:
Function isoweek(d1)
  isoweek=datepart("ww",d1+4-weekday(d1,2),2,2)
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan