Nel modello “Employee Leave Tracker” di Excel il conteggio delle assenze mensili si rompe quando un periodo attraversa la fine del mese (es. 26 gen → 4 feb). Qui trovi tre soluzioni complete: formula d’intersezione, Power Query con PivotTable e funzioni dinamiche (Microsoft 365). Nessun frazionamento manuale.
Perché SUMIFS non basta e cosa serve davvero
La formula classica SOMMA.PIÙ.SE (SUMIFS) funziona perfettamente quando ogni assenza sta interamente dentro un singolo mese. Tuttavia, se un intervallo (Start Date → End Date) “straborda” nel mese successivo, SUMIFS non sa quanti giorni di quel periodo appartengono al mese che stai misurando; vede l’intero intervallo come un’unica voce.
La logica corretta è quindi calcolare, per ogni riga, l’intersezione fra l’intervallo di assenza e il mese in esame, e poi sommare quei giorni. In altre parole: «quanti giorni della riga ricadono tra primo e ultimo giorno del mese X?»
Panoramica delle tre strade possibili
| Approccio | Idea di fondo | Vantaggi | Svantaggi / Note | 
|---|---|---|---|
| Formula d’intersezione | Per ogni riga si calcola la porzione che cade dentro il mese: =MAX(0; MIN(FineAssenza; FineMese) - MAX(InizioAssenza; InizioMese) + 1), poi si somma. | Compatibile con Excel 2016 e successivi; niente componenti esterni; facile da spiegare e verificare. | Richiede una colonna di appoggio oppure un SOMMA.PRODOTTO non banale. Serve gestire i limiti del mese (InizioMese/FineMese). | 
| Power Query → Data Model → Pivot | Si espande ogni intervallo in righe giornaliere, una riga per giorno assente; poi la Pivot conta le righe per mese/anno/dipendente. | Robusta per periodi lunghi e molti dipendenti; perfetta per attraversamenti di mese; Pivot filtrabile per anno, mese, dipendente, tipo di permesso. | Serve abilitare Power Query e sbloccare il file; consigliato Excel 2016+ con PQ. | 
| Funzioni dinamiche (Microsoft 365) | Si elencano “al volo” le date con SEQUENZA/TOCOL e poi si aggrega per mese. | Nessun componente aggiuntivo; risultati immediati e flessibili. | Disponibile solo con Dynamic Arrays; può diventare pesante con tantissimi giorni. | 
Struttura dati di partenza (consigliata)
Assicurati che la tua tabella delle assenze sia in formato Tabella (Ctrl+T) e abbia almeno queste colonne:
- Employee (testo)
 - Type of Leave (testo)
 - Start Date (data)
 - End Date (data)
 
Nel seguito la chiameremo tblAssenze. Se lavori in un ambiente 24×365 (nessun weekend o festività da escludere), ignora funzioni come GIORNI.LAVORATIVI/NETWORKDAYS: contiamo ogni giorno di calendario.
Soluzione 1 — Formula d’intersezione (Excel 2016 e successivi)
Questa soluzione risolve il problema senza Power Query, ed è ideale quando vuoi mantenere il foglio semplice. Si basa su due passaggi: (A) definire i limiti del mese in esame; (B) calcolare a riga quanto cade dentro quei limiti; (C) sommare per dipendente/mese.
A. Definire i limiti del mese
- Crea una cella chiamata MeseCorrente (es. 01/02/2026 o qualsiasi data dentro il mese che vuoi analizzare).
 - Crea due nomi definiti:
- InizioMese: 
=DATA(ANNO(MeseCorrente); MESE(MeseCorrente); 1)(EN:=DATE(YEAR(MeseCorrente), MONTH(MeseCorrente), 1)) - FineMese: 
=FINE.MESE(InizioMese; 0)(EN:=EOMONTH(InizioMese, 0)) 
 - InizioMese: 
 
B. Colonna di appoggio: giorni del periodo nel mese
Nella tabella tblAssenze aggiungi la colonna GiorniNelMese con questa formula per ogni riga:
=MAX(0; MIN([@[End Date]]; FineMese) - MAX([@[Start Date]]; InizioMese) + 1)
Spiegazione. La parte MIN(End; FineMese) - MAX(Start; InizioMese) + 1 calcola la lunghezza dell’intersezione; MAX(0; ...) la azzera quando non c’è intersezione.
C. Aggregazione per Dipendente e Mese con SOMMA.PIÙ.SE
Ora puoi creare una tabella di riepilogo in cui, in una cella, scrivi il dipendente (es. B1=“Mario Rossi”) e nella cella del risultato mensile usi:
=SOMMA.PIÙ.SE(tblAssenze[GiorniNelMese]; tblAssenze[Employee]; B1)
Se desideri distinguere anche per Type of Leave:
=SOMMA.PIÙ.SE(tblAssenze[GiorniNelMese];
               tblAssenze[Employee]; $B$1;
               tblAssenze[Type of Leave]; $B$2)
Variare mese/anno. Basta cambiare MeseCorrente (o duplicare la sezione con mesi diversi). Con pochi click ottieni il calendario annuale.
Variante senza colonna di appoggio (una formula per cella)
Se preferisci non aggiungere colonne alla tabella, puoi calcolare direttamente il totale mensile con SOMMA.PRODOTTO. Funziona benissimo in Excel 2016, sfruttando SE per simulare min/max per riga.
Poniamo che nella cella A2 ci sia una data qualsiasi del mese da conteggiare, in B1 il nome dipendente. Le due variabili di mese sono:
Inizio = DATA(ANNO($A2); MESE($A2); 1)
Fine   = FINE.MESE(Inizio; 0)
Formula del totale giorni per il dipendente B1 in quel mese:
=SOMMA.PRODOTTO(
   ( SE(tblAssenze[End Date] <= Fine;  tblAssenze[End Date];  Fine)
   - SE(tblAssenze[Start Date] >= Inizio; tblAssenze[Start Date]; Inizio)
   - 1 )
 - (tblAssenze[Start Date] <= Fine)
 - (tblAssenze[End Date]   >= Inizio)
 - (tblAssenze[Employee]   =  B$1)
)
La parte con SE(...) restituisce l’intersezione per ciascuna riga; i tre termini moltiplicativi filtrano: periodi che toccano il mese e appartenenza al dipendente. Copia la formula verso il basso per altri mesi (cambiando $A2) e verso destra per altri dipendenti (cambiando l’intestazione col nome).
Controlli qualità rapidi
- Se Start Date > End Date segnala l’errore in input.
 - Se un periodo cade completamente fuori dal mese, la formula produce correttamente 0.
 - Giorni conteggiati sono inclusivi (Start e End compresi). Se vuoi escludere i capi estremi, togli 
+1. 
Soluzione 2 — Power Query + Data Model + PivotTable
Questa è la strada più comoda e scalabile quando vuoi un cruscotto che si aggiorna da solo per anno, mese, dipendente e tipo. L’idea è “esplodere” gli intervalli in righe giornaliere, poi lasciare il conteggio alla Pivot.
Passo–passo in Excel
- Metti i dati in Tabella (Ctrl+T) e chiamala 
tblAssenze. - Dati → Da Tabella/Intervallo per aprire Power Query.
 - Verifica i tipi colonna: Start Date e End Date devono essere Data.
 - Aggiungi colonna personalizzata con la lista dei giorni: 
// Aggiungi lista di date per ogni riga = List.Dates([Start Date], Duration.Days([End Date] - [Start Date]) + 1, #duration(1,0,0,0)) - Espandi la nuova colonna (icona con le frecce) in Nuove righe: otterrai una riga per ogni giorno di assenza. Rinomina la colonna espansa in Giorno.
 - (Opzionale ma utile) Aggiungi colonne:
- Anno: menù Trasforma → Anno su 
Giorno - Mese (numero): Trasforma → Mese
 - Anno-Mese (testo ordinabile): 
= Date.ToText([Giorno], "yyyy-MM") 
 - Anno: menù Trasforma → Anno su 
 - Home → Chiudi e Carica in… → seleziona Solo connessione e spunta Aggiungi al modello di dati.
 - Inserisci → Tabella pivot → Usa questo modello di dati.
 
Impostazione della PivotTable
- Trascina Anno e Mese (o Anno-Mese) nelle Righe.
 - Trascina Employee nelle Colonne (o nei Filtri se preferisci tabelle più compatte).
 - Metti Giorno nei Valori con aggregazione Conteggio. Il conteggio corrisponde al numero di giorni di assenza.
 - Eventualmente trascina anche Type of Leave per filtrare o segmentare per tipo.
 
Perché questa soluzione è “a prova di mese che cambia”
Ogni intersezione viene risolta naturalmente, perché stai contando righe giornaliere: se un periodo va dal 26 gennaio al 4 febbraio, Power Query crea 10 righe (26–31 gen = 6 giorni; 1–4 feb = 4 giorni) e la Pivot ne sommerà 6 nel mese di gennaio e 4 nel mese di febbraio.
Note operative importanti
- Sblocco file e percorso attendibile: dopo il download di un file con Power Query, fai clic destro → Proprietà → Sblocca → OK, quindi salva in una cartella inclusa tra i Percorsi attendibili (Opzioni → Centro protezione).
 - Aggiorna tutto: Dati → Aggiorna tutto per ricalcolare Query e Pivot se la schermata appare vuota.
 - 24×365: non escludere weekend/festività; se il tuo modello di partenza li sottrae, rimuovi quei passaggi oppure carica un calendario aziendale personalizzato in PQ.
 
Extra (facoltativo): misura DAX
Se carichi nel Modello Dati, puoi creare una misura che conta i giorni:
Giorni Assenza := COUNTROWS('Assenze Espanso')
Usala nei Valori della Pivot al posto del Conteggio di Giorno.
Soluzione 3 — Elenco espanso con funzioni dinamiche (Microsoft 365)
Se hai Microsoft 365, puoi costruire tutto con formule “a cascata” (Dynamic Arrays), senza colonne di appoggio permanenti e senza Power Query. L’idea è generare in memoria l’elenco di tutte le date assenti e poi aggregare.
Creare l’elenco di tutte le date assenti
Supponiamo che la tabella si chiami tblAssenze con le colonne Start Date e End Date. La formula seguente crea un’unica colonna “spilled” con tutte le date contenute negli intervalli (una per riga):
=TOCOL(
   MAP(tblAssenze[Start Date]; tblAssenze[End Date];
       LAMBDA(s; e; SEQUENZA(e - s + 1;; s; 1)))
)
(Versione EN: =TOCOL(MAP(tblAssenze[Start Date], tblAssenze[End Date], LAMBDA(s,e, SEQUENCE(e-s+1,,s,1)))))
Nomina il risultato come ElencoDate. Ora ogni giorno di assenza è una riga.
Conteggio per anno-mese (tutti i dipendenti)
- In una colonna ausiliaria calcola il testo Anno‑Mese per ogni data: 
=TESTO(ElencoDate; "yyyy-mm") // EN: =TEXT(ElencoDate, "yyyy-mm") - Elenca i mesi univoci ordinati: 
=ORDINA(UNICI(TESTO(ElencoDate; "yyyy-mm"))) - Affianca il conteggio per ciascun mese: 
=CONTA.SE(TESTO(ElencoDate; "yyyy-mm"); A2) 
Conteggio per Anno‑Mese × Dipendente
Per aggiungere la dimensione “Employee” senza Power Query servono due colonne “spilled” parallele: una per le date, una per i dipendenti ripetuti tante volte quanti sono i giorni del loro intervallo. Con MAKEARRAY (se disponibile) è semplice; in alternativa puoi usare MAP + SEQUENZA e TOCOL con una piccola funzione LAMBDA di supporto.
- Formula che ripete i nomi (una volta al giorno): 
=TOCOL( MAP(tblAssenze[Start Date]; tblAssenze[End Date]; tblAssenze[Employee]; LAMBDA(s; e; emp; MAKEARRAY(e-s+1; 1; LAMBDA(r; c; emp)) ) ) )Nota: seMAKEARRAYnon c’è ancora nella tua versione, valuta l’approccio con Power Query oppure mantieni la Pivot; la formula diventa altrimenti molto articolata. - Ora puoi costruire una tabella dinamica Mesi × Dipendenti usando 
UNICIper intestazioni eCONTA.PIÙ.SEfiltrando per mese e nome. 
Performance. Con dataset molto grandi e periodi lunghi, preferisci l’approccio Power Query: la generazione di milioni di date con funzioni dinamiche può impattare i tempi di calcolo.
Come adattare il modello per un’azienda 24×365
- Niente weekend/festività: se il template originale sottrae sabati, domeniche o giorni festivi, rimuovi quelle formule o passaggi PQ. In questo articolo contiamo tutti i giorni di calendario.
 - Calendario personalizzato (facoltativo): se esistono giorni speciali da trattare separatamente, carica in Power Query una tabella Calendario Aziendale con la lista completa di giorni (colonna Data) e crea relazioni/merge per marcare quelle date.
 
Diagnostica: perché la mia Pivot sembra vuota?
- Data Model non aggiornato → Dati → Aggiorna tutto.
 - File bloccato → tasto destro sul file → Proprietà → spunta Sblocca → OK. Salva in una cartella dei Percorsi attendibili (Opzioni → Centro protezione).
 - Campi non posizionati → in Pivot controlla che Anno/Mese siano in Righe, Employee in Colonne (o Filtri) e Giorno nei Valori come Conteggio.
 - Tipi dato errati → in PQ verifica che Start Date e End Date siano effettivamente di tipo Data.
 
Esempi pronti da incollare
Intersezione per riga (colonna di appoggio)
// ITA
=MAX(0; MIN([@[End Date]]; FineMese) - MAX([@[Start Date]]; InizioMese) + 1)
// EN
=MAX(0, MIN([@[End Date]], EndOfMonth) - MAX([@[Start Date]], StartOfMonth) + 1) 
Totale mensile per dipendente con SOMMA.PRODOTTO (senza colonna)
// ITA
=LET(
   Inizio; DATA(ANNO($A2); MESE($A2); 1);
   Fine;   FINE.MESE(Inizio; 0);
   SOMMA.PRODOTTO(
      ( SE(tblAssenze[End Date]   <= Fine;   tblAssenze[End Date];   Fine)
      - SE(tblAssenze[Start Date] >= Inizio; tblAssenze[Start Date]; Inizio)
      - 1 )
    - (tblAssenze[Start Date] <= Fine)
    - (tblAssenze[End Date]   >= Inizio)
    - (tblAssenze[Employee]   =  B$1)
   )
)
// EN
=LET(
StartM, DATE(YEAR($A2), MONTH($A2), 1),
EndM,   EOMONTH(StartM, 0),
SUMPRODUCT(
( IF(tblAssenze[End Date]   <= EndM,  tblAssenze[End Date],   EndM)
- IF(tblAssenze[Start Date] >= StartM,tblAssenze[Start Date], StartM)
- 1 )
- (tblAssenze[Start Date] <= EndM)
- (tblAssenze[End Date]   >= StartM)
- (tblAssenze[Employee]   =  B$1)
)
) 
Power Query – colonna personalizzata per espandere le date
// In PQ (M)
= Table.AddColumn(
    Fonte,
    "Giorno",
    each List.Dates([Start Date], Duration.Days([End Date]-[Start Date]) + 1, #duration(1,0,0,0))
  )
365 – tutte le date degli intervalli (spilled)
// ITA
=TOCOL(
   MAP(tblAssenze[Start Date]; tblAssenze[End Date];
       LAMBDA(s; e; SEQUENZA(e - s + 1;; s; 1)))
)
// EN
=TOCOL(
MAP(tblAssenze[Start Date], tblAssenze[End Date],
LAMBDA(s, e, SEQUENCE(e - s + 1,, s, 1)))
) 
Consigli pratici e checklist
- Sblocca e autorizza ogni file scaricato prima di aggiornare Query/Pivot.
 - Controlla i formati (Date, Testo) sulla tabella di origine: mezze giornate vanno gestite separatamente, qui conteggiamo giornate intere.
 - Prova incrociata: scegli un mese con periodi “a cavallo” e verifica a mano 2‑3 casi. La somma deve coincidere al giorno.
 - Documenta in un foglio “Impostazioni” le scelte: inclusività degli estremi, presenza/assenza di weekend, eventuali tipologie di permesso.
 
In sintesi (come decidere rapidamente)
- Vuoi restare in Excel “puro” e il file non è enorme? Usa la formula d’intersezione (colonna di appoggio o 
SOMMA.PRODOTTO). - Vuoi una soluzione comoda e scalabile per filtri e report? Power Query + PivotTable è la scelta migliore.
 - Hai Microsoft 365 e ami le formule moderne? L’elenco espanso con 
SEQUENZA/MAP/TOCOLè elegante ma valuta le performance. 
Il punto chiave è sempre lo stesso: conteggiare l’intersezione tra periodo di assenza e mese di calendario. Una volta che applichi questa logica, gli attraversamenti di fine mese smettono di essere un problema.
FAQ veloci
Come gestire le assenze che iniziano e finiscono nello stesso giorno?
Con le formule proposte sono conteggiate come 1 giorno (grazie al +1 finale).
Posso calcolare trimestre o settimana?
Sì: basta sostituire InizioMese/FineMese con i limiti del periodo voluto (primo/ultimo giorno del trimestre, lunedì/domenica della settimana, ecc.).
Come considero mezze giornate?
Converti le mezze giornate in frazioni (0,5) in una colonna “Quantità” e moltiplica l’intersezione per quella quantità, oppure gestisci due record separati (mattina/pomeriggio) se preferisci granularità.
Le festività devono essere escluse?
Nel tuo scenario 24×365 no. Se volessi escluderle, dovresti incrociare le date con un calendario festività e sottrarre i giorni corrispondenti (meglio con PQ).
Esempio completo di impostazione foglio di riepilogo (senza PQ)
- Nella colonna A elenca una data per ogni mese (es. 01/01/2026, 01/02/2026, …).
 - Nella riga 1 metti i nomi dei dipendenti (B1, C1, …).
 - In B2 inserisci la formula SOMMA.PRODOTTO vista sopra, che usa 
$A2per capire che mese calcolare e l’intestazioneB$1per filtrare il dipendente. Copia a destra e in basso: avrai mesi nelle righe, dipendenti nelle colonne. - Se vuoi anche il totale per mese (tutti i dipendenti), aggiungi una colonna Totale che somma la riga, o rimuovi il filtro su 
Employeenella formula. 
Template mentale da ricordare
Conteggio mensile = somma per riga di max(0; min(FineAssenza, FinePeriodo) − max(InizioAssenza, InizioPeriodo) + 1)
Che tu usi formule tradizionali, Power Query o dinamiche 365, tutto converge a questo schema.
Checklist finale prima di chiudere il file
- Il file è sbloccato e in un percorso attendibile.
 - La tabella tblAssenze ha i tipi dato corretti.
 - La Pivot (se usata) mostra Anno, Mese, Employee e conta Giorno.
 - Le formule restituiscono 0 quando non c’è intersezione.
 - Hai verificato almeno un periodo “a cavallo” (gen–feb) manualmente.
 
Con queste tecniche puoi finalmente tracciare le assenze per mese (oltre che per anno) nel modello Employee Leave Tracker, senza spezzare a mano i periodi e senza sorprese quando l’assenza attraversa la fine del mese.
