Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1668to1672
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

Zählen wenn, Zeitabhängigkeit

Zählen wenn, Zeitabhängigkeit
28.01.2019 08:51:28
Frank
Hallo liebe Excel Gemeinde,
ich habe keine Idee, wie ich das folgende Problem in VBA realisieren kann und hoffe auf ein paar gute Ideen.
Vielen Dank.
In Spalte A stehen Datumsangaben
In Spalte B stehen Uhrzeiten
in Spalte D stehen Ziffern zwischen 1 und 100000
Nun das Problem:
Der Code soll die Spalte D von der ersten bis zur letzten Zeile durchlaufen und Zählen wenn eine Ziffer "X" erfasst wird - doppelte Werte innerhalb von 20 min werden nicht mitgezählt. Wird die Ziffer "X" größer 20min erneut erfasst, wird wieder +1 gezählt.
Sehr gut wäre es, wenn der Tageswechsel mit berücksichtigt wird.
Bezogen auf dem Screenshot müsste der Zähler bei Zeile 23 bei 9 stehen.
Userbild
Bei Bedarf kann ich auch die Datei hochladen.
Vielen Dank.

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zählen wenn, Zeitabhängigkeit
28.01.2019 13:52:53
Daniel

Bei Bedarf kann ich auch die Datei hochladen.
Gute Idee!
AW: Zählen wenn, Zeitabhängigkeit
28.01.2019 16:41:24
Daniel
Hi Frank,
das ist für mich eine echt harte Nuss, ich weiß dass der Code wahrscheinlich noch nicht so funktioniert wie gewünscht:
Sub Frank()
Dim cell, cell1 As Range, myRange, myRange1 As Range
Dim Counter As Long, i, j As Long
Set myRange = Range(Cells(1, 1), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
'Spalte A / Datum
Set myRange1 = Range(Cells(1, 4), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 4))
'Spalte D / Zählspalte
'Datum und Zeit zusammenfügen und als Zahl ausgeben
For Each cell In myRange
Cells(cell.Row, 3) = CDbl(Cells(cell.Row, 1) + Cells(cell.Row, 2))
Next cell
'Zahlen in Spalte D zählen
For Each cell1 In myRange1
If cell1.Row > 1 Then
For i = cell1.Row - 1 To 1 Step -1 'Gehe alle früheren Werte durch, bis Ende oder Zä _
hlung
If cell1 = cell1.Offset(-cell1.Row + i, 0) Then 'Bei gleichen aufeinanderfolgenden  _
Werten
If (cell1.Offset(0, -1) - cell1.Offset(-cell1.Row + i, -1)) > 0.014 Then
'0,014 entspricht etwa 20 Minuten
Counter = Counter + 1
'Nur zählen, wenn ein gleicher Wert vor mehr als 20 Min vorhanden ist
Exit For
End If
Else
j = i
'Wenn die Werte ungleich sind, prüfe ob in den letzten 20 Minuten der gleiche  _
Wert vorkam
Do While (cell1.Offset(0, -1) - cell1.Offset(-cell1.Row + j, -1))  1
If cell1 = cell1.Offset(-cell1.Row + j, 0) Then GoTo Weiter
j = j - 1
Loop
Counter = Counter + 1 'Ansonsten Zählung
Exit For
End If
Weiter:
Next i
Else
Counter = Counter + 1 'Erste Zeile wird immer gezählt
End If
Next cell1
MsgBox "Zähler steht bei " & Counter
Set myRange = Nothing
Set myRange1 = Nothing
End Sub
Ich kann schwer prüfen, ob er so zählt wie er soll. Ich vermute aber, dass er bei gleichen aufeinanderfolgenden Werten falsch verfährt. Er schaut dann nämlich, ob irgendwo in der Spalte darüber der gleiche Wert steht mit mehr als 20 Minuten dazwischen. An sich nicht verkehrt, er ignoriert aber eventuelle spätere gleiche Werte und ich vermute, dass nur zwischen dem letzten gleichen Wert mindestens 20 Minuten vergangen sein müssen?
Vielleicht nutzt einer der Experten ja dies als Anstoß, noch weiter zu optimieren?
Grüße
Daniel
Anzeige
AW: Zählen wenn, Zeitabhängigkeit
29.01.2019 08:31:14
Frank
Hallo Daniel,
vorab vielen Dank, dass du dich mit dem Thema auseinandergesetzt hast. Das war schon clever, die Datums - und Zeitspalte jeweils in einer Zelle darzustellen, um den Tageswechsel zu berücksichtigen.
Ich lade nochmals eine Datei hoch, in der in der Spalte K die "Zählerstände" anzeigt werden. Wenn ich mich jetzt nicht verzählt haben sollte, müsste der Zähler beim durchlaufen des Codes bei 49 stehen.
Zu deiner Vermutung:
Angenommen es stehen in Spalte D, drei 7 untereinander dann wäre gut, wenn er die letzte als zeitlichen Bezugspunkt nimmt. Wenn es programmiertechnisch einfacher ist die Erste zu nehmen, dann soll es so sein - ist nicht entscheidend.
Müsste er nicht theoretisch die Abfrage bei jeder Zeile durchführen?
https://www.herber.de/bbs/user/127240.xlsm
Gruß Frank
Anzeige
AW: Zählen wenn, Zeitabhängigkeit
29.01.2019 08:45:42
Daniel
Wenn nur der letzte Wert als Vergleich genommen werden soll, macht das das Ganze tatsächlich wesentlich einfacher. Mit dieser kleinen Änderung klappt es jetzt bei deinem neuen Beispiel:
Sub Frank()
Dim cell, cell1 As Range, myRange, myRange1 As Range
Dim Counter As Long, i, j As Long
Set myRange = Range(Cells(1, 1), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
'Spalte A / Datum
Set myRange1 = Range(Cells(1, 4), Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 4))
'Spalte D / Zählspalte
'Datum und Zeit zusammenfügen und als Zahl ausgeben
For Each cell In myRange
Cells(cell.Row, 3) = CDbl(Cells(cell.Row, 1) + Cells(cell.Row, 2))
Next cell
'Zahlen in Spalte D zählen
For Each cell1 In myRange1
If cell1.Row > 1 Then
For i = cell1.Row - 1 To 1 Step -1 'Gehe alle früheren Werte durch, bis Ende oder Zä _
hlung
If cell1 = cell1.Offset(-cell1.Row + i, 0) Then 'Bei gleichen aufeinanderfolgenden  _
Werten
If (cell1.Offset(0, -1) - cell1.Offset(-cell1.Row + i, -1)) > 0.014 Then
'0,014 entspricht etwa 20 Minuten
Counter = Counter + 1
cell1.Offset(0, 2) = Counter
'Nur zählen, wenn ein gleicher Wert vor mehr als 20 Min vorhanden ist
Exit For
Else
Exit For
End If
Else
j = i
'Wenn die Werte ungleich sind, prüfe ob in den letzten 20 Minuten der gleiche  _
Wert vorkam
Do While (cell1.Offset(0, -1) - cell1.Offset(-cell1.Row + j, -1))  1
If cell1 = cell1.Offset(-cell1.Row + j, 0) Then GoTo Weiter
j = j - 1
Loop
Counter = Counter + 1 'Ansonsten Zählung
cell1.Offset(0, 2) = Counter
Exit For
End If
Weiter:
Next i
Else
Counter = Counter + 1 'Erste Zeile wird immer gezählt
cell1.Offset(0, 2) = Counter
End If
Next cell1
MsgBox "Zähler steht bei " & Counter
Set myRange = Nothing
Set myRange1 = Nothing
End Sub

Anzeige
AW: Zählen wenn, Zeitabhängigkeit
29.01.2019 10:17:02
Frank
Hallo Daniel,
Wahnsinn, vielen Dank für die tolle Arbeit - funktioniert super.
Klasse.
Gruß Frank.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige