Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1264to1268
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prüfung Arbeitszeiten

Prüfung Arbeitszeiten
Daniel
Guten Morgen zusammen,
sicherlich kann mir hier jmd. einen kleinen Denksanstoß geben:
Nachfolgend beschriebenen Datensatz bekomme ich in einer Tabelle, aus dem ich mein Reporting erstelle:
Datum AZ von RZ von AZ bis RZ bis 10.04.2012 09:30 07:00 14:30 09:30 10.04.2012 14:30 17:30 11.04.2012 09:30 07:30 14:00 09:30 11.04.2012 14:00 16:00 12.04.2012 08:30 06:30 13:45 08:30 12.04.2012 13:45 15:45 13.04.2012 07:15 15:00 16.04.2012 11:30 07:00 17:00 11:30 17.04.2012 07:30 11:30 11:30 16:00 18.04.2012 07:15 16:00 19.04.2012 10:00 08:00 16:30 10:00 19.04.2012 16:30 18:30 20.04.2012 10:00 08:00 13:00 10:00 20.04.2012 13:00 15:00 23.04.2012 11:00 07:00 20:00 11:00 24.04.2012 08:30 18:00 25.04.2012 08:00 12:30 12:30 16:30 26.04.2012 09:00 07:00 13:30 09:00 26.04.2012 13:30 15:30 30.04.2012 07:15 15:45 AZ = Arbeitszeit, RZ = Reisezeit, wobei das in diesem Fall keine Rolle spielt.
Diesen möchte ich bevor ich diesen auswerte auf korrekt erfasste 'Druchgängigkeit' prüfen, d.h.
am Bsp. vom 10.04.2012

1. RZ von: 07:00 Uhr
2. RZ bis: 09:30 Uhr
3. AZ von: 09:30 Uhr
4. AZ bis: 14:30 Uhr
5. RZ von: 14:30 Uhr
6. RZ bis: 17:30 Uhr
in diesem Fall sind die Daten i.O., wenn aber als Bsp. die 3. Zeitangabe 09:30 Uhr wäre müsste ich diesen markiert bzw. gemeldet bekommen.
Vom Ansatz her müsste man in diesem Fall die 5. von der 4. von der 3. von der 2. Zeitangabe abziehen
und auf Null kommen.
Es können natürlich pro Tag auch nur 4 Zeitangaben oder mehr als 6 Zeitangaben vorliegen.
Bei zwei Zeitangaben ist keine Prüfung erforderlich.
Hoffe ich habe das verständlich rübergebracht...
Ich habe gerade echt eine 'Blockade' wie ich das automatisiert in VBA abwickeln soll.
Besten Dank im Voraus für eure Zeit und einen schönen Tag noch zusammen.
Grüße, Daniel

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Prüfung Arbeitszeiten
24.05.2012 10:16:43
Rolf
Hallo Daniel,
eine Idee hätte ich schon, aber eine Beispieldatei wäre hilfreich.
Gruß, Rolf
AW: Prüfung Arbeitszeiten
24.05.2012 10:33:46
Daniel
Hallo Rolf,
anbei die Daten in einer Datei, die ich so übermittelt bekomme.
https://www.herber.de/bbs/user/80277.xlsx
Besten Dank im Voraus.
Grüße, Daniel
AW: Prüfung Arbeitszeiten
24.05.2012 10:24:04
Matthias
Hallo
Du brauchst doch nur die Spalte(2) mit Spalte(5) vergleichen
und mit einer bedingter Formatierung auswerten.
Oder hab ich was falsch verstanden?
Tabelle1

 ABCDE
1DatumAZ vonRZ vonAZ bisRZ bis
210.04.201209:3007:0014:3009:30
310.04.201214:3017:30  
411.04.201209:3007:3014:0009:30
511.04.201214:0016:00  
612.04.201208:3006:3013:4508:30
712.04.201213:4515:45  
813.04.201207:1515:00  
916.04.201211:3007:0017:0011:30
1017.04.201207:3011:3011:3016:00
1118.04.201207:1516:00  
1219.04.201210:0008:0016:3010:00
1319.04.201216:3018:30  
1420.04.201210:0008:0013:0010:00
1520.04.201213:0015:00  
1623.04.201211:0007:0020:0011:00
1724.04.201208:3018:00  
1825.04.201208:0012:3012:3016:30
1926.04.201209:0007:0013:3009:00
2026.04.201213:3015:30  
2130.04.201207:1515:45  


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Gruß Matthias
Anzeige
Meine Daten sind in den falschen Spalten, Sorry!
24.05.2012 10:37:20
Matthias
Hallo
Hab gerade bemerkt das durch das Kopieren und Einfügen die Zeiten in den Spalten verrutscht sind. Sorry!
Aber die bed. Formatierung würde ich trotzdem benutzen.
Gruß Matthias
AW: Prüfung Arbeitszeiten
24.05.2012 10:39:04
Daniel
Hallo Matthias,
danke für deine Antwort.
Geht leider so nicht da für einen Tag mehrere Zeilen mit Zeitangaben vorkommen können.
Grüße, Daniel
AW: Prüfung Arbeitszeiten
24.05.2012 12:05:57
Rudi
Hallo,
ganz schön komplex.
Mein Weg:
Option Explicit
Sub CheckTimes()
Dim arr(), lRow As Long, lCol As Long, lCounter As Long, arrRead
ReDim arr(1 To Application.Count(Columns("C:F")), 1 To 3)
arrRead = Array(4, 6, 3, 5)
For lRow = 2 To Cells(Rows.Count, 1).End(xlUp).Row
For lCol = 0 To 3
If Cells(lRow, arrRead(lCol))  "" Then
lCounter = lCounter + 1
arr(lCounter, 1) = Cells(lRow, 1)
arr(lCounter, 2) = Cells(lRow, arrRead(lCol))
arr(lCounter, 3) = Cells(1, arrRead(lCol))
End If
Next
Next
prcSort Array(1, 2), arr
With Worksheets.Add
.Cells(1, 1) = "Datum"
.Cells(1, 2) = "Zeit"
.Cells(1, 3) = "Typ"
.Cells(2, 1).Resize(UBound(arr), 3) = arr
.Columns(2).NumberFormat = "hh:mm"
For lRow = 2 To UBound(arr) + 1
If Application.CountIf(.Columns(1), .Cells(lRow, 1)) Mod 2  0 Then
'ungerade Anzahl Buchungen
.Cells(lRow, 1).Interior.Color = RGB(255, 0, 0)
End If
If .Cells(lRow, 1) = .Cells(lRow - 1, 1) And .Cells(lRow, 1) = .Cells(lRow + 1, 1) Then
If .Cells(lRow, 2)  .Cells(lRow - 1, 2) And .Cells(lRow, 2)  .Cells(lRow + 1, 2)  _
Then
.Cells(lRow, 2).Interior.Color = RGB(255, 0, 0)
End If
End If
Next
End With
End Sub
Sub prcSort(vntSortKey As Variant, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long, lngRowsArray() As Long
Dim lngRowsCount As Long, lngRangeCount As Long
Dim vntTemp As Variant
ReDim lngRowsArray(0 To 1, 0 To UBound(vntArray) * 2)
Dim i As Integer
'Array für den 1. Sortierlauf
lngRowsArray(0, 0) = LBound(vntArray)
lngRowsArray(0, 1) = UBound(vntArray)
lngRowsCount = 1
For intIndex = LBound(vntSortKey) To UBound(vntSortKey)
'Wenn eine Spalte angegeben
If vntSortKey(intIndex)  0 Then
lngRangeCount = -1
'Schleife zum sortieren der einzelnen Bereiche
For lngIndex1 = 0 To lngRowsCount Step 2
'Sortieren des Bereichs, wenn Zeilenzahl größer 1
If lngRowsArray(0, lngIndex1)  lngRowsArray(0, lngIndex1 + 1) Then
Call prcQuickSort(CLng(lngRowsArray(0, lngIndex1)), _
CLng(lngRowsArray(0, lngIndex1 + 1)), CInt(Abs(vntSortKey(intIndex))),  _
_
CBool(vntSortKey(intIndex) > 0), vntArray())
'sortierten Bereich merken
lngRangeCount = lngRangeCount + 2
lngRowsArray(1, lngRangeCount - 1) = lngRowsArray(0, lngIndex1)
lngRowsArray(1, lngRangeCount) = lngRowsArray(0, lngIndex1 + 1)
End If
Next
lngRowsCount = -1
'Durchsuchen der soeben sortierten Spalte nach Wertewechsel
For lngIndex1 = 0 To lngRangeCount Step 2
'1. Zeile des zu sortierenden Bereichs
vntTemp = vntArray(lngRowsArray(1, lngIndex1), Abs(vntSortKey(intIndex)))
lngRowsCount = lngRowsCount + 1
lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1)
'Suche nach Wechsel innerhalb des Bereichs
For lngIndex2 = lngRowsArray(1, lngIndex1) To lngRowsArray(1, lngIndex1 + 1)
If vntTemp  vntArray(lngIndex2, Abs(vntSortKey(intIndex))) Then
lngRowsCount = lngRowsCount + 2
lngRowsArray(0, lngRowsCount - 1) = lngIndex2 - 1
lngRowsArray(0, lngRowsCount) = lngIndex2
vntTemp = vntArray(lngIndex2, Abs(vntSortKey(intIndex)))
End If
Next
'letzte Zeile des zu sortierenden Bereichs
lngRowsCount = lngRowsCount + 1
lngRowsArray(0, lngRowsCount) = lngRowsArray(1, lngIndex1 + 1)
Next
End If
Next
End Sub
Private Sub prcQuickSort(lngLbound As Long, lngUbound As Long, _
intSortColumn As Integer, bntSortKey As Boolean, vntArray() As Variant)
Dim intIndex As Integer
Dim lngIndex1 As Long, lngIndex2 As Long
Dim vntTemp As Variant, vntBuffer As Variant
lngIndex1 = lngLbound
lngIndex2 = lngUbound
vntBuffer = vntArray((lngLbound + lngUbound) \ 2, intSortColumn)
Do
If bntSortKey Then
Do While vntArray(lngIndex1, intSortColumn)  vntBuffer
lngIndex1 = lngIndex1 + 1
Loop
Do While vntBuffer > vntArray(lngIndex2, intSortColumn)
lngIndex2 = lngIndex2 - 1
Loop
End If
If lngIndex1  _
vntArray(lngIndex2, intSortColumn) Then
For intIndex = LBound(vntArray, 2) To UBound(vntArray, 2)
vntTemp = vntArray(lngIndex1, intIndex)
vntArray(lngIndex1, intIndex) = _
vntArray(lngIndex2, intIndex)
vntArray(lngIndex2, intIndex) = vntTemp
Next
End If
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
ElseIf lngIndex1 = lngIndex2 Then
lngIndex1 = lngIndex1 + 1
lngIndex2 = lngIndex2 - 1
End If
Loop Until lngIndex1 > lngIndex2
If lngLbound 

Gruß
Rudi
Anzeige
weniger Aufwand
24.05.2012 12:10:03
Rudi
Hallo,
man kann natürlich auch die Tabelle sortieren anstatt das Array.
Sub CheckTimes()
Dim arr(), lRow As Long, lCol As Long, lCounter As Long, arrRead
ReDim arr(1 To Application.Count(Columns("C:F")), 1 To 3)
arrRead = Array(4, 6, 3, 5)
For lRow = 2 To Cells(Rows.Count, 1).End(xlUp).Row
For lCol = 0 To 3
If Cells(lRow, arrRead(lCol))  "" Then
lCounter = lCounter + 1
arr(lCounter, 1) = Cells(lRow, 1)
arr(lCounter, 2) = Cells(lRow, arrRead(lCol))
arr(lCounter, 3) = Cells(1, arrRead(lCol))
End If
Next
Next
With Worksheets.Add
.Cells(1, 1) = "Datum"
.Cells(1, 2) = "Zeit"
.Cells(1, 3) = "Typ"
.Cells(2, 1).Resize(UBound(arr), 3) = arr
.Columns(2).NumberFormat = "hh:mm"
.Cells(1, 1).Sort _
key1:=.Cells(2, 1), order1:=xlAscending, _
key2:=.Cells(2, 2), order2:=xlAscending, _
Header:=xlYes
For lRow = 2 To UBound(arr) + 1
If Application.CountIf(.Columns(1), .Cells(lRow, 1)) Mod 2  0 Then
'ungerade Anzahl Buchungen
.Cells(lRow, 1).Interior.Color = RGB(255, 0, 0)
End If
If .Cells(lRow, 1) = .Cells(lRow - 1, 1) And .Cells(lRow, 1) = .Cells(lRow + 1, 1) Then
If .Cells(lRow, 2)  .Cells(lRow - 1, 2) And .Cells(lRow, 2)  .Cells(lRow + 1, 2)  _
Then
.Cells(lRow, 2).Interior.Color = RGB(255, 0, 0)
End If
End If
Next
End With
End Sub

Gruß
Rudi
Anzeige
AW: weniger Aufwand
30.05.2012 00:03:58
Daniel
Guten Abend Rainer,
aufgrund deiner Antwort auf meine heutigen bzw. nun gestrigen Beitrag folgende Klarstellung:
Ich habe deinen Code erst gestern abend verarbeiten können, leider war dieser Beitrag
schon im Archiv und ich konnte nicht mehr darauf antworten bzw. dir für deine Hilfe danken
was ich auch unbedingt machen wollte!!
Weshalb ich jetzt wieder darauf antworten kann ist mir schleierhaft...
Dein Code ist super, ich konnte diesen 1:1 für meine Anforderungen anwenden!
Vielen Dank!
Zu deiner Antwort in meinem heutigen/gestrigen Beitrag:
Die Funktion 'Duplikate entfernen' ist mir sehr wohl bekannt und ich kann auch damit umgehen,
wäre dies für mich ausreichend gewesen hätte ich sicherlich keinen Beitrag geschrieben.
Btw.: auf meinen gestrigen Beitrag kann ich auch nicht mehr antworten, warum auch immer.
Schönen Abend noch.
Grüße, Daniel
Anzeige
wieso Rainer? owT
30.05.2012 13:34:00
Rudi
AW: wieso Rainer? owT
30.05.2012 18:48:23
Daniel
Hallo Rudi,
sry., die Antwort galt natürlich dir!
Grüße, Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige