Ci ho lavorato un po' sopra e non ho cavato un ragno dal buco.
Il problema era ed è questo:
Data una data ::) e un numero di giorni mi serve conoscere la data
data+giorni al netto delle domeniche e delle festività rosse.
In attesa che i maghi MVP, rastelli, cinquegrani e Marmiroli (a proposito,
che fine ha fatto ?) costringano Bill a istituire la funzione
giorno.lavorativo.settimana.lunga
ho provato a contare i sabati del periodo DATA+GIORNI e a sottrarli al
totale
DATA+GIORNI-SABATI
Preso da un iniziale imbarazzo per la conquista facilmente raggiunta, mi
sono accorto che, per intervalli di tempo molto lunghi GIORNO.LAVORATIVO
andava inutilmente troppo in là e quindi contavo sabati di troppo che mi
sballavano il conto.
Poi quando ho pensato: "ma se ferragosto viene di sabato lo levo due volte?"
ho buttato tutto al vento e ... eccomi qui.
Qualche idea funzionale ?
Paola wrote:
> Il problema era ed è questo:
> Data una data ::) e un numero di giorni mi serve conoscere la data
> data+giorni al netto delle domeniche e delle festività rosse.
Direi che per il conteggio con l'esclusione dei sabati e domeniche si può
trovare una soluzione; per l'esclusione delle festività invece la cosa
diventa un po' più complicata perchè non esiste in Excel un calendario con
tali indicazioni (che tra l'altro variano da Nazione a Nazione). La
soluzione in questo caso non è affatto semplice ed immediata.
Se ti accontenti per il momento della risoluzione del primo punto allora
posso pensare a qualche riga di codice per implementare la funzione
GiornoLavorativoSettimanaLunga (o qualsiasi nome tu preferisca). Facci
sapere.
Ciao
Roberto
però poi mi sono accorta che così potrebbe restituirti una domenica come
risultato... e non è il caso.
Allora l'ho modificata così:
=A1+A2+INT((A1+A2-1)/7)-INT((A1-2)/7)+1*(GIORNO.SETTIMANA(A1+A2+INT((A1+A2-1
)/7)-INT((A1-2)/7))=1)
e sono certa che fernando non ne sarà per niente contento...
Per le festività, mi pare si fosse detto di creare un elenco di tali
festività. Se così fosse queste si possono "aggiungere" (per me
con una matriciale). Però prima, prova la formula sopra per vedere se
funziona.
Ciao
Barbara
Il problema delle festività in quanto tale mi avete già insegnato a
risolvero qualche centinaio di post fa
Ho creato in una parte del foglio un gruppo di celle che, dato l'anno
anno(adesso()) mi calcola le festività dell'anno in corso e di quello
successivo (perchè se il calcolo lo fai a Natale, devi considerare anche il
capodanno e l'epifania dell'anno dopo). Chiamato Festività detto intervallo:
=GIORNO.LAVORATIVO(A1;A2;Festività)
Ma penso che questo lo sapevate già.
"Barbara" <giuliano.anton...@libero.it> ha scritto nel messaggio news:eMKHh53d...@TK2MSFTNGP10.phx.gbl...
| Allora l'ho modificata così:
| =A1+A2+INT((A1+A2-1)/7)-INT((A1-2)/7)+1*(GIORNO.SETTIMANA(A1+A2+INT((A1+A2-1
| )/7)-INT((A1-2)/7))=1)
| e sono certa che fernando non ne sarà per niente contento...
[molto lungo]
provo a fare un riepilogo delle formule per il conteggio dei giorni della settimana
tra due date (mi è stata chiesta sia nel newsgroup sia per mail private).
1. il numero di domeniche a partire dal giorno 1/1/1900 (seriale 1, domenica) al giorno
6/1/1900 (seriale 6, sabato) è 1 (l'1/1/1900, appunto); dal 7/1 al 13/1 è 2; dal
14/1 al 20/1 è 3, e così via per ogni gruppo di 7 giorni;
una funzione che restituisce
1 per valori tra 1 e 6
2 per valori tra 7 e 13
3 per valori tra 14 e 20...
è int((n-1)/7)+1
quindi
=INT((data-1)/7)+1 mi darà il numero di domeniche a partire dall'1/1/1900 (compreso)
2. per contare il numero di lunedì avrò bisogno di una funzione che
restituisce
1 per valori tra 2 e 7
2 per valori tra 8 e 21
3 per valori tra 22 e 27...
come int((n-2)/7)+1
quindi
=INT((data-2)/7)+1 mi darà il numero di lunedì a partire dall'1/1/1900 (compreso)
3. in generale, considerando che 1, 2, 3 corrispondono a domenica, lunedì, martedì, ...
posso dire che
int((n-giornosettimana)/7)+1 mi darà il numero di [giornosettimana] a partire
dall'1/1/1900
in excel =INT((data-[1:7])/7)+1 mi darà il numero di domeniche (1), lunedì (2) a
partire dall'1/1/1900 (compreso).
così in excel, semplificando via via, ottengo:
=INT((DATA.VALORE("28/4/2003")-GIORNO.SETTIMANA(DATA.VALORE("2/1/1900")))/7)+1
=INT((DATA.VALORE("28/4/2003")-DATA.VALORE("2/1/1900"))/7)+1
=INT((DATA.VALORE("28/4/2003")-2)/7)+1
=INT((37739-2)/7)+1
come formule equivalenti
4. il numero di domeniche tra due date (datainizio e datafine) sarà allora pari al
numero di domeniche compreso tra il giorno datafine e l'1/1/1900 compreso, quindi
=INT((datafine-1)/7)+1
meno il numero delle domeniche tra il giorno che precede datainizio e l'1/1/1900
[datainizio viene considerata cioè nell'intervallo], ossia
=INT((datainizio-1-1)/7)+1
ossia la differenza
=INT(datafine-1)/7)+1-(INT((datainizio-1-1)/7)+1).
semplificando e generalizzando:
domeniche =INT((datafine-1)/7)-INT((datainizio-2)/7)
lunedì =INT((datafine-2)/7)-INT((datainizio-3)/7)
martedì =INT((datafine-3)/7)-INT((datainizio-4)/7)
...
sabato =INT((datafine-7)/7)-INT((datainizio-8)/7)
basterà quindi ricordare di associare a datafine
il corrispondente numerico [1:7] del giorno della settimana [domenica:sabato] cercato
5. il numero di giorni tra due date meno un particolare giorno della settimana sarà
quindi
[datafine]-[datainizio-1]-[una delle funzioni prima indicate]
per le domeniche:
=datafine-datainizio+1-INT((datafine-1)/7)+INT((datainizio-2)/7)
in forma più facilmente memorizzabile
=datafine-INT((datafine-1)/7)-(datainizio-INT((datainizio-2)/7))+1
6. quest'ultima formula può essere ulteriormente semplificata in
=INT((6*datafine+giornosettimana-1)/7)-INT((6*datainizio+giornosettimana)/7)+1
quindi
=INT((6*datafine)/7)-INT((6*datainizio+1)/7)+1
fornisce il numero di giorni tra datainizio e datafine escluse le domeniche
=INT((6*datafine+1)/7)-INT((6*datainizio+2)/7)+1
fornisce il numero di giorni tra datainizio e datafine esclusi i lunedì
...
7. è possibile escludere sabati e domeniche con
=INT((6*A2)/7)-INT((6*A1+1)/7)-INT((A2-7)/7)+INT((A1-8)/7)+1
che non ho tempo né voglia di semplificare perchè
equivale a =GIORNI.LAVORATIVI.TOT()
ma che terrò presente se ho una settimana corta senza
domeniche e senza giovedì
=INT((6*A2)/7)-INT((6*A1+1)/7)-INT((A2-5)/7)+INT((A1-6)/7)+1
8. rimane a galla il problema generale posto da paola:
sommando n giorni a una data, che data si ottiene?
la tua soluzione, barbara,
=A1+A2+INT((A1+A2-1)/7)-INT((A1-2)/7)+1*(GIORNO.SETTIMANA(A1+A2+INT((A1+A2-1)/7)-INT((A1-2)/7))=1)
mi sembra funzionare [anche se restituisce,
secondo il mio modo di vedere, un giorno in più: io considero il
giorno stesso come 1, il successivo come 2, ecc.; tu consideri il
giorno stesso come 0, il successivo come 1, ecc.]
è vero però che non mi piace neanche un po' :-)
quella che ti propongo, in base a queste note è un po' troppo
ostica:
=A1+A2+INT((A2-1)/6)-(RESTO(A1-1;7)>0)+(RESTO(A2-1;6)>6+RESTO(A1-1;7))
ma non dispero che tu o qualcun altro o io, se ne avremo
tempo e voglia, possiamo riuscire a semplificarla
9. rimane a galla il problema particolare posto da paola:
con le festività come la mettiamo?
non solo ci sono le festività che coincidono con le domeniche,
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
ma questo amplierebbe ulteriormente l'intervallo:
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
ma questo amplierebbe ulteriormente l'intervallo:
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
ma questo amplierebbe ulteriormente l'intervallo:
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
ma questo amplierebbe ulteriormente l'intervallo:
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
ma questo amplierebbe ulteriormente l'intervallo:
ma prolungando l'intervallo possono essere aggiunte:
~ nuove domeniche che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che non dovranno essere conteggiate nell'intervallo,
~ nuove festività che coincidono con domeniche che non dovranno essere
conteggiate più di una volta nell'intervallo
(fine. ho da lavorare. chiedi la settimana corta, paola :-))
.f
fernando cinquegrani
Microsoft MVP
http://www.prodomosua.it
Non avevo dubbi che non ti piacesse! [non piaceva neanche a me]
Sì, io conto un giorno in più perché secondo me, se vuoi aggiungere "un
giorno lavorativo" a lunedì il risultato deve essere martedì, non lunedì.
[con il tuo sistema, se aggiungi "zero giorni" ti restituisce il giorno
prima della data iniziale, anzi ti torna indietro di un giorno lavorativo.
Es: lun 01/09/2003 ti dà sab 30/08/2003].
> quella che ti propongo, in base a queste note è un po' troppo
> ostica:
>
> =A1+A2+INT((A2-1)/6)-(RESTO(A1-1;7)>0)+(RESTO(A2-1;6)>6+RESTO(A1-1;7))
>
> ma non dispero che tu o qualcun altro o io, se ne avremo
> tempo e voglia, possiamo riuscire a semplificarla
Scusa, ma quand'è che RESTO(x;6) è maggiore di 6?
Comunque adesso la provo.
Ciao
Barbara
perché la seconda parte (almeno con le parentesi così):
+(RESTO(A2-1;6)>6+RESTO(A1-1;7))
restituisce sempre FALSO
Forse tu intendevi:
+(A2>6+RESTO(A1-1;7))
e nella mia versione (cioè contando "un giorno in più" rispetto a te),
dovrebbe essere:
=A1+A2+INT((A2+1)/7)+(RESTO(A1-2;7)>0)+(A2>6+RESTO(A1-1;7))
almeno mi sembra.
Fernando, cosa ne pensi?
Ciao
Barbara
oops! un più al posto del meno e qualche parentesi
forse necessaria:
=A1+A2+INT((A2-1)/6)-(RESTO(A1-1;7)>0)+((RESTO(A2-1;6))>(6-RESTO(A1-1;7)))
6-RESTO(A1-1;7), ossia attribuendo 6,5,4,... se il resto è 0,1,2,...
.f
http://www.prodomosua.it
che c'è ancora possibilità di ridurla
[il ragionamento è questo: consideriamo l'intervallo richiesto (A2)
a partire dall'1/1/1900; tale intervallo è pari a
=INT((6*A1)/7) ossia alla contrazione del periodo
tra la data A1, incognita, e l'1/1/1900 al netto delle domeniche.
allora A1 è pari =A2+INT((A2-1)/6)+1
(questo passaggio potrebbe già essere sviluppato meglio);
mi basta ora sommare il risultato ad A1
=A1+A2+INT((A2-1)/6)+1
e testare se togliere o meno la domenica dell'1/1/1900.
questo dannato test nella mia formula prende troppo spazio]
.f
http.//www.prodomosua.it
tipo: =INT((7*A2+5)/6) ?
> =A1+A2+INT((A2-1)/6)+1
che quindi diventerebbe:
=A1+INT((7*A2+5)/6)
> e testare se togliere o meno la domenica dell'1/1/1900.
> questo dannato test nella mia formula prende troppo spazio]
al momento non ho idee migliori della tua...
Ciao
Barbara
> .f
> http.//www.prodomosua.it
>
>
>
>
direi ce n'è abbastanza per un file d'esempio di rio [quesito10].
ci pensi tu o ci pensa enzo?
.f
Mi metto d'accordo con enzo. Ma sono sicura che potremo
migliorare/semplificare ancora la soluzione.
Ciao
Barbara
"Barbara" <giuliano.anton...@libero.it> ha scritto nel messaggio
news:ePtOF%232eDH...@TK2MSFTNGP12.phx.gbl...
> "fernando cinquegrani" <f.cinq...@prodomosua.it> ha scritto nel
> messaggio news:uLQkDx2e...@TK2MSFTNGP11.phx.gbl...
> > "Barbara" <giuliano.anton...@libero.it> ha scritto nel
> messaggio news:OEH2on2...@TK2MSFTNGP11.phx.gbl...
> > direi ce n'è abbastanza per un file d'esempio di rio [quesito10].
> > ci pensi tu o ci pensa enzo?
> Mi metto d'accordo con enzo. Ma sono sicura che potremo
> migliorare/semplificare ancora la soluzione.
ho seguito tutto il thread passo, passo..
E' parecchio che tento semplificazioni (carta, penna ed algebra)
Circa datainizio, sono con Fernando, è necessario solo convenire che è il
primo giorno lavorativo.
Barbara ha ragione, teoricamente, ma nel fissare il primo giorno di lavoro
(1° marzo)
non è opportuno complicare la vita per trovare lo zero del calcolo con 28 o
29 feb. o (1° marzo -1).
Alla domanda: "Dalla data di assunzione deve lavorare 150 giorni in
settimana corta" (salvo altre festività, per il momento)
l'utente come opera? datainizio=1°marzo-1 ?
Comunque, basta convenire, credo.
Quando tempo c'è ancora?
Attendo i contatti di Barbara
enzo
Ho notato una cosa che non capisco.
Il mio OE5 con riferimento al "mio" thired mi visualizza 7 post.. I primi 4
(Paola-rastelli -Paola - Barbara) sono diciamo così logici. il successivo si
riferisce alle conversazioni precedenti.
Gli altri 3 (Barbara- Ferdinando - Enzo) cuttano testi non presenti.
Mi sono perso qualcosa o ho qualche problema in OE (o avvengono alle mie ...
spalle mail in pvt?)
Grazie sempre e speriamo che la soluzione sia prossima !!
PS cosè :
> Ho notato una cosa che non capisco.
>
> Il mio OE5 con riferimento al "mio" thired mi visualizza 7 post..
Allora ne ha persi per strada:
www.google.com/groups?threadm=gir7b.306309%24Ny5.9526190%40twister2.libero.it
--
Tiziano Marmiroli
Microsoft MVP - Office
Scusate, cosa significa ?