Ho guardato il tuo nuovo file, ma non conoscendo il processo tuo completo non sono in grado di capire quanto hai fatto.
Mi limito pertanto a riprendere quanto era stato detto prima, cioe' che l' obiettivo era quello di ricostruire i turni di lavoro partendo dalla tabella REPORT.
Per questo ho elaborato questa macro, che ricrea l' elenco delle timbrature, in ordine di Dipendente, Data e Orario.
- Codice: Seleziona tutto
Sub creatimbrat()
Dim DBSh As String, Stamp0 As String, YY As Long, XX As Long, Tipo As String
Dim LastDt As Long, LastB As Long, NewCL As Long, OutSh As String
DBSh = "REPORT" '<< Il foglio con il report di partenza
Stamp0 = "E5" '<< La prima cella con la data
Tipo = "D" '<< La colonna con Rilev /Totale
OutSh = "Foglio1" '<< Il foglio in cui sara' creato il report; deve gia' esistere
'
Sheets(DBSh).Select
LastB = Cells(Rows.Count, "B").End(xlUp).Row
LastDt = Range(Stamp0).End(xlToRight).Column
'
Sheets(OutSh).Range("A:G").ClearContents
Sheets(OutSh).Range("A1:G1").Value = Array("Nome", "Data", "Orario", "E/U", "SeqErr", "LenghtErr", "StartErr")
For YY = Range(Stamp0).Row + 1 To LastB
If Cells(YY, Tipo) = "Rilev." Then
For XX = Range(Stamp0).Column To LastDt
If Cells(YY, XX) <> "" Then
NewCL = Sheets(OutSh).Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets(OutSh).Cells(NewCL, 1) = Cells(YY, 2)
Sheets(OutSh).Cells(NewCL, 2) = DateValue(Cells(Range(Stamp0).Row, XX).Value)
Sheets(OutSh).Cells(NewCL, 3) = TimeValue(Left(Cells(YY, XX).Value, 5))
Sheets(OutSh).Cells(NewCL, 4) = Right(Cells(YY, XX).Value, 1)
Sheets(OutSh).Cells(NewCL, 5) = "=IF(AND(RC[-1]=R[-1]C[-1],RC[-4]=R[-1]C[-4]),1,0)"
Sheets(OutSh).Cells(NewCL, 6) = "=IF(AND(RC[-5]=R[-1]C[-5],RC[-6]=""u""),IF((RC[-4]+RC[-3]-R[-1]C[-4]-R[-1]C[-3])>TIMEVALUE(""15:00""),1,0),"""")"
Sheets(OutSh).Cells(NewCL, 7) = "=IF(RC[-6]<>R[-1]C[-6],IF(RC[-3]=""u"",1,0),"""")"
End If
Next XX
End If
Next YY
Sheets(OutSh).Select
LastB = Cells(Rows.Count, 1).End(xlUp).Row
Columns("A:G").Select
ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range("A2:A" & LastB _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveSheet.Sort.SortFields.Add Key:=Range("B2:B" & LastB _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveSheet.Sort.SortFields.Add Key:=Range("C2:C" & LastB _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveSheet.Sort
.SetRange Range("A1:G" & LastB)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'
Columns("E:G").EntireColumn.Select
Selection.Style = "Comma"
Selection.NumberFormat = "_-* #,##0_-;-* #,##0_-;_-* ""-""??_-;_-@_-"
Range("A1").Select
End Sub
Il risultato e' come da immagine:
Uploaded with
ImageShack.usLe colonne Data e Orario sono delle vere date e veri orari; in colonna D indico se si tratta di Entrato oppure Uscita.
In colonna E-F-G ho calcolato delle condizioni di errore:
-SeqError indica se E ed U non si susseguono alternandosi
-LenghtError indica se la durata complessiva, calcolata alla data/ora di uscita, e' superiore a 15 ore
-StartErr indica che per una certa persona le timbrature non cominciano con una E
Questi errori vanno gestiti a occhio e a mano, identificando il perche' del flag e correggendo i dati in colonna A:D (ma se la macro viene rieseguita le modifiche vengono tutte annullate, perche' vengono ripristinati i dati presenti sul foglio REPORT), oppure direttamente su foglio Report.
Ad esempio, guardando i dati di Andrea (che mostrano dei SeqErr), e' facile dedurre che il poveretto e' stato costretto a fare quasi per tutto il mese un doppio turno e nella confusione ha sbagliato spesso la timbratura dopo le prime otto ore (stranamente non e' andato peggiorando man mano che lavorava 16 ore al giorno per varie settimane...); per cui i suoi orari vanno modificati da
21:58e-5:57e-6:00u-14:00u a
21:58e-5:57U-6:00e-14:00uPartendo da queste timbrature non dovrebbe essere difficile ricreare il calendario di turni.
Pero' ti faccio notare che non hai risposto al mio invito a verificare che l' elenco delle timbrature, in formato di "elenco" (come quello ricreato), sia gia' esistente all' interno della tua organizzazione; e se ti dicono che non esiste chiedigli come hanno creato il foglio Report.
Ciao