Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[excel] calcolo tempo lavoro

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[excel] calcolo tempo lavoro

Postdi mdc » 06/09/07 22:33

Chiedo aiuto per poter stimare i giorni di lavoro, es. in A1 metto un valore (200) ore di lavoro, in A2 metto "adesso()", in A3 metto le ore lavorative giornaliere "8", in A4 vorrei visualizzare i "giorni,ore,minuti" che si impiegano per eseguire il lavoro escludendo la fascia oraria "sabato dalle ore 12.00 fino al lunedì mattina alle ore 8.00".

spero di essere stato chiaro, grazie in anticipo per l'aiuto...
mdc
Newbie
 
Post: 4
Iscritto il: 06/07/07 22:27

Sponsor
 

Postdi Anthony47 » 07/09/07 02:30

Vuoi sapere data/ora di termine dell’ attivita’, o solo la durata in gg, hh, mm? Incrociando i tuoi dati desumo che il sabato si lavora 4h, e’ cosi’?

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi mdc » 07/09/07 06:39

ciao
entrambe se si può, quella più importante è la data e ora di termine attività. confermo le 4 ore di sabato.
mdc
Newbie
 
Post: 4
Iscritto il: 06/07/07 22:27

Postdi Anthony47 » 09/09/07 23:22

Spesso nei miei sviluppi ho una esigenza analoga, ho quindi deciso di sviluppare la funzione TERMINE che fa questo.
Alla funzione va passata una serie di parametri:
-la durata del task, in ore:minuti (eventualmente anche secondi)
-la data/ora di inizio del task, nel formato (es.) 8 Set 2007 10:00 (cioe’ nella stessa cella)
-l’ orario di lavoro: 4 celle adiacenti in verticale con Inizio mattina, Fine mattina, Inizio pom, Fine Pom. Se l’ orario e’ continuativo allora metterete gli stessi valori su Fine mattina e Inizio pomeriggio.
-l’ orario di lavoro del sabato e’ solo quello mattutino (prendetelo come un limite noto)
-opzionalmente: un flag 1/0 per indicare se inserire (1) o no (0) il sabato nel calcolo delle ore; se omesso equivale a 0=no
- opzionalmente: un range che elenca le giornate festive; tutti i giorni che figurano in elenco vengono esclusi dal calcolo delle ore. Potete inserire le festivita’ senza preoccuparvi se capitano di sabato o domenica. Le festivita’ vanno inserite ovviamente complete dell’ anno, quindi scriverete 1 Nov 2007, ma poi aggiungerete 1 Nov 2008 (o, dopo il 1° Nov 2007, editate l’ anno).
-il calcolo viene eseguito correttamente anche se l’ orario di inizio e’ fuori dall’ orario di lavoro, es se inizio task<Inizio mattina viene normalizzato a Inizio lavoro; idem se capita in gg non lavorativo, o dopo l’ orario di fine lavoro, o nell’ intervallo matt/pom.
-Volutamente e’ inserito un limite max di 1000 giorni.

La durata va inserita in ore; per visualizzare la cella coerentemente, formattate (tab Numero), categoria “Personalizzato” e come Tipo inserite “[h]:mm:ss” senza le virgolette.
Lo start va inserito come data/ora; suggerisco di formattare questa cella, tab Numero, categoria “Personalizzato” e come Tipo inserite “ggg m/g/aaaa hh:mm” (per chi avesse settagli inglese: ddd m/d/yyyy hh:mm); cosi’ visualizzerete, ad esempio, Lun 10 Set 2007 10:00.


La sintassi e’
=TERMINE(durata;data/h inizio; 1°cella dell’ orario; [Sabato si=1 no=0];[range gg festivi])
Esempi di corretto richiamo della funzione:
Codice: Seleziona tutto
=TERMINE(A1; A2; A3)
No sabati, nessun elenco di festivita’
Codice: Seleziona tutto
=TERMINE(A1; A2; A3;0;L:L)
No sabati, colonna L per le festivita’
Codice: Seleziona tutto
=TERMINE(A1; A2; A3;;L:L)
equivalente alla precedente
Codice: Seleziona tutto
=TERMINE(A1; A2; A3;1)
Si sabati, nessun elenco di festivita’
Viene reso data e ora di scadenza; anche questa cella potrebbe essere formattata tab Numero, categoria “Personalizzato” e come Tipo inserite “ggg m/g/aaaa hh:mm”.

Il codice da inserire in un normale Modulo del vba:
Codice: Seleziona tutto
Function Termine(Durata, via, tt, Optional SabY = 0, Optional Holid) As Double
'Data una "durata" in [hh]:mm:ss, una data/ora di inizio, e un orario di lavoro,
'   calcola la data/ora di conclusione (di una attivita')
'L' orario deve essere su 4 celle adiacenti in verticale:
'  >orario di inizio
'  >orario di fine mattutino
'  >orario inizio pom
'  >orario di fine
'
'Si puo' inserire escludere il Sabato, che comunque e' calcolato
'    lavorativo solo il mattino. Default = 0=No
'Si puo' inserire un' area con le festivita', che vengono totalmente
'   escluse dal calcolo delle ore lavorate
'
'MAX 1000 giorni
'
'by Anthony47
Dim HGGstd As Double
Dim HSab As Double
Dim ElapTot As Double
Dim ElapD0 As Double
Dim Interv As Double
Dim HStart As Double
Dim hPom As Double

Dim DDay As Integer
Dim GSet As Integer
Dim Extra As Double
'Calcolo ore oggi
Interv = tt.Offset(2, 0) - tt.Offset(1, 0)
HGGstd = tt.Offset(3, 0).Value - tt - tt.Offset(2, 0).Value + tt.Offset(1, 0).Value
If SabY = 1 Then HSab = tt.Offset(1, 0).Value - tt Else HSab = 0
HStart = via - Int(via)
If HStart < tt Then HStart = tt
If HStart > tt.Offset(3, 0) Then HStart = tt.Offset(3, 0)
If HStart > tt.Offset(1, 0) And Application.WorksheetFunction.Weekday(via, 2) = 6 Then HStart = tt.Offset(3, 0)
If HStart > tt.Offset(1, 0) And HStart < tt.Offset(2, 0) Then HStart = tt.Offset(2, 0)
If HStart > tt.Offset(3, 0) Then HStart = tt.offest(3, 0)
ElapD0 = tt.Offset(3, 0).Value - HStart
If HStart < tt.Offset(2, 0) Then ElapD0 = ElapD0 - Interv
If sab = 0 And Application.WorksheetFunction.Weekday(via, 2) = 6 Then ElapD0 = 0
If Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0

'Calcolo ore gg successivi
DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Not IsEmpty(Holid) Then
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
End If
GSet = Application.WorksheetFunction.Weekday(via + DDay, 2)
If GSet < 6 Then ElapTot = ElapTot + HGGstd
If GSet = 6 Then ElapTot = ElapTot + HSab
SkipF:
DDay = DDay + 1
If DDay > 1000 Then ElapTot = Durata
Wend
If GSet = 6 Then hPom = tt.Offset(1, 0) - tt Else hPom = tt.Offset(3, 0) - tt.Offset(2, 0)
Extra = Round(ElapTot * 1000000 - Durata * 1000000) / 1000000
If Extra > hPom Then Extra = ElapTot - Durata + Interv 'Else Extra = ElapTot - Durata
Termine = Int(via) + DDay - 1 + tt.Offset(3, 0) - Extra
If Application.WorksheetFunction.Weekday(via + DDay - 1, 2) = 6 Then Termine = Termine - (tt.Offset(3, 0) - tt.Offset(2, 0) + Interv)

End Function


L’ ho collaudata “abbastanza”, ma se riscontrate incongruenze per favore segnalatelo e ne faccio una revisione.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[excel] calcolo tempo lavoro":


Chi c’è in linea

Visitano il forum: alfrimpa e 4 ospiti