Advanced DataDiff usando MSExcel

Ho un foglio di calcolo di Excel che elenca i turni di lavoro … quattro colonne che sono importnti per i nostri scopi:

  • Data d'inizio
  • Ora di inizio
  • Data di fine
  • Fine del tempo

Dato questi dati, devo estrarre il numero di ore per each turno che va dalle 7 alle 19 .

Alcune cose da tenere in mente …

  • Non esiste un limite teorico alla lunghezza di un turno. Potrebbe funzionare da 1 ora a 3 giorni.
  • Sono aperta a soluzioni in C #, VB, PHP, o addirittura una function avanzata di Excel … qualsiasi cosa per arrivare alla soluzione.
    • VBA , non tenendo molto conto dei minuti. Non so se hai bisogno di minuti.

      Dim i As Integer Dim ShiftRange As Range Dim dteStart As Date Dim dteEnd As Date Dim HourCount As Long Dim MinCount As Long Set ShiftRange = Sheet1.UsedRange For i = 2 To ShiftRange.Rows.Count HourCount = 0 dteStart = CDate(Cells(i, 1) + Cells(i, 2)) dteEnd = CDate(Cells(i, 3) + Cells(i, 4)) Do While dteStart <= dteEnd If Hour(dteStart) >= 7 And Format(dteStart, "hh:mm") <= #7:00:00 PM# Then HourCount = HourCount + 1 End If dteStart = DateAdd("h", 1, dteStart) Loop MinCount = HourCount * 60 ''Minutes If CDate(Cells(i, 2)) >= #7:00:00 AM# And CDate(Cells(i, 2)) <= #7:00:00 PM# Then MinCount = MinCount - Minute(CDate(Cells(i, 2))) End If If CDate(Cells(i, 4)) >= #7:00:00 AM# And CDate(Cells(i, 4)) <= #7:00:00 PM# Then MinCount = MinCount + Minute(CDate(Cells(i, 4))) End If Cells(i, 6) = MinCount Next 

      Ciò presuppone che A, B, C e D siano le colonne che contengono date e orari e che il colum F è vuoto.

      Grazie Remou Molto bello e funzionale.

      Ho fatto un cambiamento per consentire alcune ore

       Sub DayHours() Dim i As Integer Dim ShiftRange As Range Dim dteStart As Date Dim dteEnd As Date Dim MinCount As Double Set ShiftRange = Sheet1.UsedRange For i = 3 To ShiftRange.Rows.Count MinCount = 0 dteStart = CDate(Cells(i, 3) + Cells(i, 4)) dteEnd = CDate(Cells(i, 5) + Cells(i, 6)) Do While dteStart <= dteEnd If Format(dteStart, "hh:mm") >= #7:00:00 AM# And Format(dteStart, "hh:mm") < #7:00:00 PM# Then MinCount = MinCount + 1 End If dteStart = DateAdd("n", 1, dteStart) Loop Cells(i, 10) = MinCount / 60 Next End Sub