General

6.109 Determinare il primo e l'ultimo giorno di ciascuna delle 52 settimane di un anno
  Carlo Costarella
(D)
Come posso sapere quale è la data del primo e ultimo giorno di una settimana qualsiasi e utilizzare tali date per filtrare un set di record?

(R)
Il problema delle settimane è strettamente legato al primo giorno dell'anno.
Qui bisogna dire che la prima settimana dell'anno potrebbe non essere di sette giorni.
In Italia il primo giorno della settimana è il lunedì, in America la domenica.
Per queste ragioni bisogna escogitare un sistema che tenga conto di queste variabili.
Mi sono ingegnato a realizzare un sistema che possa dare il risultato atteso.
Ho realizzato una tabella chiamandola "Settimane" con un campo "NSettimana" di tipo numerico e chiave primaria; un campo "DataInizio" di tipo data/ora e un campo "DataFine" di tipo Data/Ora.
Poi ho realizzato la sub che riporto sotto che richiede di immettere il primo giorno dell'anno che si vuole serializzare in settimane.
Questa sub presuppone che la tabella "Settimane" sia vuota.
Una volta eseguita la sub la tabella sarà riempita dalle 52 settimane con data inizio e data fine settimana.
Utilizzerai questa tabella per stabilire le due date che ti servono: se l'utente digita 45, per esempio per cercare i valori della 45a settimana dell'anno, il valore da cercare sarà DLookUp("DataInizio","Settimane","NSettimana = 45") e DLookUp("DataFine","Settimane","NSettimana = 45").

Eccoti la sub:
Public Sub DeterminaSettimane(DataIniziale As Date)
   ' in DataIniziale mettere il primo giorno dell'anno che si desidera
   'nel formato "01/01/2003"
   'esempio: DeterminaSettimane("01/01/2003")
 
   Dim NuovaData As Date
   Dim rcs As Recordset, i As Integer
   Dim MioGiorno
   MioGiorno = WeekDay(DataIniziale, vbMonday)
   'questo perchè il primo giorno è il lunedì
 
   'Ora accodo i valori solo per la prima settimana
   Set rcs = CurrentDb.OpenRecordset("Settimane")
    With rcs
    .AddNew
    !NSettimana = 1
    !DataInizio = DataIniziale
    !DataFine = DataIniziale + (7 - MioGiorno)
    .Update
    End With
    
    NuovaData = DataIniziale + ((7 - MioGiorno) + 1)
 
    'finalmente accodo gli altri valori
    For i = 2 To 53
            With rcs
            .AddNew
            !NSettimana = i
            !DataInizio = NuovaData
            !DataFine = NuovaData + 6
            NuovaData = !DataFine
            .Update
            End With
        NuovaData = NuovaData + 1
    Next i
    rcs.Close
End Sub


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.