AW: Liste - Zeitraum vor bestimmtem Eintrag
03.02.2023 21:13:06
Yal
Hallo Michael,
in deinem Bespiel gibt es in Zeile 30 einen Eintrag "18:36:26", was in der "Minute vor Fehler" liegt, obwohl er nach dem Fehler liegt. Diese wird von deiner Lösung nicht gefunden. Daher ist es bei Dir wichtig, dass die Zeiten vorher sortiert werden (ich gehe aber davon aus, dass diese Protokoll "aus der Maschine" und dementsprechend sortiert ist).
Piet hat in seiner Excel-Version 2013 keine "intelligente" Tabelle (VBA: ListObject) und könnte nicht darauf bauen. Ich habe mir den Spass damit zu basteln.
Folgender Code ist sehr Objekt-orientiert (Lo, Z, T). Überall, wo es geht, wird das Objekt (z.B. Zelle) anstatt nur ein seinen Eigenschaften (.Value) mitgenommen.
Sub Suchen()
Dim Eingabe As String
Dim Lo As ListObject
Dim Treffer As String
Dim Z, T
Const cLoName = "Tabelle1"
Set Lo = Worksheets("Input").ListObjects(1)
Eingabe = InputBox("Bitte Fehler Text eingeben", , "XYZ")
If Eingabe = Empty Then Exit Sub
Worksheets("Input").Range("H3:I1002").ClearContents 'Rückgabe-Bereich leeren (anpassen)
Application.ScreenUpdating = False
Treffer = TrefferListe(Lo, Eingabe, 2, 1)
If Len(Treffer) = 0 Then GoTo Exitus
For Each Z In Lo.ListColumns(1).DataBodyRange
For Each T In Split(Treffer, ";")
If Z.Value >= (CDate(T) - TimeSerial(0, 1, 0)) And Z.Value = CDate(T) Then
Worksheets("Input").Cells(Rows.Count, "H").End(xlUp).Offset(1).Resize(1, 2) = Z.Resize(1, 2).Value 'anpassen
Exit For
End If
Next
Next
Exitus:
Application.ScreenUpdating = True
End Sub
Private Function TrefferListe(Lo As ListObject, SuchText As String, SuchLOSpalte As Long, Optional LeseLOSpalte As Long) As String
Dim Z As Range
If Lo.AutoFilter.FilterMode Then Lo.AutoFilter.ShowAllData 'Filter reset
Lo.Range.AutoFilter Field:=SuchLOSpalte, Criteria1:="=*" & SuchText & "*" 'filtern
'Gibt es Treffer? Nicht wenn die sichbare Zelle nur die Header-Zelle sind (die bleiben sichtbar)
If Lo.Range.SpecialCells(xlCellTypeVisible).Count > Lo.HeaderRowRange.Cells.Count Then
If LeseLOSpalte = 0 Then LeseLOSpalte = SuchLOSpalte 'weil LeseLOSpalte optional ist
For Each Z In Lo.ListColumns(LeseLOSpalte).DataBodyRange.SpecialCells(xlCellTypeVisible)
TrefferListe = TrefferListe & ";" & Z.Cells(1).Value 'Gefundenen Element sammeln
Next
TrefferListe = Mid(TrefferListe, 2) 'ohne den führende Semikolon
End If
Lo.AutoFilter.ShowAllData
End Function
VG
Yal