Option Explicit
Private Sub CommandButton1_Click()
Dim aDataIn, aDataOut
Dim dTimeStart As Date, dTimeEnd As Date
Dim blnFullHour As Boolean
Dim i&, j&, k&, n&, m&
On Error GoTo CommandButton1_Click_ErrorHandler
Application.ScreenUpdating = False
With ActiveSheet 'data to array
aDataIn = .Cells(46, 15).Resize(33, 124).Value
End With
'set size of output array
ReDim aDataOut(1 To 14, 1 To UBound(aDataIn, 2) + 6)
'set headings
For i = LBound(aDataIn, 2) To UBound(aDataIn, 2)
If IsDate(aDataIn(1, i)) Then
aDataOut(1, i + 6) = CDate(aDataIn(1, i))
aDataOut(1, i + 7) = Format(CDate(aDataIn(1, i)), "ddd")
End If
Next i
'set times
j = 100000
For i = LBound(aDataOut, 1) + 1 To UBound(aDataOut, 1)
aDataOut(i, 1) = TimeValue(Format(CStr(j), "#0:00:00"))
aDataOut(i, 2) = TimeValue(Format(CStr(j + 5959), "#0:00:00"))
j = j + 10000
Next i
'calculation
For i = LBound(aDataIn, 2) To UBound(aDataIn, 2)
If IsDate(aDataIn(1, i)) Then
j = i + 1: m = i + 7
For k = LBound(aDataIn, 1) + 1 To UBound(aDataIn, 1)
blnFullHour = False
If aDataIn(k, j) = 0 Then Exit For
dTimeStart = TimeValue(Format(CStr(aDataIn(k, j)), "#0:00"))
dTimeEnd = TimeValue(Format(CStr(aDataIn(k, j + 1)), "#0:00"))
If dTimeEnd <= dTimeStart Then aDataOut(1, m) = "#Error": Exit For
For n = LBound(aDataOut, 1) + 1 To UBound(aDataOut, 1)
If DateDiff("n", aDataOut(n, 1), dTimeStart) >= 0 And DateDiff("n", aDataOut(n, 2), dTimeStart) < 0 _
And DateDiff("n", aDataOut(n, 1), dTimeEnd) > 0 And DateDiff("n", aDataOut(n, 2) + TimeSerial(0, 0, 1), dTimeEnd) <= 0 Then
aDataOut(n, m) = aDataOut(n, m) + DateDiff("n", dTimeStart, dTimeEnd)
Exit For
ElseIf DateDiff("n", aDataOut(n, 1), dTimeStart) >= 0 And DateDiff("n", aDataOut(n, 2), dTimeStart) < 0 Then
blnFullHour = True
aDataOut(n, m) = aDataOut(n, m) + DateDiff("n", dTimeStart, aDataOut(n, 2) + TimeSerial(0, 0, 1))
ElseIf DateDiff("n", aDataOut(n, 1), dTimeEnd) > 0 And DateDiff("n", aDataOut(n, 2) + TimeSerial(0, 0, 1), dTimeEnd) <= 0 Then
aDataOut(n, m) = aDataOut(n, m) + DateDiff("n", aDataOut(n, 1) + TimeSerial(0, 0, 1), dTimeEnd)
Exit For
ElseIf blnFullHour Then
aDataOut(n, m) = aDataOut(n, m) + 60
End If
aDataOut(n, m + 2) = "=IF(RC[-2]*0.125=0,"""",RC[-2]*0.125)"
Next n
aDataOut(n, m + 2) = "=IF(RC[-2]*0.125=0,"""",RC[-2]*0.125)"
Next k
End If
Next i
'write to sheet
With ActiveSheet
With .Cells(608, 9).Resize(UBound(aDataOut, 1), UBound(aDataOut, 2))
.Formula = aDataOut
.Rows(1).NumberFormat = "dd.mm.yyyy"
.Columns("A:B").NumberFormat = "hh:mm:ss"
.Cells.EntireColumn.AutoFit
End With
End With
CommandButton1_Click_Proc_Exit:
Application.ScreenUpdating = True
Exit Sub
CommandButton1_Click_ErrorHandler:
MsgBox "Error: " & Err.Number & " (" & Err.Description & ") in Sub 'CommandButton1_Click' of VBA Document 'Sheet1' in line " & Erl & ".", vbOKOnly + vbCritical, "Error"
Resume CommandButton1_Click_Proc_Exit
End Sub
Function WsExists(ByVal wsName As String, Optional xlWb As Excel.Workbook) As Boolean
On Error Resume Next
Dim xlWs As Worksheet
If xlWb Is Nothing Then Set xlWb = ActiveWorkbook
Set xlWs = xlWb.Worksheets(wsName)
WsExists = (Err.Number = 0)
Set xlWs = Nothing
End Function
Bookmarks