Mi pare che sei sempre alla ricerca di una soluzione per gestire orari di lavoro di una popolazione probabilmente indisciplinata…
Secondo me il problema non e’ risolvibile in modalita’ automatica, anche per l’ impatto economico e di assunzione di responsabilita’ che sono dietro a una cartolina presenze.
Detto cio’, rispondo alla tua domanda.
Potresti ottenere quello che chiedi con il seguente metodo:
-scrivi da Z5 ad AD5 i valori 0 – 10,5 – 13,5 – 15,5 – 24 (sono soglie di min e max per le colonne sottostanti)
-metti in AA7 la formula
- Codice: Seleziona tutto
=$W7*(($W7>=Z$5)*($W7<AA$5))+$X7*(($X7>=Z$5)*($X7<AA$5))+$Y7*(($Y7>=Z$5)*($Y7<AA$5))+$Z7*(($Z7>=Z$5)*($Z7<AA$5))
che poi copi nelle altre 3 colonne e nelle righe che ti servono.
Il difetto di questo ragionamento e’ che se ci sono piu’ timbrature appartenenti alla stessa fascia oraria, esse sono indecifrabili e non se ne potra' mai decidere con cognizione il significato; la formula non esamina questi conflitti.
Come ulteriore ipotesi, potresti usare la seguente macro o meglio, funzione:
- Codice: Seleziona tutto
Dim matror(4) As Single
Dim indice, IO, DeltaI As Integer
Option Explicit
Function Guess(Orari, Posiz) As Single
Dim MaxInMatt, MaxOutMatt, MaxInPom, WW1, WIO1 As Single
Dim I, IErr, Compilati, Flag As Integer
Dim matrerr(4) As Single
MaxInMatt = 10.49999
MaxOutMatt = 13.4999
MaxInPom = 15.4999
For I = 1 To 4
matror(I) = 0
matrerr(I) = 0
Next I
Compilati = Application.WorksheetFunction.Subtotal(2, Orari)
If Compilati = 4 Then GoTo Stand:
For I = 1 To Compilati
WW1 = Application.WorksheetFunction.Large(Orari, I)
Select Case WW1
Case 1 To MaxInMatt
IO = 4
Case MaxInMatt + 0.0001 To MaxOutMatt
IO = 3
Case MaxOutMatt + 0.0001 To MaxInPom
IO = 2
Case MaxInPom + 0.0001 To 24
IO = 1
End Select
WIO1 = matror(IO)
If matror(IO) > 0 Then
matrerr(IO) = matror(IO)
End If
matror(IO) = WW1
Next I
For I = 1 To 3
If matrerr(I) = 0 Then GoTo Skip
If matror(I + 1) = 0 Then
If matrerr(I) > matror(I) Then
matror(I + 1) = matror(I)
matror(I) = matrerr(I)
Else
matror(I + 1) = matrerr(I)
End If
Flag = 1
End If
If Flag = 1 Then GoTo Skip
If matror(I - 1) = 0 Then
If matrerr(I) < matror(I) Then
matror(I - 1) = matror(I)
matror(I) = matrerr(I)
Else
matror(I - 1) = matrerr(I)
End If
End If
Skip:
Next I
Guess = matror(Posiz)
Exit Function
'esegui se 4 celle piene
Stand:
Guess = Application.WorksheetFunction.Large(Orari, Posiz)
End Function
E’ alquanto poco lineare, ma non ho trovato tempo per semplificazioni/ottimizzazioni.
La copi min un Modulo e poi usi in AA7 la formula:
=guess($W7:$Z7;4)
che poi copi nelle altre 3 celle orizzontali, cambiando ogni volta l’ indice 4 in 3, 2, 1; poi copi le formule sulle righe che ti servono.
Questa funzione, se sono presenti 4 timbrature le mette in ordine crescente sulle celle AA-AD; se invece ce ne sono meno, le alloca secondo le soglie impostate, e se ci sono doppie timbrature nella stessa fascia fa una “sua ipotesi”.
Mi permetto pero’ di ricordare un suggerimento che avevo dato in un post del 30/07/06 ore 12:42 a proposito del tuo topic con Oggetto: [Excel] Orario lavoro effettivo dipendenti:
Io suggerirei un foglio piu’ complesso, che presenta le 4 colonne delle timbrature (A-D) piu’ 4 colonne per le correzioni manuali (E-H), piu’ 4 celle che definiscono i valori di default; da queste colonne calcolerei la presenza etc etc.
Ciao,