Numero della settimana



  • Numero della settimana
    di beppexile data: 09/11/2015 08:01:19

    Buongiorno a tutti,
    qualcuno di voi mi saprebbe dire con quale o quali funzioni posso sostituire WorksheetFunction.IsoWeekNum("data"), in quanto da quel che ho capito, questa è stata introdotta con Excel 2013, e nella versione 2010 mi genera errore.

    Per chi non lo sapesse, la suddetta funzione restituisce il numero della settimana in formato ISO, cioè se guardate il calendario, e prendete l'ultima settimana dell'anno, la 53, finisce di giovedì ma continuerebbe a gennaio;
    ecco: con la vecchia funzione WorksheetFunction.WeekNum("data"), i primi 2 giorni di gennaio 2016 sarebbero considerati settimana 1 e la settimana 2 inizierebbe dal 4 gennaio, mentre, nei miei calcoli, mi serve che siano considerati settimana 53, e la settimana 1 inizia da lunedì 4; questo lo fa la funzione IsoWeekNum.

    Grazie



  • di Marius44 data: 09/11/2015 08:42:40

    Ciao Beppe
    ammesso che la data sia inserita in A2, inserisci nella cella dove vuoi il risultato questa formula:

    =SE(GIORNO.SETTIMANA(DATA(ANNO(A2);MESE(A2);GIORNO(A2));1)<=3;-1;0)+NUM.SETTIMANA(A2;1)

    Vedi se ti va bene.
    Ciao,
    Mario



  • di beppexile data: 09/11/2015 11:44:06

    Ciao Mario, purtroppo avevo provato qualcosa di simile, ma i primi tre giorni di gennaio li considera anche settimana 1, quindi mi ritrovo la settimana 1 che va dal mercoledì 30/12/15 al martedì 05/01/16, il realtà, la settimana dovrebbe essere la 53 che va dal lunedì 28/12/15 alla domenica 03/01/16, e la settimana 1 che va dal lunedì 04/01/16 alla domenica 10/01/16.

    Per risolverlo credo bisogna fare una formula che includa i vari casi, cioè se l'ultimo dell'anno è lunedi, se è martedi, e così via.
    Tu che ne pensi?



  • di Marius44 data: 09/11/2015 12:57:52

    Ciao Beppe
    Nel tuo problema bisogna considerare lo standard europeo circa le date. Riporto dalla Guida di Excel alla funzione NUM.SETTIMANA
    La funzione NUM.SETTIMANA considera la settimana che contiene la data 1 gennaio come la prima settimana dell'anno. Esiste tuttavia uno standard europeo in base al quale la prima settimana viene definita come quella con il maggior numero di giorni, quattro o più, che inizia nel nuovo anno. Per gli anni in cui vi è un numero di giorni minore o uguale a 3 nella prima settimana di gennaio, la funzione NUM.SETTIMANA restituirà pertanto numeri di settimana non corretti in base allo standard europeo.
    Per correggere la funzione e far restituire il numero secondo lo standard europeo
    penso si debba applicare la funzione che t'avevo indicata ma così corretta:

    =SE(GIORNO.SETTIMANA(DATA(ANNO(A2);MESE(1);GIORNO(1));2)>=3;-1;0)+NUM.SETTIMANA(A2;2)

    Come vedi se fai il raffronto, c'è qualche piccola differenza: il confronto deve esse >=3 e non <=3 e bisogna far iniziare la settimana dal lunedi, cioè 2, e dalla domenica, cioè1.
    Infatti, se nella cella A2 indichi 3/1/16 ti dà come risultato settimana n. 0 - se, invece, indichi 4/1/16 ti dà settimana n. 1
    Non saprei come fargli indicare settimana 53 per i primi tre giorni dell'anno prossimo.

    Prova e fai sapere. Ciao,
    Mario



  • di Mister_x (utente non iscritto) data: 09/11/2015 18:13:48

    ciao

    dal grande scossa ,in una discussione per questo lavoro, una funzione ISO
    utilizzo
    WeekOfYear(InDate As Date, Optional ByVal bEstesa As Boolean = False)
    il giorno da valutare ; se omesso quindi vale falso o 0 il valore di ritorno per la settimana 53 sara' -53
    se mettiamo 1 quindi VERO il valore di ritorno sara' 53
    01/01/2016 53
    02/01/2016 53

    ciao
     
    Public Function WeekOfYear(InDate As Date, Optional ByVal bEstesa As Boolean = False) As Variant
      'by scossa
       WeekOfYear = DatePart("ww", InDate, vbMonday, vbFirstFourDays)
      If Month(InDate) = 1 And Day(InDate) < 5 And WeekOfYear > 51 And Not bEstesa Then WeekOfYear = -WeekOfYear
      If bEstesa Then WeekOfYear = WeekOfYear   ''& " del " & (Year(InDate) + bEstesa)
    End Function
    =WeekOfYear("01/01/2016") 
    restituisce -53 
    =WeekOfYear("01/01/2016"; 1)
    resitutisce "53 del 2015"
    






  • di Marius44 data: 09/11/2015 23:12:01

    Con il massimo rispetto verso scossa e Mister_x, sommessamente vorrei proporre una mia formula che esegue il calcolo in maniera esatta (come preferisce l'utente e tiene conto dello standard europeo - la prima settimana dell'anno valida è quella che ha almeno 4 giorni).
    La formula valuta la data posta nella cella A1 e va scritta, ovviamente, tutta di seguito.

    Ciao a tutti,
    Mario
     
    =SE(E(GIORNO($A$1)<=3;MESE($A$1)=1);53;SE(GIORNO.SETTIMANA(DATA(ANNO($A$1);MESE(1);GIORNO(1));2)>=5;NUM.SETTIMANA($A$1;2)-1;NUM.SETTIMANA($A$1;2)))



  • di Mister_x (utente non iscritto) data: 10/11/2015 01:00:27

    ciao mario

    provata la tua formula ma mi da sempre 53 settimane su queste date

    data UDF tua formula
    01/01/2015 1 53
    01/01/2016 53 53
    01/01/2017 52 53
    01/01/2018 1 53
    01/01/2019 1 53
    01/01/2020 1 53
    01/01/2021 53 53
    01/01/2022 52 53
    01/01/2023 52 53
    01/01/2024 1 53
    01/01/2025 1 53
    01/01/2026 1 53

    ciao





  • di Marius44 data: 10/11/2015 07:48:57

    Chiedo scusa a tutti ma un pezzo di formula m'era rimasto in ... punta di penna.
    Voglio dire, fra una prova e l'altra quando ho copiato la formula per postarla, ho messo la penultima e non l'ultima. Ecco la formula esatta.

    Ciao a tutti,
    Mario
     
    =SE(E(O(GIORNO.SETTIMANA($A$1)>=5;GIORNO.SETTIMANA($A$1)=1);GIORNO($A$1)<=3;MESE($A$1)=1);53;SE(GIORNO.SETTIMANA(DATA(ANNO($A$1);MESE(1);GIORNO(1));2)>=5;NUM.SETTIMANA($A$1;2)-1;NUM.SETTIMANA($A$1;2)))



  • di beppexile data: 10/11/2015 08:11:47

    Ciao Mario

    Il discorso della settimana 53 a me serve perché vorrei unificare l'ultima settimana dell'anno in modo che abbia una stessa numerazione di riferimento qualora continui a gennaio.

    Ho fatto delle prove su varie date come ha fatto mister_x, e la tua formula mi restituisce 53 a qualsiasi settimana.
    In realtà io vorrei la numerazione corretta in formato ISO (come la chiama Excel 2013).

    DATE DI RIFERIMENTO - NUM.SETTIMANA.ISO - FORMULA DI MARIUS44 - mister_x by scossa
    lunedì 28-12-2015 53 53 53
    martedì 29-12-2015 53 53 53
    mercoledì 30-12-2015 53 53 53
    giovedì 31-12-2015 53 53 53
    venerdì 01-01-2016 53 53 -53
    sabato 02-01-2016 53 53 -53
    domenica 03-01-2016 53 53 -53
    lunedì 04-01-2016 1 53 1
    martedì 05-01-2016 1 53 1

    lunedì 26-12-2016 52 53 52
    martedì 27-12-2016 52 53 52
    mercoledì 28-12-2016 52 53 52
    giovedì 29-12-2016 52 53 52
    venerdì 30-12-2016 52 53 52
    sabato 31-12-2016 52 53 52
    domenica 01-01-2017 52 53 -52
    lunedì 02-01-2017 1 53 1
    martedì 03-01-2017 1 53 1

    lunedì 25-12-2017 52 53 52
    martedì 26-12-2017 52 53 52
    mercoledì 27-12-2017 52 53 52
    giovedì 28-12-2017 52 53 52
    venerdì 29-12-2017 52 53 52
    sabato 30-12-2017 52 53 52
    domenica 31-12-2017 52 53 52
    lunedì 01-01-2018 1 53 1
    martedì 02-01-2018 1 53 1

    venerdì 28-12-2018 52 53 52
    sabato 29-12-2018 52 53 52
    domenica 30-12-2018 52 53 52
    lunedì 31-12-2018 1 53 1
    martedì 01-01-2019 1 53 1
    mercoledì 02-01-2019 1 53 1
    giovedì 03-01-2019 1 53 1
    venerdì 04-01-2019 1 53 1
    52
    giovedì 26-12-2019 52 53 52
    venerdì 27-12-2019 52 53 52
    sabato 28-12-2019 52 53 52
    domenica 29-12-2019 52 53 52
    lunedì 30-12-2019 1 53 53
    martedì 31-12-2019 1 53 1
    mercoledì 01-01-2020 1 53 1
    giovedì 02-01-2020 1 53 1

    lunedì 28-12-2020 53 53 53
    martedì 29-12-2020 53 53 53
    mercoledì 30-12-2020 53 53 53
    giovedì 31-12-2020 53 53 53
    venerdì 01-01-2021 53 53 -53
    sabato 02-01-2021 53 53 -53
    domenica 03-01-2021 53 53 -53
    lunedì 04-01-2021 1 53 1
    martedì 05-01-2021 1 53 1

    Come nella tabella sopra, anche la formula di scossa ha qualche problema, perché con il -53 avrei un riferimento sbagliato ma che comunque potrei risolvere facilmente portando il segno negativo a positivo, è comunque non tutte corrispondono alla nuova formula di Excel 2013 NUM.SETTIMANA.ISO come per il 30-12-2019 che mi viene indicato come settimana 53.




  • di beppexile data: 10/11/2015 08:14:27

    anche quest'ultima tua formula mi da sempre 53



  • di beppexile data: 10/11/2015 11:45:09

    Rieccomi; facendo delle ricerche su internet ho scoperto che:

    "nella funzione NUM.SETTIMANA(Numero_seriale;[Tipo_restituito]), Excel 2010 ha implementato i codici del secondo argomento [Tipo Restituito] consentendo più possibilità di indicare il giorno di inizio della settimana.
    Con il codice 21 il calcolo viene effettuato appunto secondo il sistema ISO 8601 (europeo)"

    che è per l'appunto quello che volevo io.




  • di scossa data: 13/11/2015 09:26:28

    Ciao,
    scusate la lunga assenza (durerà anche nei prossimi giorni ).

    Ho visto che effettivamente i codici proposti nelle udf (sia la mia che altre in rete) hanno un problema su certe date (vedi tabella sotto).
    Premesso che l'udf ha senso per le versioni di Excel antecedenti la 2010, nel codice sotto riportato propongo una versione corretta (ovviamente non l'ho terstata su tutte le date).

























    ABCDEFGH
    1DATE DI RIFERIMENTO DATE DI RIFERIMENTO =ISO.WEEKNUM($B2)=NUM.SETTIMANA(B2;21)=IsoWeekNumber(B2)=WeekOfYear(B2)=WeekOfYear_old(B2;1)OK
    228/12/201528/12/20155353535353Vero
    303/01/201603/01/20165353535353Vero
    404/01/201604/01/201611111Vero
    510/01/201610/01/201611111Vero
    626/12/201626/12/20165252525252Vero
    701/01/201701/01/20175252525252Vero
    802/01/201702/01/201711111Vero
    908/01/201708/01/201711111Vero
    1025/12/201725/12/20175252525252Vero
    1131/12/201731/12/20175252525252Vero
    1201/01/201801/01/201811111Vero
    1307/01/201807/01/201811111Vero
    1424/12/201824/12/20185252525252Vero
    1530/12/201830/12/20185252525252Vero
    1631/12/201831/12/201811111Vero
    1706/01/201906/01/201911111Vero
    1823/12/201923/12/20195252525252Vero
    1929/12/201929/12/20195252525252Vero
    2030/12/201930/12/20191153153Falso
    2105/01/202005/01/202011111Vero
    2228/12/202028/12/20205353535353Vero
    2303/01/202103/01/20215353535353Vero
    2404/01/202104/01/202111111Vero
    2510/01/202110/01/202111111Vero

    N.B.: nella nuova versione dell'UDF ho eliminato il parametro facoltativo bEstesa.

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)


     
    Public Function WeekOfYear(InDate As Date) As Variant
      'by scossa
       WeekOfYear = DatePart("ww", InDate, vbMonday, vbFirstFourDays)
      If DatePart("w", InDate, vbMonday, vbFirstFourDays) = 1 And Day(InDate) > 28 And WeekOfYear = 53 Then
        WeekOfYear = 1
      End If
    End Function
    



  • di Marius44 data: 13/11/2015 12:54:46

    @scossa
    Sei e rimani sempre un GRANDE!
    Ho fatto qualche test: funziona a meraviglia.

    Ciao,
    Mario



  • di beppexile data: 13/11/2015 13:18:07

    Scossa, hai fulminato tutti, grande!