Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Excel - Data/Ora di completamento attivita'

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 - Data/Ora di completamento attivita'

Postdi civas » 12/03/13 10:49

Buongiorno a tutti,
uso Excel 2010 e vorrei per lavoro gestire una parte di programmazione della produzione con Excel. In particolare volevo sapere se c'è un modo per fare quanto segue:
-so che per fare un lavoro mi ci vogliono 23 ore di produzione
-lavoro su due turni, dalle 6 alle 14 e dalle 14 alle 22.
-Data di inizio lavoro 12/03/2013 10:00
Come faccio ad arrivare alla data e ora di fine lavoro prevista, escludendo le ore del terzo turno?
E sapendo che lavoro anche il sabato mattina, che possibilità ho di gestire anche questa parte.
Per favore considerate che non sono molto esperto in programmazione.
Grazie
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Sponsor
 

Re: Excel - Programmazione produzione

Postdi Anthony47 » 12/03/13 15:04

Ciao civas, benvenuto nel forum.
Per fare un calcolo e' necessario conoscere esattamente quale e' l' orario di lavoro settimanale che va preso in considerazione, che non mi e' totalmente chiaro nella formulazione del quesito.

Ciao, ti aspettiamo con questo chiarimento.
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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Programmazione produzione

Postdi civas » 12/03/13 17:59

L'orario di lavoro sono 16 ore al giorno da lunedí a venerdí (primo turno di 8 ore dalle 6:00 alle 14:00 e secondo turno di 8 ore dalle 14:00 alle 22:00). Sabato lavora solo un turno dalle 6:00 alle 14:00
Domenica e Festivi le macchine rimangono ferme.

L' excel usato é 2007 e non 2010 come erroneamente scritto prima.
Una volta che mi passate la spiegazione mi divertiró a trovare le funzioni in brasiliano. Sí ce la posso fare :)

Grazie
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 13/03/13 01:31

Molto tempo fa avevo elaborato una "funzione" per questi calcoli, che corrisponde al seguente codice:
Codice: Seleziona tutto
Function Termine(ByVal Durata As Double, ByVal via As Double, ByRef tt As Range, Optional SabY = 0, Optional ByRef Holid As Range) 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
'  Il secondo turno NON si considera lavorato di sabato

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
'Dura = Range("A1").Value
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 = Range("A2") - Int(Range("A2"))
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 Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0

DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
'    If IsError(Application.WorksheetFunction.Lookup(Int(via) + DDay, Holid)) Then GoTo SkipF
    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
E' gia' tradotto in brasilero :D
Uso:
-da Excel, Alt-F11 per aprire l' editor delle macro
-Menu /Inserisci /Modulo
-Copia il codice e incollalo nel frame vuoto di dx
Torna su excel, e in un' area libera segna in verticale in 4 celle contigue gli orari di lavoro, nel formato Ingresso/Uscita, Ingresso/Uscita (nel tuo caso quindi sara' 6:00/14:00, 14:00/22); il secondo turno NON si considera lavorativo nei sabato. Io ho usato L2:L5.
In un' altra area libera segna il calendario dei giorni festivi (data completa, es 15/08/2013, non basta il solo 15/08; quindi il calendario dei giorni festivi del 2013 va riscritto per il 2014); io ho usato M2:M20.

A questo punto userai una formula tipo
Codice: Seleziona tutto
=Termine(OreDiDurata;DataOraAvvio;PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
SabatoSi/SabatoNo corrisponde ai valori 1/0.
Quindi se la data/ora di inizio fosse in A2, le ore di durata in B2, e vuoi considerare il sabato lavorato (solo primo gruppo di timbrature) la formula sarebbe
Codice: Seleziona tutto
=Termine(B2;A2;L2;1;M2:M20)

La cella va formattata come Data & Ora

Prova e fai sapere, ciao.


Edit 19-3-2013
Ho corretto la formula "tipo" (OreDiDurata /DataOraAvvio erano erroneamente invertite nella parentesi), mentre quella dell' esempio era invece corretta
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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 13/03/13 13:11

Anthony47 ha scritto:Molto tempo fa avevo elaborato una "funzione" per questi calcoli, che corrisponde al seguente codice:
Codice: Seleziona tutto
Function Termine(ByVal Durata As Double, ByVal via As Double, ByRef tt As Range, Optional SabY = 0, Optional ByRef Holid As Range) 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
'  Il secondo turno NON si considera lavorato di sabato

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
'Dura = Range("A1").Value
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 = Range("A2") - Int(Range("A2"))
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 Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0

DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
'    If IsError(Application.WorksheetFunction.Lookup(Int(via) + DDay, Holid)) Then GoTo SkipF
    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
E' gia' tradotto in brasilero :D
Uso:
-da Excel, Alt-F11 per aprire l' editor delle macro
-Menu /Inserisci /Modulo
-Copia il codice e incollalo nel frame vuoto di dx
Torna su excel, e in un' area libera segna in verticale in 4 celle contigue gli orari di lavoro, nel formato Ingresso/Uscita, Ingresso/Uscita (nel tuo caso quindi sara' 6:00/14:00, 14:00/22); il secondo turno NON si considera lavorativo nei sabato. Io ho usato L2:L5.
In un' altra area libera segna il calendario dei giorni festivi (data completa, es 15/08/2013, non basta il solo 15/08; quindi il calendario dei giorni festivi del 2013 va riscritto per il 2014); io ho usato M2:M20.

A questo punto userai una formula tipo
Codice: Seleziona tutto
=Termina(OreDiDurata;DataOraAvvio;PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
SabatoSi/SabatoNo corrisponde ai valori 1/0.
Quindi se la data/ora di inizio fosse in A2, le ore di durata in B2, e vuoi considerare il sabato lavorato (solo primo gruppo di timbrature) la formula sarebbe
Codice: Seleziona tutto
=Termine(B2;A2;L2;0;M2:M20)

La cella va formattata come Data & Ora

Prova e fai sapere, ciao.

Ci provo e tifaccio sapere. PEr ora grazie mille
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 13/03/13 15:21

Mi sono accorto che ho sbagliato la formula; se vuoi includere il sabato, allora SabatoSi/SabatoNo deve essere a 1, quindi
Codice: Seleziona tutto
=Termine(B2;A2;L2;1;M2:M20)

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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 13/03/13 18:47

Anthony47 ha scritto:Mi sono accorto che ho sbagliato la formula; se vuoi includere il sabato, allora SabatoSi/SabatoNo deve essere a 1, quindi
Codice: Seleziona tutto
=Termine(B2;A2;L2;1;M2:M20)

Ciao


Grazie mille. Mi sembra che funzioni ma ora ho un altro problema.
Il calcolo delle ore di produzione, é dato dal seguente calcolo fatto nella cella E2=B2/(3600/D2)
In B2 ho il nr di pezzi da produrre (1000)
In D2 ho i secondi necessari per produrre il pezzo (40)
3600 era per ottenere il numero di cicli di produzione in un ora.
Se formatto la cella D2 e E2 in [hh]:mm:ss il risultato che ottengo é 00:00:11 mentre il risultato dovrebbe essere 11:06:36
Se riesci ad aiutarmi anche in questo....sarebbe perfetto
Grazie
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 13/03/13 20:49

Correggo non funziona, ma sicuramente ho sbagliato qualcosa.
In G ho collocato la Formula TERMINE(E2;F2;$K$2;1)
In F3 ho collocato =G2 perché riprendo come inizio la fine della produzione precedente.
In K ho inserito i 4 orari in verticale.
La cosa strana é che se modifico la data d'inizio, la data in G2 non cambia.
Non ho ancora fatto la parte dei festivi dato che devo informarmi sulle festivitá brasiliane fatte dall'azienda.

Codice: Seleziona tutto
A            B         D           E         F           G                       K
              Q.de    Ciclo Padrão Tempo Prod em horas   Inicio   Fim Produção
MA045-006       1000   00:00:40   11:06:40   25/2/13 6:00   25/2/13 17:06      6:00
MA045-028       800    00:00:40   08:53:20   25/2/13 17:06   #VALOR!           14:00
MA045-029       500    00:00:40   05:33:20   #VALOR!           #VALOR!         14:00
MA040-215       2640   00:00:41   30:04:00   #VALOR!           #VALOR!         22:00
SS001-006       620    00:00:41   07:03:40   #VALOR!           #VALOR!


Grazie ancora
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 13/03/13 23:47

La formula si aspetta di avere un intervallo in cui sono elencate le festivita'; se non le conosci ancora gli darai un elenco vuoto, ma un elenco glielo devi dare.
Quindi non TERMINE(E2;F2;$K$2;1) ma ad esempio TERMINE(E2;F2;$K$2;1;$M$2:$M$20) anche se M2:M20 sono ancora vuoti.

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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 14/03/13 15:30

Il problema non sembra essere la parte festivitá (anzi, dopo che ho collocato quanto mi hai detto sballa ancora di piú). Il problema credo sia che non riconosce la notte non lavorata, e quindi se l'orario di scadenza passa le ore 22, non salta il turno notturno per andare al primo turno del giorno dopo, ma da errore.
Ecco cosa succede aggiungendo le festivitá come da tua richiesta

Q.de Nr pç UM Ciclo Padrão Tempo Produção em horas Inizio Fim Produção
1000 1 00:00:40 11:06:40 25/2/13 6:00 #NOME?
GRazie
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 14/03/13 17:05

#NOME? È dovuto a funzioni o intervalli inesistenti; che formula hai scritto? Tieni presente che ho collaudato quanto scrivo, anche sui dati di ieri dove avevi #valore.
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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 14/03/13 18:31

Ho collocato esattamente quanto hai aggiunto tu considerando le celle M2:M20 anche se vuote. Né piú ne meno.
Ieri, collocava #VALORE, quando data e ora inizio + ore di lavoro erano = o maggiori delle ore 22. Sará che hai computer brasiliani non piace la tua formula??? :) Scherzo. Io non sarei riuscito ad arrivare nemmeno a impostare la funzione che tu hai creato. Se riesci a capire cosa non va ottimo.
Grazie
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 14/03/13 19:25

civas ha scritto:Ho collocato esattamente quanto hai aggiunto tu considerando le celle M2:M20 anche se vuote. Né piú ne meno.
Ieri, collocava #VALORE, quando data e ora inizio + ore di lavoro erano = o maggiori delle ore 22. Sará che hai computer brasiliani non piace la tua formula??? :) Scherzo. Io non sarei riuscito ad arrivare nemmeno a impostare la funzione che tu hai creato. Se riesci a capire cosa non va ottimo.
Grazie

RISOLTOOOOO GRAZIE
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 18/03/13 12:27

Antony, guarda cosa succede considerando nella tua funzion 1 (sabati inclusi) e quando inizio e fine sono di sabato

Ore necessarie Inizio Fine
84:22:30 18/3/13 6:00 23/3/13 10:22
04:52:39 23/3/13 10:22 23/3/13 7:15

GRazie

civas
Newbie

Post: 8
Iscritto il: 11/03/13 13:36
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 19/03/13 01:48

Eh, quanto e' dura testare tutte le situazioni...
Effettivamente c' era un problema nella gestione del Sabato Si/No, forse adesso e' meglio; allego l' intero codice, penultima versione:
Codice: Seleziona tutto
Function Termine(ByVal Durata As Double, ByVal via As Double, ByRef tt As Range, ByVal SabY As Integer, ByRef Holid As Range) As Double
'V 2.1 B30318
'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 mattutino  (parametro tt)
'  orario di fine mattutino
'  orario inizio pom
'  orario di fine pom
'  Il secondo turno NON si considera lavorato di sabato
'
'Esempio di Uso:
'   =Termine(OreDurataTask;DataOraDiInizio;RifAlPrimoOrario;1/0 SecondoSabSi/SabNo;RangeFestivita')
'
Dim HGGstd As Double, HSab As Double, ElapTot As Double, ElapD0 As Double
Dim Interv As Double, HStart As Double, hPom As Double
Dim DDay As Integer, GSet As Integer, Extra As Double
'
If SabY <> 0 Then SabY = 1
'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
If Application.WorksheetFunction.Weekday(via, 2) = 6 And SabY = 0 Then via = via + 1
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)
If Application.WorksheetFunction.Weekday(via, 2) < 6 Then
    ElapD0 = tt.Offset(3, 0).Value - HStart
Else
    ElapD0 = tt.Offset(1, 0).Value - HStart
End If
If HStart < tt.Offset(2, 0) Then ElapD0 = ElapD0 - Interv
If Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0
'
DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
    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
Ho preferito impostare come obbligatorio il parametro SabatoSi/SabatoNo, come pure l' intervallo delle festivita' (anche tutto vuoto, anche solo di una cella, ma deve esserci)
Leggendo inoltre i miei post precedenti mi sono anche reso conto che avevo sbagliato la sintassi della formula con cui "Termine" doveva essere usato:
NON =Termine(DataOraAvvio; OreDiDurata;PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
MA
=Termine(OreDiDurata; DataOraAvvio; PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
In effetti tu poi l' avevi usata nella sintassi giusta, comunque l' ho corretta anche nel post originale.

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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 19/03/13 12:37

Grazie di nuovo, avevo notato l'errore, ma l'avevi impostato nel modo corretto nell'esempio e quindi l'ho reputato un semplice errore di sintassi e non te l'ho segnalato.
Adesso correggo e ti faccio sapere di nuovo.
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 19/03/13 12:43

Anthony47 ha scritto:Eh, quanto e' dura testare tutte le situazioni...
Effettivamente c' era un problema nella gestione del Sabato Si/No, forse adesso e' meglio; allego l' intero codice, penultima versione:
Codice: Seleziona tutto
Function Termine(ByVal Durata As Double, ByVal via As Double, ByRef tt As Range,
ByVal SabY As Integer, ByRef Holid As Range) As Double
'V 2.1 B30318
'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 mattutino  (parametro tt)
'  orario di fine mattutino
'  orario inizio pom
'  orario di fine pom
'  Il secondo turno NON si considera lavorato di sabato
'
Mi dice che la formula contiene testo non riconosciuto.... ma l'unica cosa che ho fatto é modificare come da te indicato....spero :)

'Esempio di Uso:
'   =Termine(OreDurataTask;DataOraDiInizio;RifAlPrimoOrario;1/0 SecondoSabSi/SabNo;RangeFestivita')
'
Dim HGGstd As Double, HSab As Double, ElapTot As Double, ElapD0 As Double
Dim Interv As Double, HStart As Double, hPom As Double
Dim DDay As Integer, GSet As Integer, Extra As Double
'
If SabY <> 0 Then SabY = 1
'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
If Application.WorksheetFunction.Weekday(via, 2) = 6 And SabY = 0 Then via = via + 1
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)
If Application.WorksheetFunction.Weekday(via, 2) < 6 Then
    ElapD0 = tt.Offset(3, 0).Value - HStart
Else
    ElapD0 = tt.Offset(1, 0).Value - HStart
End If
If HStart < tt.Offset(2, 0) Then ElapD0 = ElapD0 - Interv
If Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0
'
DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
    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
Ho preferito impostare come obbligatorio il parametro SabatoSi/SabatoNo, come pure l' intervallo delle festivita' (anche tutto vuoto, anche solo di una cella, ma deve esserci)
Leggendo inoltre i miei post precedenti mi sono anche reso conto che avevo sbagliato la sintassi della formula con cui "Termina" doveva essere usato:
NON =Termina(DataOraAvvio; OreDiDurata;PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
MA
=Termina(OreDiDurata; DataOraAvvio; PrimaCellaOrarioLavorativo;SabatoSi/SabatoNo;AreaFestivi)
In effetti tu poi l' avevi usata nella sintassi giusta, comunque l' ho corretta anche nel post originale.

Ciao
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 19/03/13 13:22

Non funziona piú. Mi dice che la formula contiene testo non riconosciuto..... ????
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Re: Excel - Data/Ora di completamento attivita'

Postdi Anthony47 » 19/03/13 23:20

Ah ah ah, non ne usciremo vivi...
1) perche' piu' scrivo e piu' sbaglio a scrivere: la funzione si chiama (e si scrive) "termine" non "termina"; quindi dovro' correggere la correzione :oops:
2) perche' ogni volta succede una cosa nuova
3) perche' la funzione non era stata pensata per convivere con la massima liberta' di compilazione, e infatti e' venuto fuori un ulteriore problema legato all' ipotesi che il giorno di inizio sia un festivo.

Per il punto 1) vado a correggere il post di ieri sera...
Per il punto 3), allego il codice della nuova (sempre "penultima") versione.
Per il punto 2, se si presenta anche col codice che allego:
-fai uno screenshot da cui risulti visibile il contenuto della barra della formula e il messaggio di errore e pubblicalo nel prossimo messaggio; per come fare guarda qui: viewtopic.php?f=26&t=80395#p466013
Il codice:
Codice: Seleziona tutto
Function Termine(ByVal Durata As Double, ByVal via As Double, ByRef tt As Range, ByVal SabY As Integer, ByRef Holid As Range) As Double
'V 2.2 B30319
'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 mattutino  (parametro tt)
'  orario di fine mattutino
'  orario inizio pom
'  orario di fine pom
'  Il secondo turno NON si considera lavorato di sabato
'
'Esempio di Uso:
'   =Termine(OreDurataTask;DataOraDiInizio;RifAlPrimoOrario;1/0 SecondoSabSi/SabNo;RangeFestivita')
'
Dim HGGstd As Double, HSab As Double, ElapTot As Double, ElapD0 As Double
Dim Interv As Double, HStart As Double, hPom As Double
Dim DDay As Integer, GSet As Integer, Extra As Double
'
If SabY <> 0 Then SabY = 1
'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
reWD:
If (Application.WorksheetFunction.Weekday(via, 2) = 6 And SabY = 0) Then via = via + 1

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)
reHol:
If Application.WorksheetFunction.CountIf(Holid, Int(via)) > 0 Then
    via = via + 1
    HStart = tt.Value
    myHol = True
End If
If myHol = True Then myHol = False: GoTo reHol
If Application.WorksheetFunction.Weekday(via, 2) < 6 Then
    ElapD0 = tt.Offset(3, 0).Value - HStart
Else
    ElapD0 = tt.Offset(1, 0).Value - HStart
End If
If HStart < tt.Offset(2, 0) Then ElapD0 = ElapD0 - Interv
If Application.WorksheetFunction.Weekday(via, 2) = 7 Then ElapTot = 0 Else ElapTot = ElapD0
'
DDay = 1
While Round(ElapTot * 1000000) < Round(Durata * 1000000)
If Application.WorksheetFunction.CountIf(Holid, Int(via) + DDay) > 0 Then GoTo SkipF
    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

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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Data/Ora di completamento attivita'

Postdi civas » 20/03/13 12:45

Ho risolto tutto, spero. La funzione l'avevo giá lasciata come Termine, non avevo letto quello che mi avevi scritto. Il problema era molto piú banale. Nel codice che mi avevi passato, nella prima riga andava a capo. Mi sono limitato a portare il testo sulla stessa riga e il problema é stato risolto. Grazie di nuovo per l'ennesima risposta. Adesso vediamo se sti brasiliani sono contenti del risultato o se devo trovarmi un altro lavoro... Ahi Ahi...
civas
Utente Junior
 
Post: 13
Iscritto il: 11/03/13 14:36

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Excel - Data/Ora di completamento attivita'":


Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti