Anzeige
Archiv - Navigation
1168to1172
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

Ungefähren Wert suchen

Ungefähren Wert suchen
Lars
Servus zusammen
Ich benutze dieses Makro,dass mir JogyB freundlicherweise gebastelt hat. Dazu habe ich aber nun noch wieder ein Problem.
Sub daTenKopieren()
Const paTh = "Q:\Objekt\Cleansorb Tower\Datenlog Evaluierung\Auswertungen\Tagesauswertung\"
Const datNameStart = "Auswertung "
Const logDatSp = 31
Const suchDatSp = 3 ' Spalte, in der das zu suchende Datum steht
Const firstLogRow = 3 ' erste Zeile in der Log-Datei, in der Werte stehen
Dim daTei As String
Dim zielWsh As Worksheet
Dim quellWsh As Worksheet
Dim dateNr As Long
Dim rowToCopy As Long
Dim i As Long
'1: Wert gefunden
'0: normal suchen
'-1: kann nicht gefunden werden, weil zu alt
'-2: letzte Datei geschlossen, keine Suche mehr
Dim staTe As Integer
'On Error GoTo errorHandler
daTei = Dir(paTh & datNameStart & "*")
' wenn es keine Logdateien gibt, dann gleich raus
If daTei = "" Then
MsgBox ("Keine Logdateien vorhanden!")
Exit Sub
' wenn es welche gibt, dann ScreenUpdating aus
' (dann flimmert der Bildschirm nicht)
' sowie die Zielarbeitsmappe und die erste
' Quellarbeitsmappe öffnen
Else
Application.ScreenUpdating = False
With ThisWorkbook
Set zielWsh = Worksheets.Add(, .Worksheets(.Worksheets.Count))
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Worksheets(1)
End If
' Läuft über die von Dir eingetragenen Datumswerte
' ich habe mal angenommen, dass die in Zeile 2 starten
' und im ersten Sheet dieser Arbeitsmappe liegen
' ACHTUNG: Diese müssen chronologisch geordnet sein!
With ThisWorkbook.Worksheets(1)
For dateNr = 2 To .Cells(.Rows.Count, suchDatSp).End(xlUp).Row
If IsDate(.Cells(dateNr, suchDatSp)) Then
' Solange Quelldaten da und im vorigen Durchlauf kein Fehler
While staTe = 0
On Error Resume Next
rowToCopy = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp)).Row
' wenn etwas gefunden, dann gibt es keinen Fehler
' also Zeile kopieren
If Err.Number = 0 Then
On Error GoTo errorHandler
quellWsh.Rows(rowToCopy).Copy zielWsh.Rows(dateNr)
staTe = 1
' Bei Fehler schauen, ob das Datum nach dem letzten Datum in der
' aktuell geöffneten Datei
Else
On Error GoTo errorHandler
' falls ja, nächste Datei öffnen, sofern vorhanden
If quellWsh.Cells(quellWsh.Rows.Count, logDatSp).End(xlUp).Value  "" Then
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Worksheets(  _
_
_
_
_
_
_
1)
Else
Set quellWsh = Nothing
staTe = -2
' Hier braucht kein Fehler eingetragen werden
' passiert weiter unten automatisch
End If
' falls nein, wurde der Wert nicht gefunden
Else
staTe = -1
End If
End If
Wend
' Wenn Fehler oder letzte Datei erreicht, dann Fehlereintrag
If staTe  -2 Then staTe = 0
' Wenn es kein Datum war, dann Fehlermeldung in Zieldatei
Else
zielWsh.Cells(dateNr, 1) = _
"''" & .Cells(dateNr, suchDatSp).Text & "' ist kein Datum!"
End If
Next
End With
' Wenn noch eine Quelldatei offen ist (state > -2), dann diese jetzt zu
If staTe > -2 Then quellWsh.Parent.Close False
' ScreenUpdating wieder ein
Application.ScreenUpdating = True
Exit Sub
endOnError:
On Error Resume Next
' Quelldatei zu
quellWsh.Parent.Close False
' Alles was an Applikationseinstellungen geändert wurde wieder zurück
Application.ScreenUpdating = True
Application.DisplayAlerts = True
' Fehlermeldung - ist jetzt nicht sonderlich schön gemacht,
' aber das richtig zu machen ist ein großer Aufwand
MsgBox ("Fehler aufgetreten bei Zeile " & dateNr & " und Datei '" & daTei & "'!" & _
vbNewLine & _
"Fehlermeldung: " & Err.Number & " - " & Err.Description)
Exit Sub
' Muss ich so machen, damit das On Error Resume Next bei endOnError funktioniert
errorHandler:
Resume endOnError
End Sub

Ich suche dort immer in Dateien nach einem Datum und kopiere dann die Zeile in meine Datei.
Das Datum ist in der Formatierung: 20.7.10 11:31:29
Nun habe ich festgestellt, dass in den zu suchenenden Werten die Sekundenangaben nicht immer mit denen der Frage übereinstimmen und manchmal variieren. Es gibt immer auch mehrere Datensätze pro Minute.
Wie kann ich denn nun einen Datensatz finden, der dort vorkommt?
Hoffe, ihr könnt mir helfen, vielen Dank.
Gruß
Lars

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Ungefähren Wert suchen
26.07.2010 14:39:47
JogyB
Hallo Lars,
das ist jetzt wirklich ein Problem. Wie groß ist denn die Abweichung? Und was ist der minimale Abstand zwischen zwei aufeinanderfolgenden Werten in den Log-Dateien?
Wenn ersteres bis zu 10s sind, letzteres aber nur 5s, dann wird es schwer, den korrekten Wert zu identifizieren. Oder ist das dann egal?
Gruß, Jogy
AW: Ungefähren Wert suchen
26.07.2010 14:44:51
Lars
Servus Jogy
Danke für deine schnelle Antwort, es müsste eigentlich reichen, wenn er die nächstspätere Uhrzeit nimmt. Kann man das irgendwie realisieren? Ansonsten ist die Abweichung recht willkürlich, von 1-15 Sekunden.
Gruß
Lars
AW: Ungefähren Wert suchen
26.07.2010 15:04:30
JogyB
Hallo Lars,
ich habe es jetzt mal eingebaut:
Sub daTenKopieren()
Const paTh = "c:\temp\test\" ' hier Deinen Pfad eintragen
Const datNameStart = "xxxx_" ' hier den Anfang Deiner Dateinamen eintragen
Const logDatSp = 31 ' Spalte, in der das Datum in der Logdatei steht
Const suchDatSp = 2 ' Spalte, in der das zu suchende Datum steht
Const firstLogRow = 2 ' erste Zeile in der Log-Datei, in der Werte stehen
Const unSchaerfe = 5 ' Abweichung in Sekunden, die auftreten kann
Dim daTei As String
Dim zielWsh As Worksheet
Dim quellWsh As Worksheet
Dim dateNr As Long
Dim i As Long
Dim foundCell As Range
Dim abWeichung As Long
'1: Wert gefunden
'0: normal suchen
'-1: kann nicht gefunden werden, weil zu alt
'-2: letzte Datei geschlossen, keine Suche mehr
Dim staTe As Integer
On Error GoTo errorHandler
daTei = Dir(paTh & datNameStart & "*")
' wenn es keine Logdateien gibt, dann gleich raus
If daTei = "" Then
MsgBox ("Keine Logdateien vorhanden!")
Exit Sub
' wenn es welche gibt, dann ScreenUpdating aus
' (dann flimmert der Bildschirm nicht)
' sowie die Zielarbeitsmappe und die erste
' Quellarbeitsmappe öffnen
Else
Application.ScreenUpdating = False
With ThisWorkbook
Set zielWsh = .Sheets.Add(, .Sheets(.Sheets.Count))
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Worksheets(1)
End If
' Läuft über die von Dir eingetragenen Datumswerte
' ich habe mal angenommen, dass die in Zeile 2 starten
' und im ersten Sheet dieser Arbeitsmappe liegen
' ACHTUNG: Diese müssen chronologisch geordnet sein!
With ThisWorkbook.Worksheets(1)
For dateNr = 2 To .Cells(.Rows.Count, suchDatSp).End(xlUp).Row
If IsDate(.Cells(dateNr, suchDatSp)) Then
' Solange Quelldaten da und im vorigen Durchlauf kein Fehler
While staTe = 0
' zuerst exakten Wert suchen
Set foundCell = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp))
' wenn nichts gefunden, dann unscharf suchen
If foundCell Is Nothing Then
For abWeichung = 1 To unSchaerfe
' zuerst in positive Richtung
Set foundCell = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp) + _
TimeSerial(0, 0, abWeichung))
' Wenn etwas gefunden, dann raus
If Not foundCell Is Nothing Then Exit For
' dann in negative Richtung
Set foundCell = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp) + _
TimeSerial(0, 0, -abWeichung))
' Wenn etwas gefunden, dann raus
If Not foundCell Is Nothing Then Exit For
Next
End If
' wenn etwas gefunden, dann Zeile kopieren
If Not foundCell Is Nothing Then
foundCell.EntireRow.Copy zielWsh.Rows(dateNr)
staTe = 1
' ansonsten schauen, ob das Datum nach dem letzten Datum in der
' aktuell geöffneten Datei liegt
' Hier braucht die Unschärfe nicht beachtet zu werden, da das letzte
' Datum nicht im Suchbereich liegen kann, da es sonst oben gefunden
' worden wäre. Ist der aktuelle Suchwert also größer, so liegt der letzte
' Wert unterhalb der unteren Suchgrenze und kann auch beim nächsten
' Suchwert nicht gefunden werden, da dieser größer ist.
' Bei einem kleineren Wert liegt der letzte Wert oberhalb der oberen
' Suchgrenze, der erste Wert der nächsten Datei ist noch höher. Also
' braucht noch nicht die Datei gewechselt werden.
Else
' falls ja, nächste Datei öffnen, sofern vorhanden
If quellWsh.Cells(quellWsh.Rows.Count, logDatSp).End(xlUp).Value  "" Then
Set quellWsh = _
Workbooks.Open(paTh & daTei, , True).Worksheets(1)
Else
Set quellWsh = Nothing
staTe = -2
' Hier braucht kein Fehler eingetragen werden
' passiert weiter unten automatisch
End If
' falls nein, wurde der Wert nicht gefunden
Else
staTe = -1
End If
End If
Wend
' Wenn Fehler oder letzte Datei erreicht, dann Fehlereintrag
If staTe  -2 Then staTe = 0
' Wenn es kein Datum war, dann Fehlermeldung in Zieldatei
Else
zielWsh.Cells(dateNr, 1) = _
"''" & .Cells(dateNr, suchDatSp).Text & "' ist kein Datum!"
End If
Next
End With
' Wenn noch eine Quelldatei offen ist (state > -2), dann diese jetzt zu
If staTe > -2 Then quellWsh.Parent.Close False
' ScreenUpdating wieder ein
Application.ScreenUpdating = True
Exit Sub
endOnError:
On Error Resume Next
' Quelldatei zu
quellWsh.Parent.Close False
' Alles was an Applikationseinstellungen geändert wurde wieder zurück
Application.ScreenUpdating = True
Application.DisplayAlerts = True
' Fehlermeldung - ist jetzt nicht sonderlich schön gemacht,
' aber das richtig zu machen ist ein großer Aufwand
MsgBox ("Fehler aufgetreten bei Zeile " & dateNr & " und Datei '" & daTei & "'!" &  _
vbNewLine & _
"Fehlermeldung: " & Err.Number & " - " & Err.Description)
Exit Sub
' Muss ich so machen, damit das On Error Resume Next bei endOnError funktioniert
errorHandler:
Resume endOnError
End Sub

Mit der Konstante unSchaerfe kannst Du die zulässige Abweichung in Sekunden angeben. Genommen wird der am wenigsten abweichende Wert, wobei Abweichungen in positive Richtung bevorzugt werden.
Gruß, Jogy
Anzeige
AW: Ungefähren Wert suchen
26.07.2010 15:36:54
Lars
Servus
Hab es mal so reinkopiert und den Anfang dementsprechend geändert. Er zeigt mir wieder ...nicht gefunden an. Mit den exakten manuell rausgesuchten Werten findet er die auch so wieder.
Gruß
Lars
AW: Ungefähren Wert suchen
26.07.2010 15:44:41
JogyB
Hallo Lars,
komisch, ich habe es mit Dummydaten mal so getestet und bei mir hat es die Werte gefunden, wenn die Abweichung im Rahmen der angegebenen Unschärfe war.
Kannst Du Beispieldaten hochladen, sonst kann ich schlecht nachvollziehen, was nun nicht klappt.
Gruß, Jogy
AW: Ungefähren Wert suchen
27.07.2010 08:47:41
Lars
Servus
Habe jetzt mal ein kleines Beispiel hochgeladen:
https://www.herber.de/bbs/user/70772.xls
Es geht da im Prinzip um die Daten links und rechts aussen. Die in der Mitte sind eigentlich ein anderes Problem. Was ich bisher nur ungenügend lösen konnte.
Links stehen nun die Ereignisse und die dazugehörige Zeit und ganz rechts sind die Zeiten, in denen gesucht wird. Am besten wäre es noch, wenn die entsprechende Zeit gesucht wird + 5 min. Und dann die nächste, weiss aber nicht, ob das möglich ist.
Gruß
Lars
Anzeige
AW: Ungefähren Wert suchen
27.07.2010 10:16:23
JogyB
Hallo Lars,
ich schaue es mir heute abend an (kann hier keine Dateien herunterladen).
Gruß, Jogy
AW: Ungefähren Wert suchen
28.07.2010 06:40:52
Lars
Schönen guten Morgen
Kann es sein, dass es ein Problem ist, dass das Datum mit der Uhrzeit in einer Zeile steht?
Gruß
Lars
AW: Ungefähren Wert suchen
29.07.2010 19:02:49
JogyB
Hallo Lars,
muss ich mir anschauen, bin jetzt nur nicht dazu gekommen. Mache es entweder heute oder morgen abend.
Gruß, Jogy
AW: Ungefähren Wert suchen
29.07.2010 23:21:27
JogyB
Hallo Lars,
teste es mal so:
Sub daTenKopieren()
Const paTh = "c:\temp\test\" ' hier Deinen Pfad eintragen
Const datNameStart = "xxxx_" ' hier den Anfang Deiner Dateinamen eintragen
Const logDatSp = 31 ' Spalte, in der das Datum in der Logdatei steht
Const suchDatSp = 2 ' Spalte, in der das zu suchende Datum steht
Const firstLogRow = 2 ' erste Zeile in der Log-Datei, in der Werte stehen
Const unSchaerfe = 300 ' Abweichung in Sekunden, die auftreten kann
Dim daTei As String
Dim zielWsh As Worksheet
Dim quellWsh As Worksheet
Dim dateNr As Long
Dim i As Long
Dim foundCell As Range
Dim abWeichung As Long
'1: Wert gefunden
'0: normal suchen
'-1: kann nicht gefunden werden, weil zu alt
'-2: letzte Datei geschlossen, keine Suche mehr
Dim staTe As Integer
On Error GoTo errorHandler
daTei = Dir(paTh & datNameStart & "*")
' wenn es keine Logdateien gibt, dann gleich raus
If daTei = "" Then
MsgBox ("Keine Logdateien vorhanden!")
Exit Sub
' wenn es welche gibt, dann ScreenUpdating aus
' (dann flimmert der Bildschirm nicht)
' sowie die Zielarbeitsmappe und die erste
' Quellarbeitsmappe öffnen
Else
Application.ScreenUpdating = False
With ThisWorkbook
Set zielWsh = .Sheets.Add(, .Sheets(.Sheets.Count))
End With
' Wird schreibgeschützt geöffnet, zur Problemvermeidung
Set quellWsh = Workbooks.Open(paTh & daTei, , True).Worksheets(1)
End If
' Läuft über die von Dir eingetragenen Datumswerte
' ich habe mal angenommen, dass die in Zeile 2 starten
' und im ersten Sheet dieser Arbeitsmappe liegen
' ACHTUNG: Diese müssen chronologisch geordnet sein!
With ThisWorkbook.Worksheets(1)
For dateNr = 2 To .Cells(.Rows.Count, suchDatSp).End(xlUp).Row
If IsDate(.Cells(dateNr, suchDatSp)) Then
' Solange Quelldaten da und im vorigen Durchlauf kein Fehler
While staTe = 0
' zuerst exakten Wert suchen
Set foundCell = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp), , xlFormulas) _
' wenn nichts gefunden, dann unscharf suchen
If foundCell Is Nothing Then
For abWeichung = 1 To unSchaerfe
' zuerst in positive Richtung
Set foundCell = _
quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp) + _
TimeSerial(0, 0, abWeichung), , xlFormulas)
' Wenn etwas gefunden, dann raus
If Not foundCell Is Nothing Then Exit For
' dann in negative Richtung - momentan draussen,
' Du willst ja nur positiv suchen
'                            Set foundCell = _
'                                quellWsh.Columns(logDatSp).Find(.Cells(dateNr, suchDatSp) + _
'                                TimeSerial(0, 0, -abWeichung), , xlFormulas)
' Wenn etwas gefunden, dann raus
If Not foundCell Is Nothing Then Exit For
Next
End If
' wenn etwas gefunden, dann Zeile kopieren
If Not foundCell Is Nothing Then
foundCell.EntireRow.Copy zielWsh.Rows(dateNr)
staTe = 1
' ansonsten schauen, ob das Datum nach dem letzten Datum in der
' aktuell geöffneten Datei liegt
' Hier braucht die Unschärfe nicht beachtet zu werden, da das letzte
' Datum nicht im Suchbereich liegen kann, da es sonst oben gefunden
' worden wäre. Ist der aktuelle Suchwert also größer, so liegt der letzte
' Wert unterhalb der unteren Suchgrenze und kann auch beim nächsten
' Suchwert nicht gefunden werden, da dieser größer ist.
' Bei einem kleineren Wert liegt der letzte Wert oberhalb der oberen
' Suchgrenze, der erste Wert der nächsten Datei ist noch höher. Also
' braucht noch nicht die Datei gewechselt werden.
Else
' falls ja, nächste Datei öffnen, sofern vorhanden
If quellWsh.Cells(quellWsh.Rows.Count, logDatSp).End(xlUp).Value  "" Then
Set quellWsh = _
Workbooks.Open(paTh & daTei, , True).Worksheets(1)
Else
Set quellWsh = Nothing
staTe = -2
' Hier braucht kein Fehler eingetragen werden
' passiert weiter unten automatisch
End If
' falls nein, wurde der Wert nicht gefunden
Else
staTe = -1
End If
End If
Wend
' Wenn Fehler oder letzte Datei erreicht, dann Fehlereintrag
If staTe  -2 Then staTe = 0
' Wenn es kein Datum war, dann Fehlermeldung in Zieldatei
Else
zielWsh.Cells(dateNr, 1) = _
"''" & .Cells(dateNr, suchDatSp).Text & "' ist kein Datum!"
End If
Next
End With
' Wenn noch eine Quelldatei offen ist (state > -2), dann diese jetzt zu
If staTe > -2 Then quellWsh.Parent.Close False
' ScreenUpdating wieder ein
Application.ScreenUpdating = True
Exit Sub
endOnError:
On Error Resume Next
' Quelldatei zu
quellWsh.Parent.Close False
' Alles was an Applikationseinstellungen geändert wurde wieder zurück
Application.ScreenUpdating = True
Application.DisplayAlerts = True
' Fehlermeldung - ist jetzt nicht sonderlich schön gemacht,
' aber das richtig zu machen ist ein großer Aufwand
MsgBox ("Fehler aufgetreten bei Zeile " & dateNr & " und Datei '" & daTei & "'!" & _
vbNewLine & _
"Fehlermeldung: " & Err.Number & " - " & Err.Description)
Exit Sub
' Muss ich so machen, damit das On Error Resume Next bei endOnError funktioniert
errorHandler:
Resume endOnError
End Sub
Das Problem ist, dass bei Datumswerten in Formeln (xlFormulas) gesucht werden muss. War mir so jetzt nicht bewusst. Das Gemeine daran ist, dass Excel sich die letzte Einstellung merkt, d.h. wenn man zuvor "in Formeln" gesucht hat es auch ohne die Angabe im Find-Befehl geht. Deswegen lief das bei mir auch einwandfrei.
Gruß, Jogy
Anzeige
AW: Ungefähren Wert suchen
02.08.2010 09:54:09
Lars
Servus Jogy
Es funktioniert prima. Vielen Dank für deine Hilfe. Sowas hätte ich allein nie hinbekommen.
Der einzige Wermutstropfen ist, dass es so ne halbe Stunde rechnet dann. Aber immer noch viel besser als es selbst rauszusuchen.
Vielen Dank!
Gruß
Lars

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige